#php #rest #symfony1 #routing #http-method
#php #остальное #symfony1 #маршруты #http-метод
Вопрос:
У меня есть следующая конфигурация маршрутов в приложении Symfony:
label:
url: /label
param: { module: label, action: configure }
requirements: { sf_method: get }
label_create:
url: /label
param: { module: label, action: create }
requirements: { sf_method: post }
связано executeConfigure
с executeCreate
действиями и. Затем у меня есть форма, настроенная таким образом:
<form action="<?php echo url_for('@label_create') ?>" method="POST">
<?php echo $form->renderHiddenFields() ?>
<input type="hidden" name="sf_method" value="post" />
<!-- more stuff here -->
</form>
Всякий раз, когда отправляется форма executeConfigure
, выполняется, хотя, насколько я знаю, маршрут, настроенный с POST
помощью метода, должен избегать этого и выполняется executeCreate
.
Как я могу различать эти два действия, сохраняя один и тот же URL?
Спасибо!
Ответ №1:
У меня тоже была эта проблема, и я нашел ответ в старом сообщении на форуме (http://oldforum.symfony-project.org/index.php/t/25750 /).
Если он полностью игнорирует метод запроса, то, скорее всего, он использует обычный sfRoute. Вам нужно использовать sfRequestRoute, чтобы сделать маршрутизацию «ориентированной на метод». Итак, в вашем примере вы будете делать:
label:
url: /label
class: sfRequestRoute
param: { module: label, action: configure }
requirements: { sf_method: get }
label_create:
url: /label
class: sfRequestRoute
param: { module: label, action: create }
requirements: { sf_method: post }
Комментарии:
1. Этот ответ полезен для более старых версий Symfony, но в текущих версиях он устарел. Какие существуют альтернативы?
Ответ №2:
Я решил это, используя эту схему маршрутизации:
users_create:
pattern: /
defaults: { _controller: "RentalAPIBundle:User:create" }
requirements: { _method: post }
users:
pattern: /
defaults: { _controller: "RentalAPIBundle:User:index" }
requirements: { _method: get }
затем при вызове Url вы можете вызвать user или user/ для GET, но только users/ для POST . Я не могу сказать, почему, но это работает