Laravel 5.5 — проверка нескольких запросов формы — одновременно

Вопрос уже задан Вот за предыдущую версию laravel и пока не ответил.

у меня есть html form который проверяется с использованием трех разных Form Request Validations, Я могу сделать это. Но проблема в том, что валидация форм происходит одна за другой. Не в то же время.

Если в первом запросе формы выдается ошибка проверки, форма возвращается view поэтому остальные две формы не оцениваются, следовательно, правильная ошибка проверки не может быть отображена пользователю.

Что я хочу это: проверить форму с тремя запросами на проверку формы rules в то же время.

контроллер:

public function store(TransportationRequest $request1, PurchaseRequest $request2, SaleRequest $request3)
{
//do actions here
}

Я пытался унаследовать запросы формы по одному, но не удалось.

Редактировать :

Чтобы быть более конкретным на мой вопрос:

У меня есть три отдельные формы для purchase, transporataion а также sale которые индивидуально оцениваются с использованием PurchaseRequest, TransportationRequest а также SaleRequest для отдельных операций.

Но есть особый случай где одна форма обрабатывает purchase, transporataion и sale, Я хочу проверить форму, используя объединение трех правил запроса формы потому что я не хотел снова писать те же правила проверки.

это

Примечание. Поля в отдельных и комбинированных формах совпадают.

Спасибо..

0

Решение

FormRequest бросает Illuminate\Validation\ValidationException Исключение при сбое проверки, которое имеет redirectTo метод, и оттуда исключение Handler выполняет перенаправление.

Вы можете добиться желаемого поведения, запустив запросы формы вручную в контроллере в блоке try / catch, который фиксирует ошибки и объединяет пакеты ошибок перед перенаправлением, или, если важно, чтобы вы запускали их с помощью Laravel, внедряя их в свой контроллер, то вы потребуется добавить собственный обработчик исключений, который фиксирует все ошибки, объединяет их и затем перенаправляет после выполнения последнего запроса формы.

Тем не менее, стоит отметить, что оба эти подхода не очень хороши: они громоздки и могут причинить вам больше проблем, чем решить. Вам следует постараться придерживаться Laravel, как можно лучше, если вы хотите написать поддерживаемое приложение.

Запрос формы существует для проверки формы, поэтому каждая форма должна иметь один запрос формы, если вы хотите составить запрос формы из разных наборов правил, то это должно быть сделано в запросе формы, например:

  1. Определите ваш запрос формы для вашей формы php artisan make:request StoreMultipleForm
  2. От rules метод на StoreMultipleForm принести rules для каждого из других запросов формы и затем верните их вместе, например:

    /**
    * Get the validation rules that apply to the request.
    *
    * @return array
    */
    public function rules()
    {
    $formRequests = [
    TransportationRequest::class,
    PurchaseRequest::class,
    SaleRequest::class
    ];
    
    $rules = [];
    
    foreach ($formRequests as $source) {
    $rules = array_merge(
    $rules,
    (new $source)->rules()
    );
    }
    
    return $rules;
    }
    
  3. Используйте новый составленный запрос формы в вашем контроллере, например:

    public function store(StoreMultipleForm $request)
    {
    // Do actions here.
    }
    

Преимущества этого метода в том, что он самодостаточный, он придерживается одна форма одна форма запроса Ожидается, что это не требует изменений в запросах форм, которые вы комбинируете, и если вам нужно добавить дополнительные правила, уникальные для этой формы, вы можете сделать это без создания другой Форма запроса.

3

Другие решения

Если я правильно понимаю, у вас есть 3 формы, каждая из которых имеет свою собственную форму запроса, чтобы иметь дело с соответствующей проверкой. У вас также есть другая форма, которая объединяет эти 3 формы где-то еще, и вы не хотите повторяться, переписывая эти правила проверки.

В этом случае я бы по-прежнему предлагал перейти с одного запроса формы, но попытаться объединить правила каждого из этих отдельных запросов. Например, вы используете статические методы для определения ваших правил в 3-х отдельных запросах формы, и каждый отдельный запрос вызывает свой собственный статический метод для их получения:

class TransportationRequest extends FormRequest
{
public static function getRules()
{
return []; // Return rules for this request
}

public function rules()
{
return static::getRules();
}
}

class PurchaseRequest extends FormRequest
{
public static function getRules()
{
return []; // Return rules for this request
}

public function rules()
{
return static::getRules();
}
}

class SaleRequest extends FormRequest
{
public static function getRules()
{
return []; // Return rules for this request
}

public function rules()
{
return static::getRules();
}
}

И тогда у вас есть комбинированный запрос объединить все три набора:

class CombinedRequest extends FormRequest
{
public function rules()
{
return array_merge(
TransportationRequest::getRules(),
SaleRequest::getRules(),
PurchaseRequest::getRules()
);
}
}

Тогда вы можете использовать сингл CombinedRequest в вашем методе контроллера. Конечно, если вам не нравится подход статического метода, в вашем комбинированном запросе rules метод, который вы могли бы просто new до каждого отдельного запроса и позвоните rules метод на каждом из них и объединить результаты.

class CombinedRequest extends FormRequest
{
public function rules()
{
$transportation = (new TransportationRequest())->rules();
$sale = (new SaleRequest())->rules();
$purchase = (new PurchaseRequest())->rules();

return array_merge(
$transportation,
$sales,
$purchase
);
}
}
2

Я бы создал черты, содержащие правила для каждого FormRequest — покупки, транспорации и продажи. Используйте признак в его конкретном FormRequest, а затем, когда вам понадобятся все правила, вы можете использовать все три признака в объединенном FormRequest и объединить массивы правил.

1

Вы можете объединить все правила и проверить вручную:

$allRules = (new TransportationRequest)->rules() + (new PurchaseRequest)->rules() + (new SaleRequest)->rules();
Validator::make($request->all(), $allRules)->validate();
1
По вопросам рекламы [email protected]