2013-10-02 2 views
3

Я пытаюсь настроить наш Module.php на использование the Module Manager Listeners для конфигурации (например, интерфейсов, доступных под Zend\ModuleManager\Feature\*). В частности, я хочу иметь возможность настроить маршруты моего модуля за пределами основных module.config.php. Я не смог найти реальных примеров этого.ZF2 Конфигурация маршрутизации через RouteProviderInterface

Что я нашел, если я правильно прочитал документацию, заключается в том, что метод getRouteConfig() должен объединиться в моих маршрутах в массив, предоставленный getConfig()?

module.php

class Module implements Feature\RouteProviderInterface 
{ 
//... 
    public function getRouteConfig() 
    { 
    return include __DIR__ . '/config/route.config.php'; 
    } 
    //... 
} 

/config/route.config.php

return array(

    'route_manager' => array(
    'router' => array (
     'routes' => array(
     //.. routes that were working correctly when added to module.config.php 
    ), 
    ), 
    ), 
); 

я могу видеть, возвращаемый массив через getRouteConfig(), так что я знаю, что метод вызывается правильно ,

Возможно, я неправильно понимаю цель вышеуказанного интерфейса, или я не предоставил правильный «ключ» (route_manager), чтобы это было правильно слито, поскольку я получаю 404 для своих маршрутов.

Любая помощь будет оценена!

ответ

2

Ну, у меня он работает, но я использую только getConfig(). Что делать, я использую array_merge в getConfig().

public function getConfig() 
{ 
    return array_merge(
     require_once 'path_to_config/module.config.php', 
     require_once 'path_to_config/routes.config.php' 
    ); 
} 

Мой router.config.php выглядит то вроде:

return [ 
    'router' => [ 
     'routes' => [ 
      // routes 
     ] 
    ] 
]; 

Таким образом, я получил некоторые другие конфигурационные файлы разделенным (ACL).

Редактировать Из-за статьи Understanding ZF2-Configuration у меня появилась идея. Я думаю, что ваш массив должен не быть:

return array(
    'route_manager' => array(
     'router' => array (
      'routes' => array(
       //.. routes that were working correctly when added to module.config.php 
      ) 
     ) 
    ) 
); 

но скорее быть

return array(
    'router' => array (
     'routes' => array(
      //.. routes that were working correctly when added to module.config.php 
     ), 
    ), 
); 
+0

Спасибо за входной @Hendriq, я думал, что это будет работать, хотя я не пробовал. Думаю, мне придется реализовать его таким образом, если кто-либо еще не сможет пролить свет на правильное использование интерфейса. – AlexP

+1

Пробовал ли некоторые исследования по этой теме, и ничего не нашел. Но нашел интересную статью, поэтому я обновил свой ответ еще немного вещей – MKroeders

+0

Спасибо, я попробую. – AlexP

3

Я не сделал это так, как вы говорили еще, но ключ route_manager не требуется в Метод getRouteConfig().

Это связано с тем, что все методы get{$specificManager}Config() вызываются непосредственно из соответствующих классов-менеджеров. Поэтому исходный ключ не требуется. Используя другую терминологию, при использовании getRouteConfig() вы уже находитесь в области route_manager. То же, что и при использовании getServiceConfig(), вы уже находитесь в составе service_manager. Однако getConfig() находится в пределах области приложения и, следовательно, для доступа к настройке частей приложения, вам необходимо обратиться к нему специально.

Следует отметить следующее: конфигурация getConfig() может быть кеширована для повышения производительности, тогда как все остальные методы get{$specificManager}Config() - нет. Особенно в случае с RouteConfiguration я настоятельно рекомендую использовать метод getConfig() для вашего RouteConfig.

Если вам действительно нужно отделить конфигурацию, то я бы предложил способ, которым @Hendriq отображался для вас.

+0

Спасибо Сэм. Имеет смысл в отношении ключа конфигурации, и это интересный момент в отношении кэширования - я думал, что окончательный * объединенный * config будет кэшироваться, а не просто результат 'getConfig'? – AlexP

+0

Lol, нашел вашу статью по этому вопросу. Перед любым документом – MKroeders

+0

@AlexP Точка 'get {$ sm} Config()' -Methods должна разрешать реализацию '\ Closure' внутри Конфигурации. Поскольку они не могут быть сериализованы, нет возможности кэшировать их. По этой причине эти методы будут объединены после того, как первоначальная конфигурация уже кэширована. Это, я надеюсь, следует указать в моей статье, которую Хендрик связал. – Sam

2

getRouteConfig аналогичен другим провайдерам, которые там есть, поэтому вы можете создать несколько настраиваемых маршрутов. Я предполагаю, что то, что вы пытаетесь сделать, наиболее приемлемо с помощью метода hendriq.

Пример getRouteConfig можно найти на http://zf2cheatsheet.com/

public function getRouteConfig() 
{ 
    return array(
     'factories' => array(
      'pageRoute' => function ($routePluginManager) { 
       $locator = $routePluginManager->getServiceLocator(); 
       $params = array('defaults' => array('controller' => 'routeTest','action' => 'page','id' => 'pages')); 
       $route = Route\PageRoute::factory($params); 
       $route->setServiceManager($locator); 
       return $route; 
      }, 
     ), 
    ); 
} 

В нашем Module\Route имен мы создаем класс, который реализует PageRouteZend\Mvc\Http\RouteInterface и, в нашем конкретном случае для примера, Zend\ServiceManager\ServiceManagerAwareInterface. Теперь просто реализуйте функции интерфейса ... В образце он использует Doctrine для загрузки страниц из базы данных.

Наконец, мы можем добавить наш новый пользовательский маршрут к нашим module.config.php, поэтому он может быть использован:

'page' => array(
    'type' => 'pageRoute', 
), 

Как вы можете видеть в этом последнем шаге мы возвращаемся к решению Hendriq в качестве предполагаемого использования не для загрузки маршруты в маршрутизатор, но создание настраиваемых маршрутов.

Надеется, что это помогает

+0

Хуан, ваш абсолютно правильно, я в итоге сработал! +1 для примера и * отлично * ссылка! – AlexP

+0

рад, что это помогло вам справиться с этим –

Смежные вопросы