在我的应用程序中,我创建了一个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;
}
}
答案 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')
获得参与者的实例。