Dannazione, mi amo un po 'di raggrinzimento, ma non sono d'accordo con la complessità / fragilità del trasporto dei parametri dell'attività e dell'area ( adminhtml | crontab | frontend | global | install ) in una coda, specialmente se quella coda verrà eseguita un contesto Magento. Se ci sono contesti misti che devono essere gestiti, la soluzione in coda è una reimplementazione dell'attuale "problema"!
Penso che l'approccio in coda sia fragile. La mia tesi è che il caricamento prematuro delle aree degli eventi non è affatto un problema. Per spiegare questo, facciamo un backup e guardiamo al problema:
Qual è il pericolo di caricare prematuramente un'area eventi in un ambito di esecuzione?
Per capirlo dobbiamo esaminare le aree degli eventi nel contesto dell'esecuzione. Matthias, immagino che tu lo sappia già, ma per l'edificazione degli altri:
Gli script di impostazione dei dati vengono eseguiti Mage_Core_Model_App::run()
prima dell'invio della richiesta al 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;
}
Quando gli script di impostazione dei dati vengono eseguiti, l' area degli eventi globali viene caricata. Le aree degli eventi contestuali di routing ( frontend o adminhtml ) vengono caricate in seguito in Mage_Core_Controller_Varien_Action::preDispatch()
seguito alla corrispondenza del router con un'azione del controller (il area
nome viene impostato tramite ereditarietà):
public function preDispatch()
{
//...
Mage::app()->loadArea($this->getLayout()->getArea());
//...
}
Quindi normalmente durante l'inizializzazione dell'app verranno eseguiti solo gli osservatori configurati nell'area degli eventi globali . Se lo script di installazione fa qualcosa del genere
$this->loadAreaPart(Mage_Core_Model_App_Area::AREA_ADMINHTML, Mage_Core_Model_App_Area::PART_EVENTS);
quindi ci sono solo due pericoli:
- Un osservatore è stato configurato in modo errato in adminhtml per osservare un evento senza contesto come
controller_front_init_before
ocontroller_front_init_routers
- La richiesta è una richiesta frontend .
Il numero 1 dovrebbe essere facile da sostenere. # 2 è la vera preoccupazione, e penso che Reflection possa risolvere il problema (nota che sono terribilmente inesperto nell'uso di 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()
Non l'ho provato, ma rimuove l'indice degli eventi adminhtml e l' Mage_Core_Model_App_Area
oggetto corrispondente .