Игнорировать наличие или отсутствие косой черты в Symfony Routing - PullRequest
0 голосов
/ 07 июня 2018

Я работаю над микросервисом на основе Symfony 4.1.0, и у него есть следующий REST API, определенный в config / rout.yaml:

import:
    path: /sip/calls/
    controller: App\Controller\ApiController::import
    methods: [POST]

Проблема заключается в том, что запрос POST к /sip/callsвызывает NotFoundHttpException (не найден маршрут для «POST / sip / Calls»).Если я удаляю косую черту из маршрута в файле config / rout.yaml, запросы к /sip/calls проходят, но /sip/calls/ перестает работать.

Почему он ведет себя как?Как заставить его игнорировать косую черту или ее отсутствие?

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Это намеренное поведение, на которое указывает @LukaszJakubek.Если вам нужно сопоставить маршрут в обоих направлениях, вы можете просто назначить несколько маршрутов, и он должен работать:

#config/routes.yaml
with_slash:
    path: test/
    controller: App\Controller\TestController::something
    methods: [POST]

without_slash:
    path: test
    controller: App\Controller\TestController::something
    methods: [POST]

Результат при использовании команды отладки:

bin/console router:match /test --method=POST



[OK] Route "without_slash" matches


+--------------+---------------------------------------------------------+
| Property     | Value                                                   |
+--------------+---------------------------------------------------------+
| Route Name   | without_slash                                           |
| Path         | /test                                                   |
| Path Regex   | #^/test$#sD                                             |
| Host         | ANY                                                     |
| Host Regex   |                                                         |
| Scheme       | ANY                                                     |
| Method       | POST                                                    |
| Requirements | NO CUSTOM                                               |
| Class        | Symfony\Component\Routing\Route                         |
| Defaults     | _controller: App\Controller\TestController::something   |
| Options      | compiler_class: Symfony\Component\Routing\RouteCompiler |
+--------------+---------------------------------------------------------+
bin/console router:match /test/ --method=POST



[OK] Route "with_slash" matches


+--------------+---------------------------------------------------------+
| Property     | Value                                                   |
+--------------+---------------------------------------------------------+
| Route Name   | with_slash                                              |
| Path         | /test/                                                  |
| Path Regex   | #^/test/$#sD                                            |
| Host         | ANY                                                     |
| Host Regex   |                                                         |
| Scheme       | ANY                                                     |
| Method       | POST                                                    |
| Requirements | NO CUSTOM                                               |
| Class        | Symfony\Component\Routing\Route                         |
| Defaults     | _controller: App\Controller\TestController::something   |
| Options      | compiler_class: Symfony\Component\Routing\RouteCompiler |
+--------------+---------------------------------------------------------+
0 голосов
/ 07 июня 2018

Как объяснено в: Перенаправление URL с конечными слешами Symfony 4.1 обрабатывает это внутренне путем создания перенаправления 301. Но проблема в том, что это перенаправление не работает для запросов POST.

Как уже упоминалосьздесь Почему в HTTP нет перенаправления POST теоретически вы могли бы использовать перенаправление 307 или 308, но у меня были некоторые проблемы с этим в прошлом, поэтому я выбрал простое решение с дублированным путем с косой чертой.

...