【问题标题】:custom validation, method not allowed on error自定义验证,错误时不允许的方法
【发布时间】:2017-09-27 08:07:10
【问题描述】:
<form method="post" action="{{action('PLAYERController@update', $ply->reg_no)}}">
    {{csrf_field()}}

在自定义验证中获取方法不允许异常返回错误。尝试在 csrf 字段中提及 PUT、PATCH 和 DELETE。还是不行。

更新

使用 post 作为表单方法。使用 method_field('POST')。没有为更新函数定义 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');

    }

【问题讨论】:

  • 提供路由和刀片代码

标签: laravel


【解决方案1】:

Method not allowed 表示您没有为发生的请求设置路由。有两种可能:

表单提交的路由没有设置

您向我们展示的代码不包含任何method_field(...),因此看起来您正在执行正常的POST。所以你需要一个对应的POST 路由,比如:

Route::post('/some/path', 'PLAYERController@update');

未设置验证响应失败的路由

我猜这就是问题所在。假设您在pageX,并且您通过POST 登陆这里。您已经设置了发布路线,以便您可以登陆此页面。现在,您从这个页面提交了您向我们展示的表单,但验证失败。当这种情况发生时,Laravel 会执行 GET 重定向回 pageX。但是你没有为pageX 设置GET 路由,所以你会得到一个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

更新

根据您的 cmets,我认为实际上是您的初始 POST 失败了。再次检查您的代码,我认为您的action() 语法不正确。

According to the docs,如果action() helper 中指定的方法带参数,则必须指定为数组:

action="{{ action('PLAYERController@update', ['reg_no' => $ply->reg_no]) }}"

【讨论】:

  • 仍然是错误。 Route::post('/player/update/{reg_no}', 'PLAYERController@update'); Route::get('/player/update/{reg_no}', 'PLAYERController@update');
  • @KenGraham 如果您查看浏览器开发工具的网络选项卡,失败的请求是什么?
  • http://localhost:8000/player/update/555 使用 post 方法。 405 method not allowed
  • @KenGraham 好的,我认为您的初始 POST 失败,因为您的 action() 语法错误。我已经更新了我的答案。
  • 方法字段已使用帖子,帖子错误消失。并且重定向显示错误。
【解决方案2】:

如果您的更新路线使用patch 方法(例如Route::patch('.....');),则在您的更新表单中在{{csrf_field()}} 下方添加此{{ method_field('PATCH') }}

更新

如果你没有使用PATCH 方法更新路由,试试这个:

Route::patch('player/update/{reg_no}', 'PLAYERController@update')-&gt;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;命名空间

【讨论】:

  • 提交表单后或打开包含表单的页面时是否出现错误?另外,如果您认为这与您的自定义验证器有关,请尝试先不要使用它,看看它是否有效@KenGraham
  • 当我回去刷新时,它就来了
  • 好吧,如果我的回答不正确,我无法弄清楚您的代码出了什么问题。也许你需要在你的问题中提供细节,比如你正在使用的实际更新路线,也许还有更新方法@KenGraham
  • 当我以 5000 的倍数添加 sold_amount 时,一切正常(这是验证)。但不适用于 5000 的倍数。
  • 那么,您能否在您的问题中再次添加自定义验证码? @KenGraham
【解决方案3】:

命名空间 App\Http\Controllers;

使用应用\用户;

使用 App\Http\Controllers\Controller;

类 UserController 扩展控制器 {

/**
 * Show the profile for the given user.

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

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

希望这会有所帮助:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-18
    • 1970-01-01
    • 2017-05-28
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多