Проект на Laravel. Не нарушает ли класс, который описан ниже, принцип единственной ответственности (Single responsibility) из серии SOLID? В проектах начал использовать Actions, вот пример одного из них PHP: namespace App\Actions; use App\Models\User; use Illuminate\Validation\Factory; class UserCreate { private Factory $validationFactory; public function __construct(Factory $validationFactory) { $this->validationFactory = $validationFactory; } public function handle(array $input): User { return User::query()->create( $this->validationFactory->validate($input, [...]) ); } } Я считаю что нарушает, выполняются две операции: 1. валидация данных 2. создание юзера Но сомневаюсь в этом. Если нарушает, то как это можно переписать? Я думаю что можно разделить на два класса: 1. выпонлнит валидацию 2. создаст юзера, в методе handle() будет принимать эту команду
Ну в ларке валидацию удобно выносить в классы запросов, не знаю, позволяет ли их исопльзовать этот пакет. Этому очень много посвящено в документации. А вообще принцип единой обязанности можно трактовать достаточно широко Немного почитал, вообще не понял зачем нужна эта либа? Ну хочешь, чтоб в каждом контроллере было только одно действие - можно же использовать __invoke --- Добавлено --- Вот такой вариант этого паттерна мне больше нравится: https://laravel.demiart.ru/pattern-action-domain-responder/ Хотя я не заморачиваюсь у себя в проектах, мне удобнее традиционные контроллеры. А то так получается слишком много мелких классов. Я их не боюсь, но и не хочется их добавлять просто потому что SOLID. Отвечает класс SR или нет, зависит от того, как трактовать ось изменений. В твоём случае, через класс всё равно только одна ось изменений, кстати, проходит - создание пользователя (потому что если ты меняешь валидацию данных пользователя, ты всё равно меняешь создание пользователя). Так что он более чем отвечает принципу.
да, можно валидацию вынести в реквесты, но иногда это не совсем удобно. либа ты имеешь в виду Illuminate\Validation\Factory? использовал ее, т.к. идет вместе с ларавель. а что ты предлагаешь? использовать Assert? Не, я не хочу чтобы в контроллере было только одно действие.
Ну я либы не знаю, как уже написал, а в моих проектах валидация всегда в реквестах. Мне нравится, когда в контроллер гарантированно попадают проверенные данные