自定义验证,错误时不允许的方法

时间:2017-09-26 08:07:44

标签: laravel

<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');

    }

3 个答案:

答案 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.

........................

您是否引用了验证请求控制器?

希望这会有所帮助:)