<form method="post" action="{{action('PLAYERController@update', $ply->reg_no)}}">
{{csrf_field()}}
使用false返回自定义验证时获取方法不允许例外。试着在csrf字段中提到PUT,PATCH和DELETE。不过,不起作用。
更新
使用post for form方法。使用method_field(&#39; POST&#39;)。没有定义更新函数的get方法。如果我从错误页面返回到表单页面并按下刷新,则会显示验证消息。
更新2
Validator::extend('check_sold_amount', function($attribute, $value, $parameters, $validator) {
if(($value%5000)==0)
{
return true;
}
return false;
});
}
更新3
控制器代码
public function update(Request $request, $reg_no)
{
//
$this->validate($request, [
'sold_amount' => 'required|check_sold_amount',
'sold_to_team'=>'required'
]);
$ply = Player::find($reg_no);
$ply->sold_amount = $request->get('sold_amount');
$ply->sold_to_team = $request->get('sold_to_team');
$team_name=$ply->sold_to_team;
$team=Team::find($team_name);
if($ply->category=='indian')
{
$team->indian_players=$team->indian_players+1;
}
else {
$team->foreign_players=$team->foreign_players+1;
}
$team->balance=$team->balance-$ply->sold_amount;
$ply->save();
$team->save();
//return view('player.index');
}
答案 0 :(得分:0)
如果您的更新路线使用patch
方法(例如Route::patch('.....');
),请在更新表单中的{{ method_field('PATCH') }}
下方添加{{csrf_field()}}
<强>更新强>
如果您没有使用PATCH
方法进行更新路由,请尝试以下操作:
Route::patch('player/update/{reg_no}', 'PLAYERController@update')->name('plyupdate');
然后以下面的表格形式:
<form method="POST" action="{{route('plyupdate', $ply->reg_no)}}">
{{csrf_field()}}
{{ method_field('PATCH') }}
//Necessary input fields and the submit button here
</form>
这种方式对我来说总是很好。如果它仍然无效,可能是控制器中的更新方法出现了问题
<强>更新强>
未经测试,在您的更新方法中试试这个:
public function update(Request $request, $reg_no) {
$input = $request->all();
$ply = Player::find($reg_no);
$validate = Validator::make($input, [
'sold_amount' => 'required|check_sold_amount',
'sold_to_team'=>'required'
]);
if ($validate->fails()) {
return back()->withErrors($validate)->withInput();
}
$ply->sold_amount = $request->get('sold_amount');
$ply->sold_to_team = $request->get('sold_to_team');
$team_name=$ply->sold_to_team;
$team=Team::find($team_name);
if($ply->category=='indian') {
$team->indian_players=$team->indian_players+1;
}
else {
$team->foreign_players=$team->foreign_players+1;
}
$team->balance=$team->balance-$ply->sold_amount;
$ply->save();
$team->save();
return view('player.index');
}
不要忘记添加use Validator;
命名空间
答案 1 :(得分:0)
Method not allowed
表示您没有为发生的请求设置路由。有两种可能性:
未设置表单提交的路由
您向我们展示的代码不包含任何method_field(...)
,因此您看起来正常POST
。所以你需要一个相应的POST
路线,如:
Route::post('/some/path', 'PLAYERController@update');
未设置验证响应失败的路径
我猜这是问题所在。假设您在pageX
,并且您通过POST
来到这里。您有一个邮政路线设置,以便您可以登陆此页面。现在,从此页面,您提交您向我们展示的表单,但验证失败。当发生这种情况时,Laravel会将GET
重定向回pageX
。但是您没有为GET
设置pageX
路由,因此您将获得Method not allowed
。
除了当前页面的POST
路由外,还需要GET
路由来处理失败的验证。
此外,您说Tried mentioning PUT, PATCH and DELETE inside csrf field
- 正如其他人所指出的那样,您应该使用method_field()
欺骗表单方法,例如:
<form ...>
{{ csrf_field() }}
{{ method_field('PATCH') }}
Laravel form method spoofing docs
<强>更新强>
根据您的评论,我认为实际上您的初始POST失败了。再次检查您的代码,我认为您的action()
语法不正确。
According to the docs,如果action()
帮助器中指定的方法接受参数,则必须将它们指定为数组:
action="{{ action('PLAYERController@update', ['reg_no' => $ply->reg_no]) }}"
答案 2 :(得分:0)
命名空间App \ Http \ Controllers;
使用App \ User;
使用App \ Http \ Controllers \ Controller;
类UserController 扩展控制器 {
/**
* Show the profile for the given user.
........................
您是否引用了验证请求控制器?
希望这会有所帮助:)