laravel抛出MethodNotAllowedHttpException

spa*_*key 102 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');
        }
    }
Run Code Online (Sandbox Code Playgroud)

和路线有:

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

Route::get('/members', 'MemberController@index');
Route::get('/validate', 'MemberController@validateCredentials');
Run Code Online (Sandbox Code Playgroud)

最后我的观点login.php有这个表单方向:

<?php echo Form::open(array('action' => 'MemberController@validateCredentials')); ?>
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激.

hay*_*rse 195

您收到该错误,因为您正在发布到GET路由.

我会将您的路由"split"拆分为单独的GET和POST路由.新路线:

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

Route::get('validate', function () {
    return View::make('members/login');
});
Run Code Online (Sandbox Code Playgroud)

然后你的控制器方法就可以了

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


Ble*_*ing 23

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

Route::post('/validate', 'MemberController@validateCredentials');
Run Code Online (Sandbox Code Playgroud)

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

Route::post('/validate', array(
    'as' => 'validate',
    'uses' => 'MemberController@validateCredentials'
));
Run Code Online (Sandbox Code Playgroud)

在表单中使用以下内容

<?php echo Form::open(array('route' => 'validate')); ?>
Run Code Online (Sandbox Code Playgroud)


小智 23

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

<input name="_method" type="hidden" value="PATCH">
Run Code Online (Sandbox Code Playgroud)

就在Form :: model行之后


Dan*_*Dan 12

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

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

store

并简单地修改我的表单以提交到FilesController我的功能POST

Route::resource

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


小智 11

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

代替

Route::get('/validate', 'MemberController@validateCredentials');
Run Code Online (Sandbox Code Playgroud)

试试这个

Route::post('/validate', 'MemberController@validateCredentials');
Run Code Online (Sandbox Code Playgroud)


kou*_*nto 9

通常MethodNotAllowedHttpException发生在,

路线方法不匹配.

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


ita*_*chi 7

Form::open()

默认情况下,POST假设GET方法.

你进入了你的路线.将其更改POST为相应的路线.

或者如果要使用get方法,则添加GET参数.

例如

method


iSW*_*ORD 5

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

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