Routing laravel抛出方法不允许HttpException

Routing laravel抛出方法不允许HttpException,routing,laravel,laravel-4,Routing,Laravel,Laravel 4,我正在试着让一些非常基本的东西运转起来。我已经习惯了CI,现在正在学习Laravel 4,他们的文档并没有让这变得容易!无论如何,我正在尝试创建一个登录表单,并通过在下一个表单中打印数据来确保数据发布成功。我得到一个例外: Symfony\Component\HttpKernel\Exception\ MethodNotAllowedHttpException 和my MemberController.php: public function index() {

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

Symfony\Component\HttpKernel\Exception\ MethodNotAllowedHttpException

和my 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');
最后,my view login.php具有以下表单方向:

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


任何帮助都将不胜感激。

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

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

Route::post('/validate',[MemberController::class',validateCredentials']);
通常更好的做法是使用命名路由(如果控制器方法/类发生更改,则有助于扩展)

Route::post('/validate',[MemberController::class',validateCredentials']))
->名称('member.validateCredentials');
在视图中,使用验证路由作为表单的操作

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

@csrf
...

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

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

新路线:

Route::post('validate','MemberController@validateCredentials');
路由::get('validate',函数(){
返回视图::make('members/login');
});
那么你的控制器方法就是

公共函数validateCredentials()
{
$email=Input::post('email');
$password=Input::post('password');
返回“电子邮件:.$Email.”和密码:.$Password;
}

我也遇到了这个问题,这里的其他答案很有帮助,但我使用的是一个
路由::资源
,它负责
获取
发布
和其他请求

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

Route::resource('file','filecontroller');
并简单地修改我的表单以提交到我的
filecontroller

{{Form::open(数组('route'=>'file.store'))}
这解决了这个问题,我认为值得单独指出,因为各种其他答案建议添加一条新的
POST
路线。这是一个选项,但不是必需的。

我遇到了错误,
问题是形式方法

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

我的问题不是我的路线设置不正确,而是我引用了错误的
表单
方法(我是从另一个表单复制的)。我在做

{!! Form::model([ ... ]) !!}
(未指定型号)。但是我应该使用常规的
open
方法

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

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

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

{!! Form::open(array('ul' => 'services.store')) !!}
这给了我一个错误-我仍然不知道为什么-但是当我把它改成

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


我觉得值得分享:)

一般来说,使用的HTTP动词有一个错误,例如:


使用
POST
请求调用
PUT
路由

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



就在
Form::model
行之后

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

{!! Form::model(['method' => 'POST','route' => ['message.store']]) !!}
我这样做纠正了它

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

因此,为了详细说明,我将形式
model
更改为
open
,以及错误放置在方括号中的路径。

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


向正确的端口发出请求直接修复了该问题。在我的例子中,我所要做的就是将请求URL中的
http://
替换为
https://
,因为我分别使用默认端口
80
443

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

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




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

正确代码{!!Form::open(array('route'=>'posts.store'))!!}在我的例子中,这是因为我的表单是用不同的中间件发送到路由的。因此它阻止了向这个特定路由发送信息。

通常
方法不允许HttpException
发生在

路由方法不匹配


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

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

而不是

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

Route::post('/validate', 'MemberController@validateCredentials');
正如您所回答的,您可以使用下面的路由::匹配

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

根据您的逻辑更新参数,其中
url
出现错误?您是否尝试过
php artisan dump autoload
?以前的帖子,但人们仍然会偶然发现它-尝试“composer dump autoload”。为我工作。@Andreyco此命令未定义。在Laravel中,您可以在模板中使用
{{method\u field('PATCH')}}
。您能解释一下此代码的作用吗
Route::post('/validate', 'MemberController@validateCredentials');
// 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 !');
Route::match(['get', 'post'], 'results',[
        'as' => 'results_path',
        'uses' => 'SearchController@results' ]);