web-dev-qa-db-ja.com

Symfony2ルーティング:メソッドは許可されていません(許可:{メソッド})

したがって、routing.ymlには、特定の設定を編集および削除するために、次のルートが定義されています。

routing.yml:

settings.editDefaults:
    path:      settings/{id}/defaults/edit/{widgetType}
    defaults:  { _controller: AppBundle:Settings:editDefaults }
    methods:  [POST, PUT]

settings.deleteDefaults:
    path:      settings/{id}/defaults/delete/{widgetType}
    defaults:  { _controller: AppBundle:Settings:deleteDefaults }
    methods: [DELETE]

そして私のコントローラーでは、正しいアクションが定義されています:SettingController.php:

/**
 * edit the default settings of a hotel/widget
 */
public function editDefaultsAction(Request $request)
{ 
   //Edit logic
}

/**
 * delete a default setting of a hotel/widget
 */
public function deleteDefaultsAction($hotelId, $widgetType)
{
  //Delete logic
}

2番目のアクションでは、idwidgetTypeを渡すだけで、選択したレコードを照会して削除できます。

どちらかのルートに行くと、次のようになります。

ルートエラーの編集:

「GET/settings/2b2acd55-0dd6-11e5-8107-621ae3320fd4/defaults/edit/default」のルートが見つかりません:メソッドは許可されていません(許可:POST、PUT)

ルートエラーの削除:

「GET/settings/2b2acd55-0dd6-11e5-8107-621ae3320fd4/defaults/delete/default」のルートが見つかりません:メソッドは許可されていません(許可:DELETE)

しかし、一方を削除してもう一方を残すと、正常に機能します。似ているのはパス定義だと思いますか?同じパスを維持し、このエラーが発生しないようにすることは可能ですか?何がわからないの?

あなたの助けをありがとう、アンス

7
Anth Bieb

CRUDを使用してアクションを生成しましたか?

私はこの問題に対処するための解決策を見つけました。

/**
 * Deletes a Preisliste entity.
 *
 */
public function deleteAction(Request $request, $id)
{
    /*$form = $this->createDeleteForm($id);
    $form->handleRequest($request);

    if ($form->isValid()) {
        $em = $this->getDoctrine()->getManager();
        $entity = $em->getRepository('MandantBundle:Preisliste')->find($id);

        if (!$entity) {
            throw $this->createNotFoundException('Unable to find Preisliste entity.');
        }

        $em->remove($entity);
        $em->flush();
    }

    return $this->redirect($this->generateUrl('preisliste'));*/

    $em = $this->getDoctrine()->getManager();
    $entity = $em->getRepository('MandantBundle:Preisliste')->find($id);

    if (!$entity) {
        throw $this->createNotFoundException('Unable to find Preisliste entity.');
    }

    $em->remove($entity);
    $em->flush();


    return $this->redirect($this->generateUrl('preisliste'));
}

コメントされたコードはCRUDからのものであり、機能しません。同じエラーが発生します(「GET ...」のルートが見つかりません)Symfonyがフォームを使用して削除しようとする理由がわかりません。エンティティを削除するだけが私にとって正しい方法です。

4
chuebert

あなたの見解ではこれの代わりに:

<a href="{{ path('settings_delete', { 'id': settings.id }) }}">
    Delete
</a>

フォームを使用する:

{{ form_start(delete_form) }}
    <button type="submit">Delete</button>
{{ form_end(delete_form) }}

編集フォームも同じ

3
Théo Attali

POST、PUT、およびDELETEメソッドのみを許可しますが、GETメソッドを介してこれらのルートにアクセスしています。

したがって、次のようにルートを定義します。

settings.editDefaults:
    path:      settings/{id}/defaults/edit/{widgetType}
    defaults:  { _controller: AppBundle:Settings:editDefaults }

settings.deleteDefaults:
    path:      settings/{id}/defaults/delete/{widgetType}
    defaults:  { _controller: AppBundle:Settings:deleteDefaults }

または、これらの制限が本当に必要な場合は、DELETE、PUT、およびPOSTメソッドをそのままにして、GETメソッドを追加します。

ブラウザでURLにアクセスする場合、通常はGETメソッドを介してリクエストを送信します。あなたはこれらについてもっと読むことができます: ここそしてここ

2
Janis Vepris