【问题标题】:laravel throwing MethodNotAllowedHttpExceptionlaravel 抛出 MethodNotAllowedHttpException
【发布时间】:2013-11-14 15:36:31
【问题描述】:

我试图让一些非常基本的东西运行起来。我习惯了 CI,现在正在学习 Laravel 4,他们的文档并不容易!无论如何,我正在尝试创建一个登录表单,并通过在下一个表单中打印来确保成功发布数据。我得到了这个例外:

Symfony\Component\HttpKernel\Exception\ MethodNotAllowedHttpException

还有我的 MemberController.php:

    public function index()
    {
        if (Session::has('userToken'))
        {
            /*Retrieve data of user from DB using token & Load view*/
            return View::make('members/profile');
        }else{
            return View::make('members/login');
        }
    }

    public function validateCredentials()
    {
        if(Input::post())
        {
            $email = Input::post('email');
            $password = Input::post('password');
            return "Email: " . $email . " and Password: " . $password;
        }else{
            return View::make('members/login');
        }
    }

并且路线有:

Route::get('/', function()
{
    return View::make('hello');
});

Route::get('/members', 'MemberController@index');
Route::get('/validate', 'MemberController@validateCredentials');

最后我的视图 login.php 有这个表单方向:

<?php echo Form::open(array('action' => 'MemberController@validateCredentials')); ?>

任何帮助将不胜感激。

【问题讨论】:

  • 您在哪个url 中遇到了错误?
  • 你试过php artisan dump-autoload吗?
  • 旧帖子,但人们仍然偶然发现它 - 尝试“composer dump-autoload”。为我工作。
  • @Andreyco 这个命令没有定义。

标签: routing laravel laravel-4


【解决方案1】:

我怀疑问题在于您的路线定义。

您将路由定义为GET 请求,但表单可能正在发送POST 请求。更改您的路由定义以匹配表单的请求方法。

Route::post('/validate', [MemberController::class, 'validateCredentials']);

使用命名路由通常是更好的做法(有助于在控制器方法/类更改时进行扩展)。

Route::post('/validate', [MemberController::class, 'validateCredentials'])
    ->name('member.validateCredentials');

在视图中,使用验证路由作为表单的操作。

<form action="{{ route('member.validateCredentials') }}" method="POST">
  @csrf
...
</form>

