在Laravel中验证对象而不是值

时间:2015-05-30 09:29:34

标签: validation eloquent laravel-5

在我的应用程序中,我创建了一个POST表单,其中包含一个Object的ID。

当我发布表单时,我想验证对象的一组规则,例如对象的年龄和模型关系。我创建了一个自定义ValidationTrait。

我想传递整个Eloquent模型,而不是将值放在$ input中。我怎么能这样做?

class AddParticipantToCourseFormRequest extends BaseRequest {
    public function getInput($includeFiles = false)
        {
            $participantId = Input::get('participant_id');
            $participant = Participant::find($participantId);
            $input[ 'participant' ] = $participant;
            return $input;
        }
}

1 个答案:

答案 0 :(得分:1)

在Laravel 5中,您可以创建Custom Validation Rules。因此,您可以定义自定义验证规则,让我们说ValidObject并将其分配给您的表单请求验证规则:

$rules = [
    .....
    'paritipant_id' => 'required|ValidObject',
];

要为ValidObject创建自定义验证规则,您可以将此代码放入新的或现有的服务提供程序启动方法中:

Validator::extend('ValidObject', function($attribute, $value, $parameters)
{
    try {
        $participant = Participant::find($value);
        return $participant->your_check_here() = true;
    } catch (\Exception $e) {
        return false;
    }
});

修改

如果您想在验证过程之前替换某些输入值,您可以创建一个中间件并替换那里的输入。

php artisan make:middleware ReplaceParticipantMiddleware

然后转到生成的类,并在handle方法中替换值

public function handle($request, Closure $next) {
    try {
        $input = $request->all();
        $input['participant_id'] = Participant::find($input['participant_id']);
        $request->replace($input);
    } catch (\Exception $e) {
        // you error handling here
    }

    return $next($request);
}

不要忘记将此中间件添加到将在routes.php中包含此participant_id的路由

Route::get('/', [
     'middleware' => 'App\Http\Middleware\ReplaceParticipantMiddleware', 
     'uses' => 'WelcomeController@index'
]);

现在拥有此中间件的路由在提交particpant_id时将始终通过$request->input('particpant_id')获得参与者的实例。