Symfony 3:处理异常MethodNotAllowedException

时间:2017-06-08 17:19:24

标签: php symfony http post get

我不清楚如何在Symfony中处理异常MethodNotAllowedException。 让我解释一下,

视图

假设我们在View上编写此脚本以转到Controller:

//Script on view to go to the controller
<script type="text/javascript">
    $.ajax({
      method: "POST",
      url: "{{ path('my_path') }}",
      data: { myValue }
    }).done(function( data ) {
        //do something
    });
</script>

定义路线

我们使用post方法定义数据发送。现在,在 routing.yml

中查看路线
//scr/myBundle/Resources/routing.yml
my_path:
    path:     /my-path
    defaults: { _controller: myBundle:myMain:doAndReturnSomething }
    methods:  [POST]

使用控制器

现在,在控制器中

//scr/myBundle/Resources/Controller/myMainController
class myMainController extends Controller{
  public function doAndReturnSomethingAction()
  {
    //doSomeThing
    return  $this->render('myBundle:myViews:view.html.twig');
}

这很有效。我们怎么看,定义发送的方法是POST。

现在,当我们使用浏览器重新加载页面或按f5时。一切正常。 但是,如果我们按下浏览器中的URL

//Click on: localhost/myAplicationDir/web/my-path

应用程序被破坏了,我想我们确定没有用GET定义发送。

如何在Symfony中获取此异常并向用户显示自定义页面?

我正在考虑重定向到myBundle索引页面。什么sugest?

感谢您的帮助。 我刚开始使用PHP和Symfony。

解决方案#1

分别使用GET和POST方法创建两个单独的路由器

解决方案#2

我不想创建两条独​​立的路线。我的控制器有很多方法。 我不想通过URL通过GET发送数据。但我不希望我的申请被破坏。

//scr/myBundle/Resources/routing.yml
my_path:
    path:     /my-path
    defaults: { _controller: myBundle:myMain:doAndReturnSomething }
    methods:  [POST, GET]


//scr/myBundle/Resources/Controller/myMainController
use Symfony\Component\HttpFoundation\Request;
class myMainController extends Controller{
  public function doAndReturnSomethingAction(Request $request)
  {
    if ($request->getMethod() == 'POST')
      //doSomeThing
    else
      //redirect to index


    //This can be other way
    //myValue is sending via POST
    if ($request->get('myValue') != null)
      //doSomething
    else
      //redirect to index

    //return  $this->render('myBundle:myViews:view.html.twig');
}

在routing.yml ??

的所有路由中都有任何方法可以解决这个问题

1 个答案:

答案 0 :(得分:1)

您需要在路线上启用GET,以便按此工作。

//scr/myBundle/Resources/routing.yml
my_path:
    path:     /my-path
    defaults: { _controller: myBundle:myMain:doAndReturnSomething }
    methods:  [POST, GET]

虽然我不一定会推荐这个,但建议使用两个单独的路由,并且如果绝对有必要将GETdoAndReturnSomething重定向到单独的Controller。基本上分别以doSomethingActionreturnSomethingAction结尾。