Шаблон проектирования, который обрабатывает несколько шагов

#php #laravel #design-patterns

Вопрос:

Итак, у меня сложный процесс адаптации, который состоит из нескольких этапов. Я создал класс, который обрабатывает этот процесс, но я добавил еще несколько шагов, и я хотел бы преобразовать его во что-то более управляемое. Я переработал, чтобы использовать конвейер Laravel, но чувствую, что это может быть не лучший рефакторинг из-за необходимости изменения выходных данных перед каждым шагом.

Вот пример до и после с некоторым псевдокодом.

 before
class OnboardingClass {
    public $user;
    public $conversation;

    public function create($firstName, $lastName, $email){

        // Step 1
        $user = User::create();
        
        // Step 2
        $conversation = Conversation::create(); // store information for new user   existing user
        
        // Step 3
        $conversation->messages()->create(); // store a message on the conversation

        // Step 4
        // Send api request to analytics
        
        // Step 5
        // Send api request to other service

        return $this;
    }
}
 
 after
class OnboardingClass{
    public $user;
    public $conversation;

    public function create($firstName, $lastName, $email){
        $data = ['first_name' => $firstName, ...]; // form data

        $pipeline = app(Pipeline::Class);
        
        $pipeline->send($data)
            ->through([
                CreateUser::class,
                CreateNewUserConversation::class,
                AddWelcomeMessageToConversation::class,
                ...
            ])->then(function($data){
                // set all properties returned from last class in pipeline.
                $this->user = $data['user'];
                $this->conversation = $data['conversation'];
            });

        return $this;
    }
}
 

Теперь в каждом классе я изменяю предыдущие данные и выводю измененную версию примерно так

 class CreateUser implements Pipe {
    public function handle($data, Closure $next) {
        // do some stuff
        $user = User::create():
    
        return $next([
            'user' => $user,
            'other' => 'something else'
        ]);
    }
}

 

В моем контроллере я просто вызываю метод create.

 class someController() {
    public function store($request){
        $onboarding = app(OnboardingClass::class);
        $onboarding->create('John', 'Doe', 'john@example.com');
    }
}

 

Таким образом, первый канал получает необработанные поля формы и выводит то, что нужно второму каналу для выполнения работы в своем классе, затем следующий класс выводит данные, необходимые следующему классу, и так далее, и так далее. Данные, поступающие в каждый канал, каждый раз разные, и вы не можете изменить порядок.

Это немного странно, и я уверен, что есть более чистый способ справиться с этим.

Любой шаблон дизайна, который я могу использовать, чтобы немного его очистить?

Ответ №1:

Я думаю, что вы могли бы попробовать использовать поставщика услуг Laravel, например, вы могли бы создать поставщика услуг входа в систему; или, например, Событие и прослушиватель, вы могли бы создать прослушиватель для входа в систему и инициировать событие для обработки всех необходимых логик. Не могу сказать, какой из них лучший, так как результат один и тот же, и он делает одинаковое количество сетевых запросов, но это больше зависит от личных предпочтений