2

В Zend Framework 2 Я пытаюсь перенаправить несколько динамических URL-адресов указанным действиям в контроллер, который расширяет AbstractRestfulController на основе типа запроса. Проблема заключается в том, то AbstractRestfulController сохраняет перекрывая эти маршруты к действиям по умолчанию get(), getList() и т.д.ZF2 Маршрут на основе метода при расширении AbstractRestfulController

Мои маршруты:

GET /my-endpoint/{other_id} - allAction() 
POST /my-endpoint/{other_id} - createAction() 
GET /my-endpoint/{other_id}/{id} - getAction() 
PUT /my-endpoint/{other_id}/{id} - updateAction() 
DELETE /my-endpoint/{other_id}/{id} - deleteAction() 

Мой конфигурации маршрутизатора является:

'my-endpoint' => [ 
    'type' => 'segment', 
    'options' => [ 
     'route' => 'my-endpoint/:other_id', 
     'constraints' => [ 
      'other_id' => '[0-9]+', 
     ], 
     'defaults' => [ 
      'controller' => 'my-endpoint', 
     ], 
    ], 
    'may_terminate' => true, 
    'child_routes' => [ 
     'get' => [ 
      'type' => 'method', 
      'options' => [ 
       'verb' => 'get', 
       'defaults' => [ 
        'action' => 'all', 
       ], 
      ], 
     ], 
     'post' => [ 
      'type' => 'method', 
      'options' => [ 
       'verb' => 'post', 
       'defaults' => [ 
        'action' => 'create', 
       ], 
      ], 
     ], 
     'single' => [ 
      'type' => 'segment', 
      'options' => [ 
       'route' => '[/:id]', 
       'constraints' => [ 
        'id' => '[0-9]+', 
       ], 
      ], 
      'may_terminate' => true, 
      'child_routes' => [ 
       'get' => [ 
        'type' => 'method', 
        'options' => [ 
         'verb' => 'get', 
         'defaults' => [ 
          'action' => 'get', 
         ], 
        ], 
       ], 
       'update' => [ 
        'type' => 'method', 
        'options' => [ 
         'verb' => 'put', 
         'defaults' => [ 
          'action' => 'update', 
         ], 
        ], 
       ], 
       'delete' => [ 
        'type' => 'method', 
        'options' => [ 
         'verb' => 'delete', 
         'defaults' => [ 
          'action' => 'delete', 
         ], 
        ], 
       ], 
      ], 
     ], 
    ], 
], 

И мой контроллер имеет следующие действия:

public function allAction() { 
    die('allAction'); 
} 

public function createAction() { 
    die('createAction'); 
} 

public function getAction() { 
    die('getAction'); 
} 

public function updateAction() { 
    die('updateAction'); 
} 

public function deleteAction() { 
    die('deleteAction'); 
} 

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

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

+0

Почему бы не использовать [ZF2 'AbstractActionController'] (https://github.com/zendframework/zend-mvc/blob/master/src/Controller/AbstractActionController.php) для этого? – Wilt

+0

@ Если вы прочитали мое последнее предложение, у меня есть базовый контроллер, который расширяет его от контроллера Zends. Я могу сделать более утонченную маршрутизацию внутри контроллеров, но было бы более чистым и приятным сделать это правильно – shiznatix

+0

Прости, я не пропустил эту важную часть. Я попытаюсь придумать полезный ответ. – Wilt

ответ

0

Попробуйте установить: 'may_terminate' => false

Прямо сейчас ваш маршрут будет соответствовать 'my-endpoint' или 'single' и так как есть no action set для этих матчей. Вместо этого он будет get the http method from the request и сопоставить соответствующие методы контроллера inside the AbstractRestfulControlleronDispatch method.

+0

Это сделало трюк! Спасибо, я не знал, что действительно сделал 'may_terminate' – shiznatix

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