Laravel 6 - Лучший способ повторно использовать существующие валидаторы запросов в других валидаторах запросов - PullRequest
0 голосов
/ 15 января 2020

Допустим, есть два Laravel ресурса API Book и Author, каждый с некоторыми правилами для проверки запроса store.

Затем есть третий ресурс API, где потребители API могут опубликовать определенную вещь вместе с Book и Author. То есть запрос store должен принимать объект Book, объект Author и третий объект FooBar:

// sample POST body
{
  "book": {...book object...},
  "author": {...author object...},
  "foobar": {...foobar object...}
}

В проверке FooBarRequest rules() , имеет смысл повторно использовать BookRequest::rules() и AuthorRequest::rules(), но это не работает:

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class FooBarRequest extends FormRequest
{
    public function rules()
    {
        $bookRules = BookRequest::$validationRules;
        $authorRules = AuthorRequest::$validationRules;

        return [
            'book' => $bookRules,
            'authorRules' => $authorRules,
            'foobar' => 'required|...some rules...'
        ];
    }
}

Возможно, с использованием Laravel пользовательских правил , но это не помогает столько, что метод passes должен возвращать логическое значение (т. е. мы должны переписать все логи проверки c для каждого атрибута).

Есть ли какой-нибудь элегантный / официальный способ сделать это?

1 Ответ

1 голос
/ 15 января 2020

Проверьте этот ответ на Laracasts:

Если вы хотите использовать одни и те же правила проверки в нескольких местах, возможно, используйте черту, а затем используйте ее в нескольких запросах формы. Итак, для правил книги:

<?php

namespace App\Traits;

trait BookValidationTrait
{
    protected function bookRules ()
    {
        return [
            'book_input_1' => 'your rules here',
            'book_input_2' => 'your rules here',
            ...
        ]
    }
}

Тогда для правил автора:

<?php

namespace App\Traits;

trait AuthorValidationTrait
{
    protected function authorRules ()
    {
        return [
            'author_input_1' => 'your rules here',
            'author_input_2' => 'your rules here',
            ...
        ]
    }
}

Тогда в вашей форме запроса книги класс:

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use App\Traits\BookValidationTrait;

class BookRequest extends FormRequest
{
    use BookValidationTrait;

    public function rules()
    {
        return $this->bookRules();
    }
}

В вашем запросе формы автора class:

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use App\Traits\AuthorValidationTrait;

class AuthorRequest extends FormRequest
{
    use AuthorValidationTrait;

    public function rules()
    {
        return $this->authorRules();
    }
}

И, наконец, в вашем классе запроса формы FooBar:

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use App\Traits\BookValidationTrait;
use App\Traits\AuthorValidationTrait;

class FooBarRequest extends FormRequest
{
    use BookValidationTrait, AuthorValidationTrait;

    public function rules()
    {
        return array_merge(
            $this->bookRules(),
            $this->authorRules(),
            [
                'foobar_input_1' => 'your rules here',
                'foobar_input_2' => 'your rules here',
                ...
            ]
        );
    }
}

Я не проверял это, но, похоже, это может сработать.

...