laravel抛出MethodNotAllowedHttpException

时间:2013-11-04 02:00:25

标签: routing laravel laravel-4

我想尝试一些非常基本的运行。我已经习惯了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')); ?>

非常感谢任何帮助。

17 个答案:

答案 0 :(得分:186)

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

我会将“验证”的路由拆分为单独的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;
}

答案 1 :(得分:22)

问题是你正在使用POST,但实际上你必须执行PATCH 要解决此问题,请添加

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

在Form :: model行之后

答案 2 :(得分:20)

我怀疑问题在于您的路线定义。您将路由定义为“获取”请求,但表单可能正在发送“发布”请求。更改路线定义。

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

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

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

在表格中使用以下

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

答案 3 :(得分:11)

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

在我的情况下,我按原样离开了我的路线:

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

只需修改我的表单即可提交到store

中的FilesController功能

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

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

答案 4 :(得分:9)

通常MethodNotAllowedHttpException发生在

  

路由方法不匹配。

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

答案 5 :(得分:7)

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

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

你进入了你的路线。在相应的路线中将其更改为post

或者如果你想使用get方法,那么添加method param。

e.g。

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

答案 6 :(得分:6)

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

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

尝试

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

答案 7 :(得分: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)) }}

答案 8 :(得分:3)

通常在使用的HTTP动词中存在错误,例如: 使用POST请求调用PUT路由

答案 9 :(得分:3)

在我的情况下,我通过HTTP向服务器发送POST请求,我已经设置了nginx将所有请求重定向到端口80到我通过HTTPS服务应用程序的端口443。

将请求发送到正确的端口直接解决了问题。在我的情况下,我所要做的就是将请求URL中的(http://)替换为(https://),因为我分别使用默认端口80和443.

答案 10 :(得分:2)

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

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

这给了我错误, - 我现在仍然没有 - 但是当我把它改为

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

有效!

我认为值得分享:)

答案 11 :(得分:2)

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

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

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

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

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

答案 12 :(得分:0)

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

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

我通过这样做纠正了

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

所以,只是为了阐述我将表格model更改为open以及错误地放在方括号中的路线。

答案 13 :(得分:0)

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

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




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

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

答案 14 :(得分:0)

在我的情况下,这是因为我的表单正在发送到具有其他中间件的路由。因此它阻止了向该特定路由发送信息。

答案 15 :(得分:0)

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

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

根据您的逻辑更新参数

答案 16 :(得分:-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 !');