Расширенная маршрутизация ZF3 - с помощью метода HTTP - PullRequest
0 голосов
/ 12 января 2020

Я создаю один сайт с ZF3. У меня проблемы с каким-то маршрутом.

Для примера:

Я ожидал Когда я получу доступ к этому URL: http://localhost/customer-import/, если метод POST: CustomerImportController :: Process будет выполнено, если будет выполнен метод GET: CustomerImportController :: Index

Фактически: всегда CustomerImportController :: Index выполнен

Файл конфигурации:

'router' => [
        'routes' => [
            'customers' => [
                'type'    => Segment::class,
                'options' => [
                    'route'    => '/customers',
                    'defaults' => [
                        'controller' => Controller\CustomerController::class,
                        'action'     => 'index',
                    ],
                ],
            ],
            'customers-import' => [
                'type'    => Literal::class,
                'options' => [
                    'route'    => '/customer-import-tool',
                    'defaults' => [
                        'controller' => Controller\CustomerImportController::class,
                        'action' => 'index',
                    ],
                ],
                'may_terminate' => true,
                'child_routes' => [
                    'import_customer' => [
                        'type' => Method::class,
                        'options' => [
                            'verb' => 'post',
                            'defaults' => [
                                'controller' => Controller\CustomerImportController::class,
                                'action' => 'import',
                            ],
                        ],
                    ],
                ],
            ],
        ],
    ],

Что я делаю не так?

1 Ответ

1 голос
/ 12 января 2020

Вы всегда попадаете в CustomerImportController :: Index (-> customers-import route), потому что не указано, что он должен соответствовать только для запросов GET. Вы используете тот же URL (host/customer-import-tool), но вы объявили только подстрок POST .. за исключением того, что POST и GET сопоставляются раньше.

Решение здесь довольно простое: - вы объявляете основной литерал маршрут, но у него нет диспетчера - вы объявляете два подчиненных метода, один для GET и один для POST

'customers-import' => [
    'type'    => Literal::class,
    'options' => [
        // Here you specify the literal route
        'route'    => '/customer-import-tool',
        'defaults' => [
            'controller' => Controller\CustomerImportController::class
        ],
    ],
    // Here you specify that "customer-import" can't be dispatched by itself,
    // but only by its childs
    'may_terminate' => false,
    'child_routes' => [
        // Here you match GET requests to the literal parent
        'get_import_customer' => [
            'type' => Method::class,
            'options' => [
                'verb' => 'get',
                'defaults' => [
                    'controller' => Controller\CustomerImportController::class,
                    'action' => 'index'
                ]
            ]
        ],
        // Here you match POST requests to the literal parent
        'post_import_customer' => [
            'type' => Method::class,
            'options' => [
                'verb' => 'post',
                'defaults' => [
                    'controller' => Controller\CustomerImportController::class,
                    'action' => 'import'
                ]
            ]
        ]
    ]
],
...