2015-09-28 2 views
1

У меня есть приложение со следующими URL-Zend 2: Добавить префикс к действию маршрута

www.myapp.com/admin/profile   [index action] 
www.myapp.com/admin/profile/add  [add action] 
www.myapp.com/admin/profile/edit  [edit action] 
www.myapp.com/admin/profile/del  [delete action] 

Эти адреса предназначены для пользователей с правами администратора.
пользователей, которые не имеют права администратора имеют следующие URL-адресов

www.myapp.com/user/profile   
www.myapp.com/user/profile/add  
www.myapp.com/user/profile/edit  
www.myapp.com/user/profile/del 

Маршруты в Зенд 2

 // admin routes 
     'admin' => array(
      'type' => 'Literal', 
      'options' => array(
       'route' => '/admin', 
       'defaults' => array(
        '__NAMESPACE__' => __NAMESPACE__.'\Controller', 
       ), 
      ), 
      'may_terminate' => true, 
      'child_routes' => array(

       // Profile 
       'profile' => array(
        'type' => 'Literal', 
        'options' => array(
         'route' => '/profile', 
         'defaults' => array(
          '__NAMESPACE__' => __NAMESPACE__ . '\Controller', 
          'controller' => 'Profile', 
          'action' => 'index' 
         ) 
        ), 
        'may_terminate' => true, 
        'child_routes' => array(
         'default' => array(
          'type' => 'Segment', 
          'options' => array(
           'route' => '[/:action[/:id]]', 
           'constraints' => array(
            'action' => '[a-zA-Z][a-zA-Z0-9_-]*', 
            'id' => '\d+' 
           ), 
           'defaults' => array(
            '__NAMESPACE__' => __NAMESPACE__ . '\Controller', 
            'controller' => 'Profile' 
           ) 
          ) 
         ), 
        ) 
       ), 
      ), 
     ), 


     // user routes 
     'admin' => array(
      'type' => 'Literal', 
      'options' => array(
       'route' => '/user', 
       'defaults' => array(
        '__NAMESPACE__' => __NAMESPACE__.'\Controller', 
       ), 
      ), 
      'may_terminate' => true, 
      'child_routes' => array(

       // Profile 
       'profile' => array(
        'type' => 'Literal', 
        'options' => array(
         'route' => '/profile', 
         'defaults' => array(
          '__NAMESPACE__' => __NAMESPACE__ . '\Controller', 
          'controller' => 'Profile', 
          'action' => 'clientIndex' 
         ) 
        ), 
        'may_terminate' => true, 
        'child_routes' => array(
         'default' => array(
          'type' => 'Segment', 
          'options' => array(
           'route' => '[/:action[/:id]]', 
           'constraints' => array(
            'action' => 'client[a-zA-Z][a-zA-Z0-9_-]*', <----- look here 
            'id' => '\d+' 
           ), 
           'defaults' => array(
            '__NAMESPACE__' => __NAMESPACE__ . '\Controller', 
            'controller' => 'Profile' 
           ) 
          ) 
         ), 
        ) 
       ), 
      ), 
     ), 

То, что я хочу иметь, что если URL доступа пользователя: www.myapp.com/admin/ профиль/добавить
приложений контроллер запуска профиль и действие AddAction

I е URL доступа пользователя: www.myapp.com/user/profile/add
Применение контроллера запуска Профиль и действие userAddAction

Так что я хочу, чтобы добавить префикс «пользователя» для каждого действия, когда пользователь маршруты используются.

Я попытался:

     'options' => array(
          ... 
          'defaults' => array(
           '__NAMESPACE__' => __NAMESPACE__ . '\Controller', 
           'controller' => 'Profile', 
           'action' => 'user[:action]'  <--- look here 
          ) 
         ) 

Но, конечно, это не работает.

Я знаю, что я мог бы определить статические маршруты, но я хотел бы сделать это с сегмента маршрутов типа

ответ

0

Там нет необходимости в изменении маршрута. Определения маршрутов должны быть сопоставлены по URL-адресу, поэтому приложение может выполнить правильное действие контроллера.

Итак, определив 'action' => 'client[a-zA-Z][a-zA-Z0-9_-]*' вы говорите, что [:action] часть потребностей маршрут соответствовать на этой модели, которая будет происходить только тогда, когда вы просматривали в www.myapp.com/admin/profile/clientadd и т.д.

Для решения проблемы вы можете разделить ваш так что у вас есть маршрут к действию.

Этот пример показывает для маршрута пользователя, однако вы можете скопировать это и добавить их как дети /admin/profile маршрута также (изменяющих точку значение действия addAction, а не clientAddAction и т.д.).

// user routes 
'user' => [ 
    // same as before 
    'child_routes' => [ 

     'profile' => [ 
      // same as before 
      'child_routes' => [ 

       'add' => [ 
        'type' => 'literal', 
        'options' => [ 
         'route' => '/add' 
         'defaults' => [ 
          // no need for controller value as is 
          // inherited from the 'profile' parent route 
          'action' => 'clientAddAction' 
         ], 
        ], 
       ], 

       'edit' => [ 
        'type' => 'segment', 
        'options' => [ 
         'route' => '/edit/:id', 
         'defaults' => [ 
          'action' => 'clientEditAction', 
         ] 
        ], 
       ], 

       'del' => [ 
        'type' => 'segment', 
        'options' => [ 
         'route' => '/del/:id', 
         'defaults' => [ 
          'action' => 'clientDeleteAction', 
         ] 
        ], 
       ], 
      ], 
     ], 
    ], 
]; 

Единственное изменение, которое вам нужно будет сделать, - это визуализировать URL-адрес в представлении.

$this->url('/users/profile/default, ['action'=>'add']); 
$this->url('/users/profile/default, ['action'=>'edit', 'id' => 123]); 

Становится.

$this->url('/users/profile/add'); 
$this->url('/users/profile/edit, ['id' => 123]); 

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

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