#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, например, вы могли бы создать поставщика услуг входа в систему; или, например, Событие и прослушиватель, вы могли бы создать прослушиватель для входа в систему и инициировать событие для обработки всех необходимых логик. Не могу сказать, какой из них лучший, так как результат один и тот же, и он делает одинаковое количество сетевых запросов, но это больше зависит от личных предпочтений