2013-04-04 2 views
2

У меня возникла странная проблема. Если у меня есть 1 модуль, мои маршруты правильно совпадают и страницы возвращаются. Добавьте еще один модуль в конфигурацию приложения и BANG - он перестает работать и заканчивается в Module.php моего второго модуля (который имеет расширенную загрузку и запускает множество событий).ZF2 новый модуль разрывает маршрут

application.config.php

<?php 
return array(
    'modules' => array(  
     'CMS', 
     'AOCS', 
    ), 
    'module_listener_options' => array(
     'config_glob_paths' => array(
      'config/autoload/{,*.}{global,local}.php', 
     ), 
     'module_paths' => array(
      './module', 
      './vendor', 
     ), 
    ), 
); 

CMS модуль конфигурации

<?php 
return array(
    'router' => array(
     'routes' => array(     
      'Admin' => array(  
       'type' => 'Literal', 
       'options' => array(
        'route' => '/admin', 
        'defaults' => array(
         '__NAMESPACE__' => 'CMS\Controller', 
         'controller' => 'Index', 
         'action'  => 'Login', 
        ), 
       ), 
       'may_terminate' => true, 
      ), 
      'Logout' => array(  
       'type' => 'Literal', 
       'options' => array(
        'route' => '/logout', 
        'defaults' => array(
         '__NAMESPACE__' => 'CMS\Controller', 
         'controller' => 'Index', 
         'action'  => 'Logout', 
        ), 
       ), 
      ),          
      'CMS/Welcome' => array(
       'type' => 'Literal', 
       'options' => array(
        'route' => '/aocs/welcome', 
        'defaults' => array(
         '__NAMESPACE__' => 'AOCS\Controller', 
         'controller' => 'Welcome', 
         'action'  => 'Welcome', 
        ), 
       ),     
      ),      
     ), 
    ), 
    'controllers' => array(
     'invokables' => array(
      'CMS\Controller\Index' => 'CMS\Controller\IndexController', 
     ), 
    ), 
    'translator' => array(
     'locale' => 'en_GB',   
    ),  
    '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/layout'   => __DIR__ . '/../templates/admin.phtml', 
      'error/404'    => __DIR__ . '/../view/error/404.phtml', 
      'error/index'    => __DIR__ . '/../view/error/index.phtml',   
     ), 
     'template_path_stack' => array(
      __DIR__ . '/../view', 
     ),  
    ), 
); 

модуль AOCS конфигурации

<?php 
return array(
    'router' => array(
     'routes' => array(           
      'Welcome' => array(
       'type' => 'Literal', 
       'options' => array(
        'route' => '/welcome', 
        'defaults' => array(
         '__NAMESPACE__' => 'AOCS\Controller', 
         'controller' => 'Welcome', 
         'action'  => 'Welcome', 
        ), 
       ),     
      ),    
      'Mains' => array(
       'type' => 'segment', 
       'options' => array(
        'route' => '/aocs[/:controller][/:action][/:id]', 
        'defaults' => array(
         '__NAMESPACE__' => 'AOCS\Controller', 
         'controller' => 'Welcome', 
         'action'  => 'Welcome', 
        ),     
       ), 
       'may_terminate' => true, 
       'child_routes' => array(
        'query' => array(
         'type' => 'Query', 
        ), 
       ),            
      ),    

     ), 
    ), 
    'navigation' => array(
     'menu' => array(
      'page-1' => array(
       'label' => 'Logout', 
       'route' => 'Logout', 
       'resource' => 'aocs_index_logout' 
      ), 
      'page-2' => array(
       'label' => 'Login', 
       'route' => 'Admin' , 
       'resource' => 'cms_index_login' 
      ), 
     ), 
    ),  
    'service_manager' => array(
     'factories' => array(
      'menu' => 'AOCS\Navigation\MenuNavigationFactory' 
     ), 
    ), 
    'controllers' => array(
     'invokables' => array(
      'AOCS\Controller\Welcome' => 'AOCS\Controller\WelcomeController' 
     ), 
    ), 
    'translator' => array(
     'locale' => 'en_GB',   
    ),  
    '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/layout'   => __DIR__ . '/../templates/admin.phtml', 
      'error/404'    => __DIR__ . '/../view/error/404.phtml', 
      'error/index'    => __DIR__ . '/../view/error/index.phtml',   
     ), 
     'template_path_stack' => array(
      __DIR__ . '/../view', 
     ), 
     /*'strategies' => array(
      'ViewJsonStrategy', 
     ),*/   
    ), 
); 

