Страницы

Поиск по вопросам

суббота, 11 января 2020 г.

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

#laravel #laravel5


Почему в 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);
    }
}


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

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


Ответы

Ответ 1



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

Ответ 2



Не знаю на счет того времени, когда задавался вопрос, но на таекщий момент валидацию правильнее всего выносить в Request классы. Это позволяет не дублировать код и не хранить логику валидации ни в контроллерах ни в моделях. https://laravel.com/docs/5.8/validation#form-request-validation

Комментариев нет:

Отправить комментарий