Laravel 5.7 - 覆盖请求验证类中的 all() 方法以验证路由参数?

Posted

技术标签:

【中文标题】Laravel 5.7 - 覆盖请求验证类中的 all() 方法以验证路由参数?【英文标题】:Laravel 5.7 - Override all() method in Request validation Class to validate route parameters? 【发布时间】:2019-02-23 09:48:37 【问题描述】:

我想在请求验证类中验证路由参数。我知道这个问题之前已经被问过很多次了,但是According to this question 我覆盖了all() 方法,我收到了这个错误:

Class App\Http\Requests\DestroyUserRequest does not exist

我正在使用 Laravel 5.7。

路线:

Route::delete('/user/userId/delete', 'UserController@destroy')->name('user.destroy');

控制器:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests\DestroyUserRequest;
use App\User;

class UserController extends Controller


    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return Response
     */
    public function destroy(DestroyUserRequest $request)
    
        User::find($request->route('userId'))->delete();
        return $request->route('userId');
    

DestroyUserRequest:

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class DestroyUserRequest extends FormRequest

    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    
        return true;
    

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    
        return [
            'userId' => 'integer|exists:users,id'
        ];
    

    public function all()
    
        $data = parent::all();
        $data['userId'] =  $this->route('userId');
        return $data;
    

重写 all() 方法有什么问题?

【问题讨论】:

显然自动加载器找不到这个类。你把它放在正确的文件夹app/Http/Requests 中了吗?你试过运行composer dump-autoload吗? @jedrzej.kurylo 是的,我将文件放在正确的文件夹中。当我从 DestroyUserRequest 类中删除 all() 方法时,错误将得到解决!我真的很困惑! @jedrzej.kurylo 我运行composer dump-autoload,但问题没有解决。 【参考方案1】:

Laravel 8+

    /**
     * Get all of the models from the database.
     *
     * @param  array|mixed  $columns
     * @return \Illuminate\Database\Eloquent\Collection|static[]
     */
    public static function all($columns = ['*'])
    
        $data = parent::all($columns);
        $data['userId'] =  $this->route('userId');
        return $data;
    

【讨论】:

【参考方案2】:

你得到的错误似乎很奇怪。我相信问题出在这里,因为您的方法签名与父方法不同。

应该是:

public function all($keys = null)

    $data = parent::all($keys);
    $data['userId'] =  $this->route('userId');
    return $data;

因为Illuminate/Http/Concerns/InteractsWithInput.php的签名是:

/**
 * Get all of the input and files for the request.
 *
 * @param  array|mixed  $keys
 * @return array
 */
public function all($keys = null)

更改是在 Laravel 5.5 中进行的。你可以在upgrade guide阅读:

所有方法

如果您要覆盖 Illuminate\Http\Request 的 all 方法 类,您应该更新您的方法签名以反映新的 $keys 参数:

公共函数全部($keys = null)

【讨论】:

以上是关于Laravel 5.7 - 覆盖请求验证类中的 all() 方法以验证路由参数?的主要内容,如果未能解决你的问题,请参考以下文章

如何覆盖验证规则登录 Laravel\Fortify?

Laravel 5.5 无法在表单请求类中制作验证器

如何修复“文件上传失败。”使用任何图像上传验证时出错 - Laravel 5.7

Laravel 5.7 + Spatie 权限 + JWT 身份验证

API 验证 laravel 5.7

Laravel: SQLSTATE[HY000] [2054] 服务器请求客户端未知的身份验证方法