2011-12-31 7 views
7

У меня есть questiom относительно в Zend Framework 2:ZF2: Dependency Injection, MVC, Конфигурация и Bootstrap

У меня есть библиотеки/System и библиотека/Zend. система - это моя пользовательская библиотека, которую я хочу настроить для применения (маршруты, модули и т. д.) и перенаправить пользователя на исправление модуля, контроллера и/или действия).

Я не хочу делать это внутри каждого приложения/модулей/ModuleName/Module.php. Итак, моя библиотека/Система может делать все, что связано с конфигурацией приложения.

+0

Вы попытались получить доступ к маршрутизатору напрямую (Zend \ Mvc \ Application.getRouter())? – Fge

+0

Возвратите объект Zend \ Mvc \ Router \ SimpleRouteStack без контроллера/action/params, переданный по URL-адресу. –

+0

@Fge Я пробовал Zend \ Mvc \ PhpEnvironment \ Request.getRequestUri(), но безуспешно. –

ответ

9

Как сказано в приведенных выше комментариях: зарегистрироваться на начальной загрузку-событие и добавить новые маршруты туда:

<?php 

namespace Application; 

use Zend\Module\Manager, 
    Zend\EventManager\StaticEventManager; 

class Module 
{ 
    public function init(Manager $moduleManager) 
    { 
     $events = StaticEventManager::getInstance(); 
     $events->attach('bootstrap', 'bootstrap', array($this, 'initCustom'), 100); 
    } 

    public function initCustom($e) 
    { 
     $app = $e->getParam('application'); 
     $r = \Zend\Mvc\Router\Http\Segment::factory(array(
       'route' => '/test', 
       'defaults' => array(
        'controller' => 'test' 
       ) 
      ) 
     ); 
     $app->getRouter()->addRoute('test',$r); 
    } 
} 

$app = $e->getParam('application'); действительно возвращает экземпляр Zend\Mvc\Application. Посмотрите там, какие дополнительные части вы можете получить там. Событие bootstrap запускается до фактической диспетчеризации.

Обратите внимание, что маршруты ZendFramework 1 не всегда совместимы с ZendFramework 2.

Обновление комментариев

public function initCustom($e) 
{ 
    $app = $e->getParam('application'); 
    // Init a new router object and add your own routes only 
    $app->setRouter($newRouter); 
} 

Обновление нового вопроса

<?php 

namespace Application; 

use Zend\Module\Manager, 
    Zend\EventManager\StaticEventManager; 

class Module 
{ 
    public function init(Manager $moduleManager) 
    { 
     $events = StaticEventManager::getInstance(); 
     $events->attach('bootstrap', 'bootstrap', array($this, 'initCustom'), 100); 
    } 

    public function initCustom($e) 
    { 
     $zendApplication = $e->getParam('application'); 
     $customApplication = new System\Application(); 
     $customApplication->initRoutes($zendApplication->getRouter()); 
     // ... other init stuff of your custom application 
    } 
} 

Это происходит только в один ZF2 модуль (названный Application, который может быть только один, а) , Это не соответствует вашим потребностям? Вы могли бы:

  • продлить обычай module autoloader
  • расширения Zend \ Mvc \ Application для вашей собственной логики
  • сделать код ZF2-совместимый
+0

В этом примере мой модуль будет вызываться, когда запрашивается запрос «mywebsite.com/test»? –

+0

И если в моей библиотеке/custom/application.php я делаю то же самое, но здесь наследует экземпляр модуля: '$ events-> attach ('bootstrap', 'bootstrap', array (INSTANCE OF MODULE, 'init '), 100); ', таким образом, я могу автоматически вызвать метод init и определить мой маршрут модуля. (Конечно, сделайте это с немного большим количеством кода.) –

+0

Одна опечатка: 'public function init (Manager $ moduleManager)' и 'public function init ($ e)' с одинаковыми именами. –