laravel抛出MethodNotAllowedHttpException


110

我正在尝试一些非常基本的操作。我已经习惯了CI,现在正在学习Laravel 4,而他们的文档并不容易!无论如何,我试图创建一个登录表单,只是通过在下一个表单中打印数据来确保成功发布了数据。我收到此异常:

Symfony \组件\ HttpKernel \异常\ 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错误中?
devo

你试过了php artisan dump-autoload吗?
Andreyco

旧帖子,但人们仍然迷迷糊糊-尝试“ composer dump-autoload”。为我工作。
基尔吉

@Andreyco这个命令没有定义。
马塞洛Agimóvel

Answers:


198

您收到该错误的原因是要发布到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;
}

25

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

您已将路线定义为GET请求,但表单可能正在发送POST请求。更改您的路线定义。

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

通常,更好的做法是使用命名路由(如果控制器方法/类发生更改,则有助于扩展)。

Route::post('/validate', array(
    'as' => 'validate',
    'uses' => 'MemberController@validateCredentials'
));

在表格中使用以下内容

<?php echo Form::open(array('route' => 'validate')); ?>

23

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

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

Form::model下线


1
在Laravel中,您可以{{ method_field('PATCH') }}在模板中使用。
Michael Yousrie

13

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

代替

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

试试这个

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

这是正确的,如果用户不愿意,主持人可以做出正确的答案吗?这是第三个答案,这是唯一正确的答案。
logos_164 '19

12

我遇到了这个问题,以及这里的其他答案是有帮助的,但是我用的是Route::resource这需要照顾GETPOST以及其他请求。

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

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

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

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

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


9

通常MethodNotAllowedHttpException发生在

路线方法不匹配。

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


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

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

你有GET自己的路线。将其更改POST为相应的路线。

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

例如

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

4

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

{{ 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)) }}

4

就我而言,我正在将POST请求发送HTTP到服务器,该服务器已设置Nginx为将所有请求重定向80443我通过该服务为其提供服务的端口HTTPS

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


这就是我面临的问题,而这个答案被证明是解决方案。谢谢
Oluwatobi塞缪尔·奥米萨金

3

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

PUTPOST要求的呼叫路线


2

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

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

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

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

因为第一个参数需要model实际模型,所以没有得到我指定的任何选项。希望这可以帮助知道自己路线正确的人,但其他地方不对。


2

我也遇到了相同的错误,但修复方法不同,XYZ.blade.php我有:

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

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

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

有效!

我认为值得分享:)


0

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

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




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

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


0

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


0

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

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

我通过这样做纠正了它

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

所以只是为了阐述我改变的形式modelopen,也错误地在那里放置在方括号的路由。


-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 !');

您能否解释一下这段代码在做什么以及如何解决该问题?
newUserName02 '19
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.