Как предотвратить проблемы с установкой расширения при включении режима компиляции
-
16-10-2019 - |
Вопрос
У меня есть расширение, которое прослушивает событие core_layout_block_create_after.Это может быть любое событие, которое срабатывает в администраторе Magento.Также у меня есть экземпляр magento с включенным режимом компилятора.Я установил расширение через magentoconnect.Установка прошла успешно, кэш очищен.Теперь, вернувшись обратно к администратору, я получу ошибку:
Mage registry key "_singleton/extension/observer" already exists
/var/www/magento/trunk/app/Mage.php(222): Mage::throwException('Mage registry k...')
/var/www/magento/trunk/app/Mage.php(476): Mage::register('_singleton/exte...', false)
/var/www/magento/trunk/includes/src/__default.php(21023): Mage::getSingleton('extension...')
/var/www/magento/trunk/app/Mage.php(447): Mage_Core_Model_App->dispatchEvent('core_layout_blo...', Ar
ray)
/var/www/magento/trunk/includes/src/__default.php(27297): Mage::dispatchEvent('core_layout_blo...', A
rray)
/var/www/magento/trunk/includes/src/__default.php(27310): Mage_Core_Model_Layout->createBlock('adminh
tml/page', 'root')
/var/www/magento/trunk/includes/src/__default.php(27077): Mage_Core_Model_Layout->addBlock('adminhtml
/page', 'root')
/var/www/magento/trunk/includes/src/__default.php(27043): Mage_Core_Model_Layout->_generateBlock(Obje
ct(Mage_Core_Model_Layout_Element), Object(Mage_Core_Model_Layout_Element))
/var/www/magento-demo/trunk/includes/src/__default.php(13507): Mage_Core_Model_Layout->generateBlocks()
/var/www/magento/trunk/includes/src/__default.php(13432): Mage_Core_Controller_Varien_Action->generat
eLayoutBlocks()
/var/www/magento/trunk/includes/src/Mage_Adminhtml_Controller_Action.php(275): Mage_Core_Controller_Varien_Action->loadLayout(NULL, true, true)
/var/www/magento/trunk/app/code/core/Mage/Compiler/controllers/Adminhtml/Compiler/ProcessController.
php(59): Mage_Adminhtml_Controller_Action->loadLayout()
/var/www/magento/trunk/includes/src/__default.php(13582): Mage_Compiler_Adminhtml_Compiler_ProcessController->indexAction()
/var/www/magento/trunk/includes/src/__default.php(17927): Mage_Core_Controller_Varien_Action->dispatch('index')
/var/www/magento/trunk/includes/src/__default.php(17484): Mage_Core_Controller_Varien_Router_Standar
d->match(Object(Mage_Core_Controller_Request_Http))
/var/www/magento/trunk/includes/src/__default.php(20061): Mage_Core_Controller_Varien_Front->dispatch()
/var/www/magento/trunk/app/Mage.php(683): Mage_Core_Model_App->run(Array)
/var/www/magento/trunk/index.php(87): Mage::run('', 'store')
Решение 3
Мне жаль ответить так поздно, но я хочу описать, как я исправил эту ошибку. Проблема заключалась в том, что мой наблюдатель был прикреплен в глобальной области, чтобы core_layout_block_create_after
событие, которое стреляет в обеих областях (Frontend, Admin).
После установки во время компиляции режим включения кэш был очищен. Но код не перекомпилировался во время установки. Это означает, что после возвращения обратно я не смог получить доступ к администратору и повторно заново. Я мог бы сделать это только из консоли.
Поскольку мне нужно было наблюдать за этим событием только для области фронта, я только что переместил инициализацию наблюдателя. И проблема была исправлена.
Мои советы не инициализируют наблюдателей в глобальном объеме для событий, которые работают на каждой странице администратора.
Другие советы
Единственный способ, которым я считаю возможным постоянно избегать этого, - это отключить режим компиляции. до установка/внесение любых изменений кода.Вам также потребуется повторно запустить процесс компиляции после установки.Простое повторное включение приведет к той же проблеме.
Основная проблема заключается в том, что при включенном режиме компиляции Magento анализирует новые файлы config.xml, но будет искать классы только по пути include/.Когда вы устанавливаете новое расширение, новые файлы помещаются в стандартные пути Magento и не обнаруживаются Magento.
Если бы расширение включало файлы как в скомпилированном, так и в нескомпилированном состоянии, это можно было бы предотвратить.Процедуры установки sql также не являются частью скомпилированного состояния и могут использоваться для изменения путей включения PHP (это кажется довольно хакерским).
Я считаю такое поведение недосмотром в реализации режима компиляции Magento - варианты, которые имели бы смысл: 1.) изменение конфигурации делает режим компиляции недействительным 2.) конфигурация также компилируется для обеспечения согласованного сайта
Вам нужно будет повторно запустить компилятор через систему> «Инструменты»> «Компиляция».