2015-09-28 2 views
1

Je demande avec les URL suivantesZend 2: Ajouter un préfixe à l'action de la route

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] 

Ces URL sont pour les utilisateurs avec des autorisations d'administrateur.
Les utilisateurs qui ne dispose pas des autorisations d'administration suivantes ont des URL

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

Routes dans Zend 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' 
           ) 
          ) 
         ), 
        ) 
       ), 
      ), 
     ), 

Ce que je veux avoir est que si l'URL d'accès utilisateur: www.myapp.com/admin/ profil/ajouter
contrôleur d'application d'exécution profil et de l'action addAction

I f url d'accès utilisateur: www.myapp.com/user/profile/add
application contrôleur d'exécution Profil et de l'action userAddAction

Je veux ajouter le préfixe 'utilisateur' à chaque action lorsque l'utilisateur routes sont utilisés.

J'ai essayé:

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

Mais bien sûr, il ne fonctionne pas.

Je sais que je pourrais définir des routes statiques, mais je voudrais le faire avec des itinéraires de segment Type

Répondre

0

Il n'y a pas besoin de changement la route. Les définitions de route doivent être correspondant par l'URL, afin que l'application puisse exécuter l'action de contrôleur correcte.

en définissant 'action' => 'client[a-zA-Z][a-zA-Z0-9_-]*' vous dites que la partie [:action] de la route doit correspondre sur ce modèle, qui ne se produira que si vous navigué www.myapp.com/admin/profile/clientadd etc.

Pour résoudre votre problème, vous pouvez diviser votre routes enfant afin que vous ayez un itinéraire par action.

Cet exemple montre l'itinéraire de l'utilisateur, mais vous pouvez copier ce et les ajouter comme des enfants de la route /admin/profile également (modification de la valeur de l'action plutôt que le point addActionclientAddAction etc). Le seul changement que vous auriez besoin de faire est de rendre une URL dans la vue.

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

Deviendrait.

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