112

我试图让一些非常基本的东西运行起来。我习惯了 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')); ?>

任何帮助将不胜感激。

4

19 回答 19

200

您收到该错误是因为您正在发布到GET路线。

我会将您的路由拆分为validate单独的GET路由POST

新航线:

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;
}
于 2013-11-04T13:29:16.457 回答
27

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

您将路由定义为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>
于 2013-11-04T06:18:32.290 回答
23

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

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

就在Form::model线路之后

于 2016-09-25T10:07:42.770 回答
13

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

代替

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

尝试这个

Route::post('/validate', 'MemberController@validateCredentials');
于 2018-11-27T08:22:17.717 回答
12

我也遇到了这个问题,这里的其他答案很有帮助,但我使用的是一个Route::resource处理GET,POST和其他请求的方法。

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

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

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

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

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

于 2014-09-05T19:35:50.480 回答
10

通常MethodNotAllowedHttpException发生在

路由方法不匹配。

假设您定义了POST请求路由文件,但您向GET路由发送请求。

于 2018-10-11T19:03:05.723 回答
7
<?php echo Form::open(array('action' => 'MemberController@validateCredentials')); ?>

默认情况下,Form::open()假定一个POST方法。

你有GET你的路线。将其更改为POST在相应的路线中。

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

例如

Form::open(array('url' => 'foo/bar', 'method' => 'get'))
于 2013-11-04T06:46:40.997 回答
4

我遇到了错误,
问题是FORM METHOD

{{ 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)) }}
于 2014-11-16T05:42:49.540 回答
4

就我而言,我正在向服务器发送一个POST请求,HTTP在该服务器上我设置了Nginx将所有请求重定向到端口80443我为应用程序提供服务的端口HTTPS

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

于 2018-06-01T02:48:09.590 回答
3

通常,使用的 HTTP 动词有错误,例如:

请求调用PUT路由POST

于 2016-06-21T16:26:30.193 回答
2

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

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

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

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

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

于 2015-05-21T05:14:06.293 回答
2

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

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

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

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

有效!

我认为值得分享:)

于 2016-06-11T21:03:33.880 回答
0

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

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

我通过这样做纠正了它

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

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

于 2017-12-05T15:31:24.037 回答
0

就我而言,这是因为我的表单发送到具有不同中间件的路由。因此它阻止了向该特定路由发送信息。

于 2018-08-13T00:38:06.827 回答
0

正如rebduvid在这里回答的 那样,您可以使用Route::match如下

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

根据您的逻辑更新参数

于 2021-04-07T10:44:16.607 回答
0

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

于 2021-10-30T23:03:33.820 回答
0

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

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




错误码{!! Form::open(['url' => 'posts/store']) !!}

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

于 2018-06-21T16:10:30.013 回答
0

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

于 2021-09-15T17:23:33.297 回答
-1
// 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 !');
于 2019-04-04T21:24:16.263 回答