Как бороться с условной валидацией в Laravel? - PullRequest
2 голосов
/ 30 октября 2019

У меня есть ситуация, и, к сожалению, я не уверен, как ее правильно разобрать. У меня ниже скрипт

$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 голосов
/ 30 октября 2019

Я бы пошел с required_if правилом проверки.

Так что в вашем случае, отправит два поля, тип может быть скрытым полем, например, затем на game_idвы добавите

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

и т. д. И, конечно, вы можете настроить сообщения об ошибках.

0 голосов
/ 30 октября 2019

Попробуйте этот фрагмент кода

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)
{

}
0 голосов
/ 30 октября 2019

Вы можете написать свои условия до проверки.

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

Надеюсь, это поможет. Приветствия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...