Валидация в Laravel. Почему контроллер?

186
31 октября 2017, 00:15

Почему в Laravel из коробки валидация подразумевается в контроллере, а не в модели?

В документации сказано, что Базовый контроллер App\Http\Controllers\Controller включает в себя трейт ValidatesRequests, который уже содержит методы для валидации.

Вопрос почему не базовый класс модели сразу содержит методы валидации?

Ведь столько сказано о тонких контроллерах толстых моделях. Вот например ответ пользователя @HaruAtari с Тостера:

Я считаю, что "толстая модель, тонкий контроллер" - это самый подходящий вариант. Вся логика приложения должна содержаться в моделях. Модель - это не просто сущности из бд, это еще и инкапсулированая логика ее обработки. А контроллер должен говорить модели, что делать и рендерить вьюхи.

Например этот кусок кода неправильный:

class MyController
{
    public function myAction()
    {
        $user = new User();
        $user->load($_POST);
        if ($user->valiadate()) {
            $user->saveToDatabase();
        } else {
            throw new Exception("...");
        }
    }
}

Неправильный потому что контроллер знает, как модель сохраняет данные. Что сначала идет валидация, а потом сохранение в бд. И если вы потом решите не проводить валидацию, или добавить еще один проверяющий метод (например), то вам придется делать это везде.

Правильно быдет так: в модели определеить метод, содержащий логику:

class User
{
    public static function create(array $data)
    {
        $record= new static;
        $record->load($data);
        if($record->validate()){
            $record->saveToDatabase();
        } else {
            throw new Exception("...");
        }
        return $record;
    }
}

А в контроллере просто дергать его и передавать туда данные:

class MyController
{
    public function myAction()
    {
        $user = User::create($_POST);
    }
}

Таким образом все логика работы модели (в том числе валидация) инкапсулирована снутри класса, и другие классы не знают, как это происходит.

Такой подход облегчает сопровождение кода а так же облегчает написание тестов.

Answer 1

Конкретно в Laravel модель представляет из себя сущность, например какую-либо таблицу из БД, валидация же относится к бизнес-логике и вынесена соответственно в контроллер

READ ALSO
Сохранить результаты поиска в DLE

Сохранить результаты поиска в DLE

Существует CMS DLEКогда вбиваете искомое слово в поисковую строку, то генерируется страница с результатами

210
Не выводятся переменные в PHP

Не выводятся переменные в PHP

Данный код отрабатывает на локалке, но на сервере он просто не выводит переменную c с которой провели операцию mysqli_fetch_row Символы которые выводятся...

254
Ошибка приема данных AJAX

Ошибка приема данных AJAX

Делаю регистрациюС помощью AJAX

200
Нужно запустить цикл while наоборот

Нужно запустить цикл while наоборот

Возникла такая проблема - нужно ajax запросом выводить при скролле до конца блока с новостями 3 новых актуальных новостиJS часть уже готова,...

210