【问题标题】:How to validate Route Parameters in Laravel 5?如何在 Laravel 5 中验证路由参数?
【发布时间】:2015-06-17 03:49:48
【问题描述】:

如你所知,Laravel 5 改变了你调用 validator 的方式,旧的方式是调用 validator facade,但现在在基本 Controller 类中有 ValidatesRequests 特征,但 validate 方法接受请求作为值数组,但是当您定义路由参数时,这些值不会存储在Request 中,那么如何验证这些参数?

编辑:

路线:

Route::get('/react-api/{username}', 'ProfileController@getUsername');

控制器:

public function getUsername(Request $request, $username)
{
     $v = $this->validate($request, ['username' => 'required']);
}

那么,我该如何验证这个用户名参数?

【问题讨论】:

  • 你能模仿你想要得到的东西吗?如果您提供更好的描述,我们当然可以让它工作
  • 我刚刚编辑了问题,希望我现在说清楚!
  • 哦,我明白了,让我编辑我的答案
  • L5 自动验证参数,只需输入提示即可(用户 $user)

标签: php validation laravel laravel-5


【解决方案1】:

假设以下路线:

Route::get('profile/{id}', 'ProfileController@show');

您仍然可以将id 参数验证为 L4 方式:

public function show(){
    $validator = \Validator::make(
        \Input::all(),
        [
             'id' => ['required', 'numeric']
        ]
    );

    // run validator here
}

如果您需要验证具体数据,请查看以下示例:

public function getUsername(Request $request, $username)
{
    $validator = \Validator::make(
        [
             'username' => $username
        ],
        [
             'username' => ['required']
        ]
    );

    // run the validator here
}

L5 允许您以另外两种方式进行操作。第一个,使用在控制器中注入的通用Request 类:

public function show(Request $request){
    $this->validate($request, [
        'id' => ['required', 'numeric']
    ]);

    // do stuff here, everything was ok
}

在 L5 中,您可以调用 validate() 函数来接收请求和运行它的规则。该函数负责运行规则,如果某些规则失败,则将用户重定向到上一个请求

最后,作为第二个选项,您可以使用Form request validation。请记住,每个 GET 和 POST 值都可以通过 Request 类访问

【讨论】:

  • 即使我做这个验证总是失败,当我调试验证方法时我发现 $request->all() 返回空数组?我在 ajax 请求中触发此路由。
  • 使用 Input::all() 代替,用于调试目的
  • 与 $request->all() 返回空数组相同,但是当我在控制器操作中指定第二个参数时,作为 $username 我得到了发送的值!
  • 这毫无意义。尝试在其他控制器或类似的东西中做一个验证器
  • 我最终使用验证器外观并验证旧方法!谢谢@manix!
【解决方案2】:

Manix 的回答对我不起作用,我遇到了与 Iliyass 相同的问题。问题是 FormRequest 不会自动使用路由参数。我最终在我的特定 FormRequest 类中覆盖了 all() 函数:

public function all()
{
    // Include the next line if you need form data, too.
    $request = Input::all();
    $request['username'] = $this->route('username');
    return $request
}

然后你就可以正常编码规则了:

public function rules()
{
    return [
        'username' => 'required',
    ];
}

【讨论】:

    【解决方案3】:
    public function listTurns($doctor_id, $limit, $offset)
    {
        $r = [
            'doctor_id' => $doctor_id,
            'limit' => $limit,
            'offset' => $offset,
        ];
    
        $validator = Validator::make($r, [
            'doctor_id' => 'required|numeric|min:1|exists:doctors,id',
            'limit' => 'required|numeric|min:1',
            'offset' => 'required|numeric|min:0',
        ]);
    }
    

    【讨论】:

      【解决方案4】:
      use Validator;
      
      public function getUsername($username)
      {
          $validator = Validator::make(['username' => $username], [
            'username' => 'required|string'
          ]);
      
          if ($validator->fails()) {
            return response()->json(['success' => false, 'errors' => $validator->messages()], 422);
          }
      }
      

      【讨论】:

        【解决方案5】:
        use Illuminate\Support\Facades\Validator;
        
        public function getUsername($username) {
            $validator = Validator::make(['username' => $username], [
              'username' => 'required'
            ]);
        
            if ($validator->fails()) {
              return response()->json(['status' => 'error'], 400);
            }
        }
        

        【讨论】:

          【解决方案6】:

          如果您打算直接在控制器方法中执行此操作,您可以执行以下操作:

              public function getUser(Request $request)
              {
                  $request->merge(['id' => $request->route('id')]);
                  $request->validate([
                      'id' => [
                          'required',
                          'exists:users,id'
                      ]
                  ]);
              }
          

          要在自定义 FormRequest 类中执行此操作,请添加以下内容:

              protected function prepareForValidation() 
              {
                  $this->merge(['id' => $this->route('id')]);
              }
          

          在你的rules 方法中:

              public function rules()
              {
                  return [
                      'id' => [
                          'required',
                          'exists:users,id'
                      ]
                  ];
              }
          

          【讨论】:

          • 好主意。在 Laravel 8 中,我们可以在合并时使用 $request->route()->parameter('id')。
          猜你喜欢
          • 2015-07-26
          • 2016-04-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-03-02
          • 2017-06-14
          相关资源
          最近更新 更多