2015-12-28 2 views
1

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


У меня есть процесс входа для администратора, который определен в module.php, как показано ниже: в onBootstrap 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 module, функция Admin-модуля beforeDispatch запущена. Я также попытался определить другую функцию внутри модуля Front без содержимого внутри, чтобы он не мог объединить его.


Я написал другую 404 шаблон для обоих модулей, но шаблон фронта работает. Вот код .:

'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

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

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

Что о первой задаче? –

+0

Это поведение в порядке, и вы не должны его изменять. Внутри функции beforeDispatch() вы должны обходить логику для модуля Front, например. if ($ module! == 'front') {return true; } в противном случае выполнить код ... – tasmaniski