За последние 24 часа нас посетили 20824 программиста и 1135 роботов. Сейчас ищет 361 программист ...

Принцип единственной ответственности

Тема в разделе "PHP для новичков", создана пользователем Konstant1n, 25 ноя 2021.

  1. Konstant1n

    Konstant1n Активный пользователь

    С нами с:
    14 авг 2017
    Сообщения:
    273
    Симпатии:
    1
    Адрес:
    Волгоград
    Проект на Laravel.

    Не нарушает ли класс, который описан ниже, принцип единственной ответственности (Single responsibility) из серии SOLID?

    В проектах начал использовать Actions, вот пример одного из них

    PHP:
    1. namespace App\Actions;
    2.  
    3. use App\Models\User;
    4. use Illuminate\Validation\Factory;
    5.  
    6. class UserCreate
    7. {
    8.     private Factory $validationFactory;
    9.  
    10.     public function __construct(Factory $validationFactory)
    11.     {
    12.         $this->validationFactory = $validationFactory;
    13.     }
    14.  
    15.     public function handle(array $input): User
    16.     {
    17.         return User::query()->create(
    18.             $this->validationFactory->validate($input, [...])
    19.         );
    20.     }
    21. }
    Я считаю что нарушает, выполняются две операции:
    1. валидация данных
    2. создание юзера

    Но сомневаюсь в этом.

    Если нарушает, то как это можно переписать? Я думаю что можно разделить на два класса:
    1. выпонлнит валидацию
    2. создаст юзера, в методе handle() будет принимать эту команду
     
    #1 Konstant1n, 25 ноя 2021
    Последнее редактирование: 25 ноя 2021
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.548
    Симпатии:
    1.754
    Ну в ларке валидацию удобно выносить в классы запросов, не знаю, позволяет ли их исопльзовать этот пакет. Этому очень много посвящено в документации. А вообще принцип единой обязанности можно трактовать достаточно широко :)

    Немного почитал, вообще не понял зачем нужна эта либа? Ну хочешь, чтоб в каждом контроллере было только одно действие - можно же использовать __invoke
    --- Добавлено ---
    Вот такой вариант этого паттерна мне больше нравится: https://laravel.demiart.ru/pattern-action-domain-responder/

    Хотя я не заморачиваюсь у себя в проектах, мне удобнее традиционные контроллеры. А то так получается слишком много мелких классов. Я их не боюсь, но и не хочется их добавлять просто потому что SOLID.

    Отвечает класс SR или нет, зависит от того, как трактовать ось изменений. В твоём случае, через класс всё равно только одна ось изменений, кстати, проходит - создание пользователя (потому что если ты меняешь валидацию данных пользователя, ты всё равно меняешь создание пользователя). Так что он более чем отвечает принципу.
     
    Konstant1n нравится это.
  3. Konstant1n

    Konstant1n Активный пользователь

    С нами с:
    14 авг 2017
    Сообщения:
    273
    Симпатии:
    1
    Адрес:
    Волгоград
    да, можно валидацию вынести в реквесты, но иногда это не совсем удобно.

    либа ты имеешь в виду Illuminate\Validation\Factory? использовал ее, т.к. идет вместе с ларавель. а что ты предлагаешь? использовать Assert?

    Не, я не хочу чтобы в контроллере было только одно действие.
     
    #3 Konstant1n, 25 ноя 2021
    Последнее редактирование: 25 ноя 2021
  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.548
    Симпатии:
    1.754
    Ну я либы не знаю, как уже написал, а в моих проектах валидация всегда в реквестах. Мне нравится, когда в контроллер гарантированно попадают проверенные данные
     
    TeslaFeo нравится это.