【讨论】:

    【解决方案2】:
    <?php echo Form::open(array('action' => 'MemberController@validateCredentials')); ?>
    

    默认情况下,Form::open() 采用 POST 方法。

    您的路线中有GET。在对应的路由里改成POST

    或者如果您想使用GET 方法,则添加method 参数。

    例如

    Form::open(array('url' => 'foo/bar', 'method' => 'get'))
    

    【讨论】:

      【解决方案3】:

      您收到该错误是因为您发布到 GET 路由。

      我会将validate 的路由拆分为单独的GETPOST 路由。

      新路线:

      Route::post('validate', 'MemberController@validateCredentials');
      
      Route::get('validate', function () {
          return View::make('members/login');
      });
      

      那么你的控制器方法可能就是

      public function validateCredentials()
      {
          $email = Input::post('email');
          $password = Input::post('password');
          return "Email: " . $email . " and Password: " . $password;
      }
      

      【讨论】:

        【解决方案4】:

        我也遇到了这个问题,这里的其他答案很有帮助,但我使用的是 Route::resource,它负责处理 GETPOST 和其他请求。

        就我而言,我原样离开了路线:

        Route::resource('file', 'FilesController');
        

        并简单地修改了我的表单以提交到我的FilesController 中的store 函数

        {{ Form::open(array('route' => 'file.store')) }}
        

        这解决了这个问题,我认为值得指出作为一个单独的答案,因为其他各种答案都建议添加一个新的POST 路由。这是一个选项,但不是必需的。

        【讨论】:

          【解决方案5】:

          我遇到了错误,
          问题是表单方法

          {{ Form::open(array('url' => 'admin/doctor/edit/'.$doctor->doctor_id,'class'=>'form-horizontal form-bordered form-row-stripped','method' => 'PUT','files'=>true)) }}
          

          应该是这样的

          {{ Form::open(array('url' => 'admin/doctor/edit/'.$doctor->doctor_id,'class'=>'form-horizontal form-bordered form-row-stripped','method' => 'POST','files'=>true)) }}
          

          【讨论】:

            【解决方案6】:

            我的问题不是我的路线设置不正确,而是我引用了错误的 Form 方法(我从不同的表单中复制了该方法)。我在做...

            {!! Form::model([ ... ]) !!}
            

            (未指定型号)。但我应该一直使用常规的open 方法...

            {!! Form::open([ ... ]) !!}
            

            因为model 的第一个参数需要一个实际模型,所以它没有得到我指定的任何选项。希望这可以帮助那些知道他们的路线是正确的但有其他问题的人。

            【讨论】:

              【解决方案7】:

              我也有同样的错误,但有不同的修复,在我的XYZ.blade.php 我有:

              {!! Form::open(array('ul' => 'services.store')) !!}
              

              这给了我错误,-我仍然不知道为什么-但是当我将其更改为

              {!! Form::open(array('route' => 'services.store')) !!}
              

              成功了!

              我认为值得分享:)

              【讨论】:

                【解决方案8】:

                一般情况下,使用的 HTTP 动词有错误,例如:

                使用POST 请求调用PUT 路由

                【讨论】:

                  【解决方案9】:

                  问题是您正在使用POST,但实际上您必须执行PATCH 要修复此添加

                  <input name="_method" type="hidden" value="PATCH">
                  

                  就在Form::model 行之后

                  【讨论】:

                  • 在 Laravel 中,您可以在模板中使用 {{ method_field('PATCH') }}
                  【解决方案10】:

                  当我遇到这些问题时,我遇到了 2 个代码错误

                  {!! Form::model(['method' => 'POST','route' => ['message.store']]) !!}
                  

                  我通过这样做纠正了它

                  {!! Form::open(['method' => 'POST','route' => 'message.store']) !!}
                  

                  所以只是为了说明我将model 的形式更改为open 以及错误放置在方括号中的路线。

                  【讨论】:

                    【解决方案11】:

                    在我的例子中,我通过 HTTP 向服务器发送了一个 POST 请求,在该服务器上我设置了 Nginx 以将所有请求重定向到端口 80 到端口 443 我正在为该应用程序提供服务超过HTTPS

                    向正确的端口发出请求直接解决了问题。就我而言,我所要做的就是将请求 URL 中的 http:// 替换为 https://,因为我分别使用了默认端口 80443

                    【讨论】:

                    • 这是我面临的问题,这个答案被证明是解决方案。谢谢
                    【解决方案12】:

                    出于安全原因,Laravel 有时不支持 {!! Form::open(['url' =&gt; 'posts/store']) !!}。这就是错误发生的原因。您只需替换以下代码即可解决此错误

                    {!! Form::open(array('route' => 'posts.store')) !!}
                    




                    错误代码{!! Form::open(['url' =&gt; 'posts/store']) !!}

                    正确代码{!! Form::open(array('route' =&gt; 'posts.store')) !!}

                    【讨论】:

                      【解决方案13】:

                      在我的情况下,这是因为我的表单发送到具有不同中间件的路由。所以它阻止了向这个特定路由发送信息。

                      【讨论】:

                        【解决方案14】:

                        通常MethodNotAllowedHttpException 发生在

                        路由方法不匹配。

                        假设你定义了POST请求路由文件,但是你发送GET请求到路由。

                        【讨论】:

                          【解决方案15】:

                          那是因为您是通过 get 方法发布数据。

                          代替

                          Route::get('/validate', 'MemberController@validateCredentials');
                          

                          试试这个

                          Route::post('/validate', 'MemberController@validateCredentials');
                          

                          【讨论】:

                          • 这是正确的,如果用户不这样做,版主能否将其设为正确答案?这是第三个答案,也是唯一一个正确的答案。
                          【解决方案16】:
                          // not done
                          Route::post('`/posts/{id}`', 'PostsController@store')->name('posts.store');
                          
                          return redirect('`/posts'`)->with('status','Post was created !');
                          
                          // done
                          Route::post('`/posts`', 'PostsController@store')->name('posts.store');
                          
                          return redirect('`/posts'`)->with('status','Post was created !');
                          

                          【讨论】:

                          • 你能解释一下这段代码在做什么以及它是如何解决问题的吗?
                          【解决方案17】:

                          正如rebduvid 回答的here,您可以如下使用Route::match

                          Route::match(['get', 'post'], 'results',[
                                  'as' => 'results_path',
                                  'uses' => 'SearchController@results' ]);
                          

                          根据您的逻辑更新参数

                          【讨论】:

                            【解决方案18】:

                            就我而言,我遇到了一个受身份验证保护的端点,而我的身份验证令牌无效。获得一个新的令牌解决了这个问题。这是我正在处理的一个新的旧项目,因此实施中可能存在某些问题。

                            【讨论】:

                              【解决方案19】:

                              在我的情况下,它可以检查 https 协议,当服务器使用 https 时,我在邮递员中定义了一个使用 http 的路由。我刚刚纠正了它,它对我有用

                              【讨论】:

                                猜你喜欢
                                • 2014-09-16
                                • 2014-07-30
                                • 2016-04-23
                                • 1970-01-01
                                • 2019-05-15
                                • 2019-03-12
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                相关资源
                                最近更新 更多