ZF3: Как выполнить маршрутизацию к конкретному контроллеру/действию на основе метода и маршрута?

В моем модуле module.config.php у меня есть что-то вроде этого:

namespace Application;

return [
    //...
    // myroute1 will route to IndexController fooAction if the route is matching '/index/foo' but regardless of request method
    'myroute1' => [
        'type' => Zend\Router\Http\Literal::class,
        'options' => [
            'route'    => '/index/foo',
            'defaults' => [
                'controller' => Controller\IndexController::class,
                'action'     => 'foo',
            ],
        ],
    ],

    // myroute2 will route to IndexController fooAction if the route is request method is GET but regardless of requested route
    'myroute2' => [
        'type'    => Zend\Router\Http\Method::class,
        'options' => [
            'verb'     => 'get',
            'defaults' => [
                'controller'    => Controller\IndexController::class,
                'action'        => 'foo',
            ],
        ],
    ],
    //...
];

Чего я пытаюсь достичь:

  • Если маршрут /index/foo запрашивается И запрашивается методом GET, то он должен быть направлен в IndexController fooAction
  • Если маршрут /index/foo запрашивается И запрашивается методом POST, то он должен быть направлен в IndexController bar Action (обратите внимание, что это barAction, а не fooAction)

Как этого добиться?


person evilReiko    schedule 12.09.2017    source источник


Ответы (2)


Попробуйте изменить литерал на маршрут Zend\Mvc\Router\Http\Part, а затем поместить маршруты HTTP в качестве маршрутов CHILD!

См. здесь https://docs.zendframework.com/zend-router/routing/#http-route-types

person delboy1978uk    schedule 12.09.2017
comment
Это то, что я искал. Но я заметил, что Part маршруты не предназначены для прямого использования. - person evilReiko; 13.09.2017

Примечание для себя и всех, кто ищет, в качестве дополнительного примечания к ответу @ delboy1978uk.

Ответ, который я искал, выглядит примерно так:

  • GET /index/foo => IndexController fooAction
  • POST /index/foo => Действие панели IndexController

Таким образом, код в файле module.config.php может быть таким:

return [
    //...
    'myroute1' => [// The parent route will match the route "/index/foo"
        'type' => Zend\Router\Http\Literal::class,
        'options' => [
            'route'    => '/index/foo',
            'defaults' => [
                'controller' => Controller\IndexController::class,
                'action'     => 'foo',
            ],
        ],
        'may_terminate' => false,
        'child_routes' => [
            'myroute1get' => [// This child route will match GET request
                'type' => Method::class,
                'options' => [
                    'verb' => 'get',
                    'defaults' => [
                        'controller' => Controller\IndexController::class,
                        'action'     => 'foo'
                    ],
                ],
            ],
            'myroute1post' => [// This child route will match POST request
                'type' => Method::class,
                'options' => [
                    'verb' => 'post',
                    'defaults' => [
                        'controller' => Controller\IndexController::class,
                        'action'     => 'bar'
                    ],
                ],
            ]
        ],
    ],
    //...
];
person evilReiko    schedule 13.09.2017
comment
Вы только что сэкономили мои часы. отдать честь! - person Mehmet SÖĞÜNMEZ; 20.12.2017
comment
Сможем ли мы по-прежнему вызывать $this->url("myroute1", ["action"=>"foo"]) и $this->url("myroute1", ["action"=>"bar"])? Или нам пришлось бы указать имя дочернего маршрута - person Ali Rasheed; 22.02.2019
comment
@AliRasheed Я не уверен, какой из них может работать или, может быть, даже оба они работают, но в любом случае это не имеет значения, потому что у них обоих должен быть один и тот же URL, разница только в том, как приложение направляет к действию по используемому методу - person evilReiko; 23.02.2019
comment
@AliRasheed, кстати, второй параметр передавать не нужно, поэтому $this->url('myroute1') достаточно - person evilReiko; 23.02.2019