@devkornev

Валидация форм в Laravel 5, как сделать проще и правильнее?

Осваиваю Laravel и пытаюсь выработать для себя удобный способ валидации форм. Хочется, чтобы правила были написаны для каждой модели только один раз и можно было удобно обращаться к этим правилам из контроллера. Сделал ниже приведенным способом, оно работает, но я не уверен, что это красиво и оптимально. Может Laravel как обычно может предложить, что-то более простое и красивое для подобного?

Модель:
namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Category extends Model
{
    const STATUS_DISABLE  =  0;
    const STATUS_ENABLE   = 10;

    // Разрешенные поля, необходимо при использовании create($request->all()).
    protected $fillable = ['title', 'slug', 'description', 'parent_id', 'status'];

    // Правила валидации.
    public static function rules() {
        return [
            'title'         => 'required|max:32',
            'slug'          => 'required|unique:categories|max:32',
            'parent_id'     => 'required|integer',
            'status'        => 'required|integer|in:' . implode(',', array_keys(self::getStatusesExisting())),
            'description'   => 'max:255',
        ];
    }

    // Массив статусов.
    public static function getStatusesExisting() {
        return [
            self::STATUS_DISABLE => 'Отключена',
            self::STATUS_ENABLE  => 'Активна'
        ];
    }

    // Дочерняя категория.
    public function children() {
        return $this->hasMany(self::class, 'parent_id');
        
    }
}


Котроллер:
namespace App\Http\Controllers\Backend;

use App\Models\Category;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class CategoryController extends Controller
{

...

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        // Валидация.
        $request->validate(Category::rules());

        // Запись.
        Category::create($request->all());

        // Возврат к списку.
        return redirect()->route('backend.category.index');
    }

...

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \App\Category  $category
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, Category $category)
    {
        // Валидация.
        $request->validate(Category::rules());

        // Обновление.
        $category->update($request->all());

        // Возврат к списку.
        return redirect()->route('backend.category.index');
    }

...

}
  • Вопрос задан
  • 961 просмотр
Решения вопроса 1
alexey-m-ukolov
@alexey-m-ukolov Куратор тега Laravel
Хочется, чтобы правила были написаны для каждой модели только один раз
В общем случае это некорректное желание - правила валидации могут кардинально различаться для формы редактирования элемента в кабинете пользователя и в админке. Там могут быть разные наборы полей, разные требования для каждого поля, своя обязательность.

Ну и вообще, модель к валидации никакого отношения не имеет.

Поэтому валидируют не модель, а запросы. Создайте Form Request для своего запроса и опишите все правила там. Потом можно будет отнаследоваться от него для других похожих запросов или создать независимые.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы