Ссылка на Symfony2 с 'POST' или 'Delete' или 'поставить' способ
Я хотел бы создать url-адрес с требованием метода " PUT " или "POST", используя ссылку <a href>
.
Поскольку я использую серверную часть фреймворка, я использую поддельную форму для этого-пример с методом PUT:
<form action="someActionUri" method="post">
<input type="hidden" name="_method" value="PUT" />
<input type="submit" value="GO PUT" />
</form>
Но, я хотел бы использовать простую ссылку <a>
: (
3 ответа:
Якорь
<a href="#">
всегда будет использовать запрос GET. Нет никакого способа изменить это. Но, можно подделать запрос PUT или DELETE, используя Symfony.Symfony Forms подделает глагол, добавив к формам скрытое поле.
<input type="hidden" name="_method" value="PUT" />
Затем внутренне он проверяет, является ли глагол POST, проверяет параметр
_method
и изменяет глагол с POST на PUT. Это работает только для HTML-форм, использующих метод POST.То же самое можно сделать для глаголов GET, но это требует использования события Слушатель. Вот пример:
use Symfony\Component\HttpKernel\Event\GetResponseEvent; use Symfony\Component\HttpKernel\HttpKernel; class VerbListener { public function onKernelRequest ( GetResponseEvent $event ) { $request = $event->getRequest(); if ( HttpKernel::MASTER_REQUEST === $event->getRequestType() && $request->getMethod() === 'GET' ) { if ( $request->query->get('_method') === 'PUT' ) { $request->setMethod( 'PUT' ); } } } }
И служба должна быть зарегистрирована с более высоким приоритетом, чем служба
router_listener
, которая соответствует маршруту к контроллеру.services: acme.verb.listener: class: Acme\Bundle\Listener\VerbListener tags: - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest, priority: 100 }
Теперь связь может быть сгенерирована с помощью параметра
_method
<a href="foo?_method=PUT"></a>
В файле маршрутизации:
entity_edit: pattern: /entity/{id}/edit defaults: {_controller: MyBundle:Entity:put}
Мой контроллер (с fosRest):
/** * @Rest\View() */ public function putAction(Request $request, $id) { ...code ... }
Моя веточка:
<a href="{{ path('entity_edit', {'id': data.id} ) }}" >Edition</a>
Даже если мне нравится @ twifty response, я думаю, что это немного чересчур, чтобы слушать каждый запрос только для того, чтобы адаптировать некоторые из них. Гораздо проще вывести форму вместо ссылки, поэтому вместо
<a href="{{ path('my_route_with_put_method') }}">link</a>
Вы можете просто использовать:<form action="{{ path('my_route_with_put_method') }}" method="POST"> <button>link</button> <input type="hidden" name="_method" value="PUT"> </form>
Вам просто нужно обратить внимание, потому что вы используете блочный элемент (
form
) вместо встроенного элемента (a
), но вы можете легко обойти это (например, включая другие встроенные элементы внутри формы или используя CSS)