module.php от CMS

<?php 
/** 
* Zend Framework (http://framework.zend.com/) 
* 
* @link  http://github.com/zendframework/ZendSkeletonApplication for the canonical source repository 
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com) 
* @license http://framework.zend.com/license/new-bsd New BSD License 
*/ 

namespace CMS; 

use Zend\Mvc\ModuleRouteListener; 
use Zend\Mvc\MvcEvent; 
use Zend\View\Renderer\JsonRenderer; 
use Zend\Di\Di;   
use Zend\Config\Reader\Ini; 
use Zend\Navigation\Navigation; 

// AH core code 
use Core\Classes\setDB; 
use Core\Classes\setCache; 
use Core\Models\SecurityModel; 
use Core\Models\AclModel; 

class Module 
{ 
    public function onBootstrap(MvcEvent $e) 
    { 
     $sm = $e->getApplication()->getServiceManager(); 

     $eventManager  = $e->getApplication()->getEventManager(); 
     $moduleRouteListener = new ModuleRouteListener(); 
     $moduleRouteListener->attach($eventManager);  

     // Set config - required throughout 
     $reader = new Ini; 
     $sm->setService('configIni',$reader->fromFile('./config/application.ini'));   

     // Setup a Database connection 
     $sm->setService('setDB',new setDB($sm,'database')); 

     // Setup Caching 
     $sm->setService('setCache',new setCache($sm)); 

     /*$eventManager->attach('dispatch', function ($sm) use ($controllers) { 
      print'<pre>[CMS]';print_r($sm->getRouteMatch());print'</pre>'; 
      exit;   
     }, 100); // execute before executing action logic*/   

     // Assign system names to view models so we can set across templates 
     $view = $e->getViewModel(); 
     $config = $sm->get('configIni'); 
     $view->setVariable('systemname',$config['system']['name']); 
     $view->setVariable('systemshort',$config['system']['shortname']);        
    }  

    public function getConfig() 
    { 
     return include __DIR__ . '/config/module.config.php'; 
    } 

    public function getAutoloaderConfig() 
    { 
     return array(
      'Zend\Loader\StandardAutoloader' => array(
       'namespaces' => array(
        __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__, 
       ), 
      ), 
     ); 
    } 
} 

Я пропустил что-то очевидное? Это действительно раздражает!

Благодаря

Antony

+0

Можете ли вы дать нам более конкретную информацию о BANG :). Что вы получаете как исключение или ошибку. –

+0

Между тем, две вещи, которые следует учитывать. (1) Вы не можете использовать косую черту '/' в названии маршрута. Эта черта используется для перехода к дочерним маршрутам. (2) Последняя версия ZF2 не одобрила маршрут запроса (r), поэтому вы больше не можете использовать '' query '=> array (' type '=>' Query ') '(модуль AOCS все еще имеет его). –

ответ

0

Fixed его!

BANG было то, что у меня есть отправка в 2x Modules.php, который по какой-то причине запускался автоматически. Поскольку второй проверял, зарегистрирован ли пользователь, и они не перенаправлялись, вызывая проблемы.

Проблема не связана с моей конфигурацией (если я не вижу очевидного), что это ошибка в ZF2, где события отправки не привязаны к модулю, из которого они вызываются, но все получают запускается автоматически.

Итак, если моя страница находится в CMS-модуле, модули AOCS> bootstrap все еще запущены. Зачем??

Спасибо за вопрос о типе = Запрос - будет обновлен.

+0

Модуль ModuleManager загружает каждый модуль и вызывает onBootstrap() для каждого модуля, который поставляет его, независимо от того, будет ли это модуль, который будет отправлен в конечном итоге, но это не проблема. Если вы хотите, чтобы ваш слушатель прослушал свое событие диспетчера диспетчеров, см. Сообщение в блоге Evan Coury, посвященное модулю. http://blog.evan.pro/module-specific-layouts-in-zend-framework-2 Принцип тот же, прислушиваясь к событию отправки, когда его запускают определенные контроллеры (модули) – Crisp