【问题标题】:Validate an object instead of a value in Laravel在 Laravel 中验证一个对象而不是一个值
【发布时间】:2015-05-31 00:37:50
【问题描述】:

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

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

我不想将值放入 $input,而是传递整个 Eloquent 模型。我该怎么做?

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

【问题讨论】:

    标签: validation eloquent laravel-5


    【解决方案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 中包含此参与者 ID 的路由中

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

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

    【讨论】:

    • 那是我做的,但我想将参与者传递给验证功能,因为我需要测试多个规则。我想避免做 $participant = Participant::find($value);多次。
    • @Nealv 啊,现在我明白你想要达到的目标了。查看我的编辑。
    • 是的,这可行,但验证不会在该字段上触发
    • 我使用表单请求,并在我的 getInput() 函数中执行: $input[ 'participant' ] = $participant;所以 $input['participant'] 包含模型对象。在我的规则中是有'参与者'=>'年龄:15'。但是当输入值是对象而不是字符串(或其他基本对象,如 int、float ..)时,不会触发验证规则
    • 没关系,出于某种奇怪的原因,它不起作用,但现在它起作用了。感谢您的帮助。
    猜你喜欢
    • 2019-10-01
    • 2019-11-09
    • 2019-05-18
    • 2012-03-21
    • 1970-01-01
    • 2022-10-02
    • 2011-11-13
    • 2021-01-11
    • 1970-01-01
    相关资源
    最近更新 更多