2016-11-19 4 views
1

Я запустил новый proyect с symfony3 и FOSRestBundle для REST API. Все работает так, как ожидалось, но у меня есть вопрос. У меня есть эти два действия на моем контроллере и конфигурация маршрутизатора:Symfony FOSRestBundle Действия Заказывайте

api_marcas_get_all_marca_paginated GET ANY ANY /api/marca/{limit}/{page}.{_format} api_marcas_delete_remove_marca GET ANY ANY /api/marca/delete/{marcaid}.{_format}

Проблема заключается в том, что, когда я называю это (от Postman):

127.0.0.1:8000/api/marca/delete/105 

другого действия (api_marcas_get_all_marca_paginated) отвечает ...

Да .. я знаю, что могу использовать метод DELETE http, и это сработало ... но ... Почему они сталкиваются?

Вот мои действия:

/** 
* @Rest\Get("/marca/{limit}/{page}") 
*/ 
public function getAllMarcaPaginatedAction(Request $request) 
{... code here ...} 

и

/** 
* @Rest\Get("/marca/delete/{marcaid}") 
*/ 
public function deleteRemoveMarcaAction(Request $request) 
{ ... //code here... } 

В таком порядке.

Я делаю что-то неправильно? Имеет ли какое-либо отношение к порядку действий? Спасибо ...

ответ

1

Это происходит потому, что эти правила рассматриваются последовательно, и выполняется первое совпадение.

В вашем примере /api/marca/delete/105 первое правило соответствует, как delete быть {limit} и 105 быть {page}.

Вы можете определить некоторые требования для {limit}, чтобы соответствовать только определенным шаблонам. Здесь вы можете найти некоторые примеры того, как использовать requirements аннотации: http://symfony.com/doc/current/bundles/FOSRestBundle/param_fetcher_listener.html

С другой стороны, это рекомендуемая практика не использовать GET метод для операций, которые изменяют состояние приложения (например, удаление элемента), являющееся считается safe method.

+0

Спасибо за комментарий @dubrox. Есть ли у вас рекомендации избегать подобных проблем с маршрутом? –

+0

Я только что обновил свой ответ, чтобы предложить использовать атрибут 'requirements', чтобы избежать этого столкновения шаблонов в целом. Но в вашем конкретном случае вы действительно должны избегать «GET» для удаления и, по крайней мере, использовать метод «POST», если вы действительно не хотите использовать стандарт HTTP DELETE. – dubrox

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