2013-06-05 2 views
0

У меня на самом деле есть 2 модуля (приложение и админ) в моем приложении ZF2, и я хочу маршрутизацию URL, как в ZF1. Я в настоящее время имеют следующий маршрут:ZF2 - Попытка создать маршрут, подобный ZF1

'router' => array 
(

    'routes' => array 
    (

     'admin' => array 
     (

      'type' => 'Segment', 
      'options' => array 
      (

       'route' => 'admin/[:controller[/:action]]', 

       'constraints' => array 
       (
        'controller' => '[a-zA-Z][a-zA-Z0-9_-]*', 
        'action' => '[a-zA-Z][a-zA-Z0-9_-]*', 
       ), 

       'defaults' => array 
       (
        '__NAMESPACE__' => 'Admin\Controller', 
        'controller' => 'Index', 
        'action' => 'index', 
       ), 

      ), 

      'may_terminate' => true, 
      'child_routes' => array 
      (

       'wildcard' => array 
       (

        'type' => 'Wildcard' 

       ) 

      ) 

     ), 

    ), 

), 

Так что будет соответствовать «/ администратор», «/ администратор/контроллер», «/ администратор/контроллер/действие», но не «/ контроллер/действие».

Теперь мне нужен маршрут к модулю приложения. Проблема в том, что если я просто использую такой маршрут для модуля Application, этот новый маршрут будет соответствовать «/ admin/controller» как controller = «admin» и action = «controller».

Я также попытался следующее регулярное выражение маршрута в приложении:

'application' => array 
     (

      'type' => 'Regex', 
      'options' => array 
      (

       'regex' => '/(?<controller>^(?!(admin)$)[a-zA-Z][a-zA-Z0-9_-]*)?' . 
          '(/[a-zA-Z][a-zA-Z0-9_-]*)?', 
       'spec' => '/%controller%/%action%', 

       /*'constraints' => array 
       (
        //The controller cannot be "admin" 
        'controller' => '^(?!(admin)$)[a-zA-Z][a-zA-Z0-9_-]*', 
        'action' => '[a-zA-Z][a-zA-Z0-9_-]*', 
       ),*/ 

       'defaults' => array 
       (
        '__NAMESPACE__' => 'Application\Controller', 
        'controller' => 'Index', 
        'action' => 'index', 
       ), 

      ), 

      'may_terminate' => true, 
      'child_routes' => array 
      (

       'wildcard' => array 
       (

        'type' => 'Wildcard' 

       ) 

      ) 

     ), 

Но это не получает переменные «контроллер» и «действия».

Есть ли у кого-нибудь предложение, как это решить?

ответ

0

Учитывайте порядок маршрута: маршруты обрабатываются с использованием стека LIFO, поэтому то, что приходит последним в массиве, сначала возникает при сопоставлении запросов запроса.

Это означает, что вам всегда необходимо определить наиболее общие маршруты, чтобы предотвратить совпадение подобных, но более конкретных.

используя следующий порядок не нужно каких-либо ограничений на параметр controller, потому что все, начиная с /admin будет соответствовать первой

'route1' => array(
    'type' => 'Segment', 
    'options' => array(
     'route' => '/[:controller[/:action]]', 
     'defaults' => array (
      'controller' => 'controller', 
      'action' => 'index', 
     ), 
    ), 
), 
'route2' => array(
    'type' => 'Segment', 
    'options' => array(
     'route' => '/admin[/:controller[/:action]]', 
     'defaults' => array (
      'controller' => 'admin-controller', 
      'action' => 'index', 
     ), 
    ), 
), 

Кроме того, вы всегда можете указать excplicitly маршруты приоритет использования priority имущества (которое не следует определять в массиве options, но в самом верхнем массиве маршрута), поэтому следующий код эквивалентен предыдущему примеру:

'route2' => array(
    'type' => 'Segment', 
    'options' => array(
     'route' => '/admin[/:controller[/:action]]', 
     'defaults' => array (
      'controller' => 'admin-controller', 
      'action' => 'index', 
     ), 
    ), 
), 
'route1' => array(
    'type' => 'Segment', 
    'options' => array(
     'route' => '/[:controller[/:action]]', 
     'defaults' => array (
      'controller' => 'controller', 
      'action' => 'index', 
     ), 
    ), 
    'priority' => -1, 
), 

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

  • Нет связанных вопросов^_^