繁体   English   中英

如何验证 Laravel 中的路由参数 5?

[英]How to validate Route Parameters in Laravel 5?

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

编辑:

路线:

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

Controller:

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

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

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

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

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

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

在你的rules方法中:

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

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',
    ];
}
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',
        ]);
}

假设有以下路线:

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()函数来接收请求和运行它的规则。 这个函数负责运行规则,如果某个规则失败,那么用户被重定向到之前的请求

最后,作为第二个选项,您可以使用表单请求验证 请记住,每个 GET 和 POST 值都可以通过 Request 类访问

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

使用 FormRequest 时,您可以通过向 class 添加 prepareForValidation 方法,将 URL 的值合并到输入数据中。

/**
 * Prepare the data for validation.
 *
 * @return void
 */
protected function prepareForValidation()
{
    // Add the url parameter id into the validation data
    // from a route such as /posts/{id}

    $this->mergeIfMissing(['id' => $this->id]); 
}
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);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM