Ссылка на 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 3

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)