Настройка маршрута в Symfony с тем же URL, но разными HTTP-методами и действиями контроллера

#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 . Я не могу сказать, почему, но это работает