我想尝试一些非常基本的运行。我已经习惯了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')); ?>
非常感谢任何帮助。
答案 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
来处理GET
,POST
和其他请求。
在我的情况下,我按原样离开了我的路线:
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 !');