У меня есть два модуля в моем приложении ZF2, оба модуля имеют разную конфигурацию для себя, и оба модуля имеют разные Module.php с различными настройками внутри него.
У меня есть логин для Admin, который определен в Module.php, как показано ниже: inBootstrap funtion:
public function onBootstrap($e) { $e->getApplication()->getEventManager()->getSharedManager()->attach('Zend\Mvc\Controller\AbstractActionController', 'dispatch', function($e) { $controller = $e->getTarget(); $controllerClass = get_class($controller); $moduleNamespace = substr($controllerClass, 0, strpos($controllerClass, '\\')); if ('Admin' === $moduleNamespace) { $controller->layout('layout/admin'); } }, 100); $application = $e->getApplication(); $eventManager = $application->getEventManager(); .......... .......... $eventManager->attach(MvcEvent::EVENT_DISPATCH, array($this, 'boforeDispatch'), 100); }
функция boforeDispatch, которая вызывается внутри onBootstrap
для проверки процесса входа в систему
function boforeDispatch(MvcEvent $event) { ...... //did something ...... }
Всякий раз, когда я собираюсь запустить Front-модуль, функция Admin-модуля beforeDispatch запущена. Я также попытался определить другую функцию внутри модуля Front без содержимого внутри, чтобы он не мог объединить его.
Я написал несколько 404 шаблонов для обоих модулей, но работает шаблон Front. Вот код .:
'view_manager' => array( 'display_not_found_reason' => true, 'display_exceptions' => true, 'doctype' => 'HTML5', 'not_found_template' => 'error/404', 'exception_template' => 'error/index', 'template_map' => array( 'layout/front' => __DIR__ . '/../view/layout/layout.phtml', 'front/index/index' => __DIR__ . '/../view/front/index/index.phtml', 'error/404' => __DIR__ . '/../view/error/404.phtml', 'error/index' => __DIR__ . '/../view/error/index.phtml', ), 'template_path_stack' => array( __DIR__ . '/../view', ), ),
оба файла находятся в папке с той же структурой. В: Как предотвратить слияние конфигурации одного модуля с другим?
Вы не должны препятствовать слиянию. Аналогичная проблема связана с загрузкой разного макета для 2 модулей – посмотрите https://stackoverflow.com/a/11921330/949273
К сожалению, ваша проблема несколько противоречива, потому что, если у вас есть страница 404, нет способа узнать, что это за модуль – из-за этого он называется 404 страницей не найден .
В любом случае вы можете отправить событие MvcEvent :: EVENT_DISPATCH_ERROR и проверить с помощью URL регулярного выражения и установить другой файл представления.
Пример кода
в конфигурации вашего администратора
'template_map' => array( 'error-admin/404' => __DIR__ . '/../view/error/404.phtml', ),
чем на EVENT_DISPATCH_ERROR, введите свою логику
public function onBootstrap(MvcEvent $e) { $app = $e->getTarget(); $em = $app->getEventManager(); $em->attach(MvcEvent::EVENT_DISPATCH_ERROR, function (\Zend\Mvc\MvcEvent $e) { $app = $e->getParam('application'); $uri = $app->getRequest()->getUri()->getPath(); if(strpos($uri, '/admin') === 0){ $view = new \Zend\View\Model\ViewModel(); $view->setTemplate('error-admin/404'); $e->setViewModel($view); } }); }
После многих поисков я получил решение своего вопроса. Основная проблема заключалась в получении имени модуля. вот мой код. Я сгенерировал его с помощью MvcEvent::getRouteMatch()->getParam()
function boforeDispatch(MvcEvent $event) { $controller = $event->getRouteMatch()->getParam('controller'); $request_module = substr($controller, 0, strpos($controller, '\\')); if ($request_module == __NAMESPACE__) { //do stuff } }