Lanet olsun, bana bazı philwinkle seviyorum, ama görev parametrelerini ve alanı ( adminhtml | crontab | frontend | global | install ) bir kuyruğa taşımanın karmaşıklığına / kırılganlığına katılmıyorum , özellikle de bu kuyruk yürütülecekse Magento bağlamı. Ele alınması gereken karışık bağlamlar varsa, kuyruk çözümü mevcut "sorunun" yeniden uygulanmasıdır!
Bence kuyruk yaklaşımı kırılgandır. Benim iddiam, olay alanlarını erken yüklemenin gerçekten bir sorun olmadığıdır. Bunu açıklamak için, geri dönelim ve soruna bakalım:
Bir olay alanını erken yürütme kapsamında yükleme tehlikesi nedir?
Bunu anlamak için, yürütme bağlamındaki olay alanlarını incelemeliyiz. Matthias, bunu zaten bildiğini sanıyorum, ama başkalarının kurguları için:
Veri kurulum komut dosyaları Mage_Core_Model_App::run()
, isteği Ön Denetleyiciye göndermeden önce yürütülür :
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;
}
Veri kurulum komut dosyaları yürütülürken global olay alanı yüklenir. Yönlendirme bağlamsal olay alanları ( ön uç veya adminhtml ), Mage_Core_Controller_Varien_Action::preDispatch()
bir denetleyici eylemiyle eşleşen yönlendiricinin bir sonucu olarak yüklenir ( area
ad, devralma yoluyla ayarlanır):
public function preDispatch()
{
//...
Mage::app()->loadArea($this->getLayout()->getArea());
//...
}
Bu nedenle normalde uygulama başlatma sırasında yalnızca global olay alanı altında yapılandırılan gözlemciler yürütülür. Kurulum betiği aşağıdaki gibi bir şey yaparsa
$this->loadAreaPart(Mage_Core_Model_App_Area::AREA_ADMINHTML, Mage_Core_Model_App_Area::PART_EVENTS);
o zaman sadece iki tehlike vardır:
- Gözlemci altında yanlış yapılandırmadığınızdan edilmiş adminhtml bir bağlam az etkinlik gözlemlemek gibi
controller_front_init_before
ya dacontroller_front_init_routers
- İstek bir ön uç isteğidir.
# 1 için grep kolay olmalı. # 2 asıl endişe ve Yansıma'nın sorunu çözebileceğini düşünüyorum.
<?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()
Bunu test etmedim, ancak adminhtml olay dizinini ve ilgili Mage_Core_Model_App_Area
nesneyi kaldırır .