【问题标题】:Laravel Validator returns MethodNotAllowedHttpException ErrorLaravel 验证器返回 MethodNotAllowedHttpException 错误
【发布时间】:2018-01-21 04:08:09
【问题描述】:

我有两个表单页面在我的路由中接受 POST 方法:

web.php

Route::post('select-room', ['as'=>'select-room','uses'=>'ClientBookingController@selectRoom']);
Route::post('book-room', ['as'=>'book-room','uses'=>'ClientBookingController@bookRoom']);

功能就是这样工作的。我将“select-room”页面中的数据提交到“book-room”

在“selectRoom”和“bookRoom”方法中有验证

public function selectRoom(Request $request){
        $this->validate($request, [
            'start_date' => 'required|date|after:yesterday',
            'end_date' => 'required|date|after:start_date',
            'number_people' => 'required', 
            'number_kids' => 'required'
        ]);
 }
 public function bookRoom(Request $request){
        $validator = Validator::make($request->all(), [
            'start_date' => 'required|date|after:yesterday',
            'end_date' => 'required|date|after:start_date',
            'people' => 'required',
            'days_staying' => 'required',
            'free_days' => 'required',
            'room' => 'required|array',
            'roomCost' => 'required|array',
            'roomPeople' => 'required|array',
            'totalCost' => 'required',
            'name' => 'required|string|max:255',
            'email' => 'required|email|string|max:255|unique:users',
            'password' => 'required|string|min:6|max:255|confirmed'
        ]);

        if ($validator->fails())
        {
            return redirect()->back()->withErrors($validator)->withInput();
        }
 }

当我提交数据并且它没有在 'bookRoom' 方法中验证时,验证会向 'select-room' url 发送一个 get 请求而不是 post 请求,我最终会遇到 MethodNotAllowedHttpException 错误。

我仍然理解 Laravel 是否有可能你不能有一个逻辑流程,你有一个帖子页面,然后发布到另一个帖子页面,如果在第二个帖子页面上失败将导致错误,因为你的路由只允许发布方法。验证功能是否限制您必须将获取请求作为错误的应急措施,或者我是否可以设置一些可以复制验证响应集中的发布请求的东西?

【问题讨论】:

  • 任何重定向都是使用 GET 执行的。您的表单应呈现为 GET 方法,并将数据提交为 POST 请求。
  • 感谢您的澄清。是否可以提供此过程的示例,假设“selectRoom”方法已经处理了帖子,如何将重定向到“book-room”作为 GET 以及我将如何传递数据。我已经研究过,但是如果您有任何链接,我可以参考以帮助我理解这将是很好的。

标签: php laravel validation


【解决方案1】:

要回答您的问题,您的选择房间路线方法应该是 any() 而不是 post()

但是您的流程有问题。您应该有一个显示选择的 GET 路线。一个 POST 路由,您在其中处理 POST 数据并在出现错误时返回 GET 路由。

【讨论】:

    【解决方案2】:

    任何redirects 都使用GET 执行。您的表单应该是rendered 作为GET 方法,数据submitted 作为POST 请求。因此,使用 get 为book-room 创建一个新的URL

    Route::post('select-room', ['as'=>'select-room','uses'=>'ClientBookingController@selectRoom']);
    Route::get('book-room', ['as'=>'book-room','uses'=>'ClientBookingController@showBookRoom']);
    Route::post('book-room', ['as'=>'book-room','uses'=>'ClientBookingController@bookRoom']);
    

    在你的控制器中-

    public function selectRoom(Request $request){
        $this->validate($request, [
            'start_date' => 'required|date|after:yesterday',
            'end_date' => 'required|date|after:start_date',
            'number_people' => 'required', 
            'number_kids' => 'required'
        ]);
        // Validate data
        // Persist data ready for displaying book-room using get
    
        return redirect('book-room');
    }
    public function showBookRoom()
    {
        return //your new view with post data from previous url
    }
    public function bookRoom(Request $request){
        $validator = Validator::make($request->all(), [
            'start_date' => 'required|date|after:yesterday',
            'end_date' => 'required|date|after:start_date',
            'people' => 'required',
            'days_staying' => 'required',
            'free_days' => 'required',
            'room' => 'required|array',
            'roomCost' => 'required|array',
            'roomPeople' => 'required|array',
            'totalCost' => 'required',
            'name' => 'required|string|max:255',
            'email' => 'required|email|string|max:255|unique:users',
            'password' => 'required|string|min:6|max:255|confirmed'
        ]);
    
        if ($validator->fails())
        {
            return redirect()->back()->withErrors($validator)->withInput();
        }
     }
    

    因此,每当您的第二个帖子fails 时,它将使用GET 请求将redirect 发送到中间URL。阅读 Laracastthis 帖子,你会有更好的理解。

    【讨论】:

      猜你喜欢
      • 2018-05-02
      • 2018-04-30
      • 2017-02-20
      • 1970-01-01
      • 1970-01-01
      • 2021-08-21
      • 1970-01-01
      • 1970-01-01
      • 2019-07-03
      相关资源
      最近更新 更多