如何在Laravel中处理基于条件的验证?

时间:2019-10-30 09:09:52

标签: php laravel laravel-5

我遇到了一个情况,不幸的是不确定如何正确地解决问题。我有以下脚本

$validator = Validator::make(
    $request->all(), 
    [
        'game_id' => 'required|integer'
    ],
    $messages
);

if ($validator->fails()) {    
    $response = $validator->messages();
}else{
    $response = $gameService->setStatus($request);
} 

现在每个游戏都有不同的类型,我想代表类型添加验证。例如,如果一个游戏是Task Based,那么我将添加time的验证,这仅对基于任务的游戏是强制性的,否则对于其他类型是可选的。

我有三种游戏

1-基于等级 2-基于任务 3-基于时间

在类型表中,每个游戏都有类型。

那么有什么方法可以添加验证?我想在验证功能中做到这一点。

非常感谢。

3 个答案:

答案 0 :(得分:0)

您可以在验证之前写下您的条件。

$data = $request->all();
if ($data['game_id'] == 1) {
    $rules = [
        // level_based validation
    ];
} else if($data['game_id'] == 2) {
    $rules = [
        // task_based validation
    ];
} else {
    $rules = [
        // time_based validation
    ];
}
$validator = Validator::make($data, $rules);

希望有帮助。干杯。

答案 1 :(得分:0)

我会遵循required_if验证规则。

因此,在您的情况下,将发送两个字段,例如,类型可以是隐藏字段,然后在game_id上添加

'game_id' => 'required_if:type,1'

等等。当然,您可以自定义错误消息。

答案 2 :(得分:0)

尝试此代码段

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;

class CreateGameRequest extends FormRequest
{

    public function authorize()
    {
        return true;
    }


    public function rules()
    {
        try {

            $request    = $this->request->all();
            $rule_array = collect();
            $rule1 =   [
                'game_id' => 'required|integer'
            ]
            $rule_array = $rule_array->merge($rule1);

            if(isset($request->task_id))
            {
                $rule2 =   [
                    'task_id' => 'required|integer'
                ]
            }

            $rule_array = $rule_array->merge($rule2);
            return $rule_array->all();

        } catch (Exception $e) {
            return $e;
        }
    }



    public function messages(){

        return [
            'game_id' => 'Please select valid game',
            'task_id' => 'Please select valid task'            
        ];

    }
}

然后在控制器功能中调用此请求类

use App\Http\Requests\CreateGameRequest;

public function game(CreateGameRequest $request)
{

}