Dammit ฉันรักฉัน philwinkle แต่ฉันไม่เห็นด้วยกับความซับซ้อน / ความเปราะบางของการขนส่งพารามิเตอร์งานและพื้นที่ ( adminhtml | crontab | frontend | global | ติดตั้ง ) ไปยังคิวโดยเฉพาะถ้าคิวนั้นจะถูกดำเนินการ บริบทวีโอไอพี หากมีบริบทผสมที่ต้องการการจัดการการแก้ปัญหาคิวคือการนำ "ปัญหา" มาใช้ใหม่!
ฉันคิดว่าวิธีการเข้าคิวนั้นเปราะ ข้อโต้แย้งของฉันคือการโหลดพื้นที่กิจกรรมก่อนกำหนดไม่ใช่ปัญหาจริงๆ เพื่ออธิบายสิ่งนี้ลองสำรองและดูปัญหา:
อันตรายของการโหลดพื้นที่กิจกรรมก่อนกำหนดในขอบเขตการดำเนินการคืออะไร?
เพื่อทำความเข้าใจนี้เราต้องตรวจสอบพื้นที่กิจกรรมในบริบทการดำเนินการ แมทเธียสชฉันนึกว่าคุณรู้เรื่องนี้อยู่แล้ว แต่เพื่อคนอื่น
สคริปต์การตั้งค่าข้อมูลจะดำเนินการMage_Core_Model_App::run()
ก่อนที่จะส่งคำขอไปยัง Front Controller:
public function run($params)
{
$options = isset($params['options']) ? $params['options'] : array();
$this->baseInit($options);
Mage::register('application_params', $params);
if ($this->_cache->processRequest()) {
$this->getResponse()->sendResponse();
} else {
$this->_initModules();
//Global event area is loaded here
$this->loadAreaPart(Mage_Core_Model_App_Area::AREA_GLOBAL, Mage_Core_Model_App_Area::PART_EVENTS);
if ($this->_config->isLocalConfigLoaded()) {
$scopeCode = isset($params['scope_code']) ? $params['scope_code'] : '';
$scopeType = isset($params['scope_type']) ? $params['scope_type'] : 'store';
$this->_initCurrentStore($scopeCode, $scopeType);
$this->_initRequest();
//Data setup scripts are executed here:
Mage_Core_Model_Resource_Setup::applyAllDataUpdates();
}
$this->getFrontController()->dispatch();
}
return $this;
}
โดยสคริปต์การตั้งค่าข้อมูลเวลากำลังดำเนินการโหลดพื้นที่เหตุการณ์ทั่วโลก พื้นที่กิจกรรมการกำหนดเส้นทางตามบริบท ( frontendหรือadminhtml ) ถูกโหลดในภายหลังMage_Core_Controller_Varien_Action::preDispatch()
เนื่องจากเราเตอร์จับคู่การกระทำของตัวควบคุม ( area
ชื่อถูกตั้งค่าผ่านการสืบทอด):
public function preDispatch()
{
//...
Mage::app()->loadArea($this->getLayout()->getArea());
//...
}
ดังนั้นตามปกติในระหว่างการเตรียม app เฉพาะผู้สังเกตการณ์การกำหนดค่าภายใต้โลกพื้นที่จัดกิจกรรมที่จะดำเนินการ หากสคริปต์การตั้งค่าทำบางสิ่งเช่น
$this->loadAreaPart(Mage_Core_Model_App_Area::AREA_ADMINHTML, Mage_Core_Model_App_Area::PART_EVENTS);
จากนั้นมีเพียงสองอันตราย:
- ผู้สังเกตการณ์ได้รับการกำหนดค่าอย่างไม่ถูกต้องภายใต้adminhtmlเพื่อสังเกตเหตุการณ์ที่ไม่เกิดบริบทเช่น
controller_front_init_before
หรือcontroller_front_init_routers
- คำขอคือคำขอส่วนหน้า
# 1 ควร grep ง่าย # 2 เป็นความกังวลที่แท้จริงและฉันคิดว่า Reflection สามารถแก้ปัญหาได้ (โปรดทราบว่าฉันไม่มีประสบการณ์ในการใช้การสะท้อนกลับ):
<?php
//Start setup script as normal
$installer = $this;
$installer->startSetup()
//Load adminhtml event area
Mage::app()->loadAreaPart(
Mage_Core_Model_App_Area::AREA_ADMINHTML,
Mage_Core_Model_App_Area::PART_EVENTS
);
// your setup script logic here
//I hope this isn't a bad idea.
$reflectedApp = new ReflectionClass('Mage_Core_Model_App');
$_areas = $reflectedApp->getProperty('_areas');
$_areas->setAccessible(true);
$areas = $_areas->getValue(Mage::app());
unset($areas['adminhtml']);
$_areas->setValue(Mage::app(),$areas); //reset areas
//End setup script as normal
$installer->endSetup()
ฉันไม่ได้ทำการทดสอบนี้ แต่มันจะลบดัชนีเหตุการณ์ adminhtml และMage_Core_Model_App_Area
วัตถุที่เกี่ยวข้อง