3
4

3 に答える 3

5

アンカー<a href="#">は常に GET リクエストを使用します。それを変更する方法はありません。ただし、Symfony を使用して PUT または DELETE リクエストを偽装することは可能です。

Symfony フォームはフォームに隠しフィールドを追加することで動詞を偽造します。

<input type="hidden" name="_method" value="PUT" />

次に、動詞が POST であるかどうかを内部的にチェックし、_methodパラメーターをチェックして、動詞を POST から PUT に変更します。これは、POST メソッドを使用する HTML フォームに対してのみ機能します。

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>
于 2015-02-05T17:18:47.980 に答える
1

ルーティング ファイル内:

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>
于 2013-09-26T21:35:13.647 に答える