Вот в чем проблема... Каково ваше определение "активного модуля"? В ZF2 модуль свободно определяется пространством имен верхнего уровня, но даже это не является абсолютным, поскольку модули могут предоставлять код в нескольких пространствах имен, если они того пожелают.
Я написал сообщение в блоге о настройке макетов для конкретных модулей, где я объясняю эту проблему более подробно, а также демонстрирую одно возможное «решение» для выполнения действий на основе активного модуля: http://blog.evan.pro/module-specific-layouts-in-zend-framework-2 а>
В этом примере я присоединяюсь к событию «отправка» с идентификатором события, который представляет собой имя модуля (пространство имен), которое запускается только для пространства имен верхнего уровня диспетчеризируемого контроллера (я специально добавил эту функцию в ZF2 , так как это стало частым вопросом в период бета-тестирования). Если вам интересно, как и почему это работает, см. https://github.com/zendframework/zf2/blob/master/library/Zend/Mvc/Controller/AbstractController.php#L153-159 (в частности, строка 158 на момент написания этого).
В качестве альтернативы вы можете подключиться к событию отправки и получить пространство имен верхнего уровня отправляемого контроллера. Опять же, нет никакой гарантии, что это на самом деле «имя модуля», которое вы ищете, и лучше просто думать о контроллерах и действиях, когда дело доходит до диспетчеризации запросов, а не «какой это модуль?»
class Module
{
public function onBootstrap($e) {
$events = $e->getApplication()->getEventManager()->getSharedManager();
$events->attach('Zend\Mvc\Controller\AbstractActionController', 'dispatch', function($e) {
$controllerClass = get_class($e->getTarget()); // $e->getTarget() is the controller
$controllerTopNamespace = substr($controllerClass, 0, strpos($controllerClass, '\\'))
// Do whatever here, maybe something like:
// $nav = $e->getTarget()->getServiceLocator()->get('navigation');
// $nav->...
});
}
}
person
EvanDotPro
schedule
15.10.2012