предотвратить слияние двух конфигураций модуля в Zend Framework 2

У меня есть два модуля в моем приложении ZF2, оба модуля имеют разную конфигурацию для себя, и оба модуля имеют разные Module.php с различной конфигурацией внутри.


У меня есть процесс входа в систему для администратора, который определяется в Module.php, как показано ниже:
в функции onBootstrap:

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-модуля перед запуском запуска. Я также попытался определить другую функцию внутри модуля Front без содержимого внутри, чтобы он не мог объединить его.


2

Я написал разные шаблоны 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',
),
),

оба файла находятся внутри его папки модуля с одинаковой структурой.
В: Как предотвратить слияние одной конфигурации модуля с другой?

1

Решение

Вы не должны предотвращать слияние. Существует аналогичная проблема с загрузкой разного макета для 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);
}
});
}
2

Другие решения

После долгих поисков я получил решение своего вопроса.
Основной проблемой было получение имени модуля. вот мой код
Я сгенерировал это с помощью 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
}
}
-2

По вопросам рекламы [email protected]