@PiloTeZ
...

Как спроектировать сервис для повторного использования?

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

<?php

class Companies
{
    public function create(CompanyData $data, User $initiator)
    {
        $company        = new Company;
        $company->title = $data;
        $company->saveOrFail();

        $companyMember            = new CompanyMember;
        $companyMember->userId    = $initiator->id;
        $companyMember->companyId = $company->id;
        $companyMember->role      = 'owner';
        $companyMember->saveOrFail();

        $companyLog            = new CompanyLog();
        $companyLog->companyId = $company->id;
        $companyLog->comment   = 'Компания создана';
        $companyLog->saveOrFail();
    }
}


Появилась задача, сделать такой же функционал в админке, только при добавлении через админку, не должен добавляться companyMember и комментарий к логу компании должен быть "Компания создана тех поддержкой".
  • 1. Как бы вы решили такой вопрос?
  • 2. А что, если компания будет прилетать от чужого сервиса, и понадобится в лог писать комментарий "Компания импортирована из стороннего сервиса"?
  • 3. Что, если логика добавления из разных контекстов будет отличаться сильнее?
  • Вопрос задан
  • 74 просмотра
Решения вопроса 1
@PiloTeZ Автор вопроса
...
По итогу решил следующее. Если нужно быстро, то сделать через параметры и условия. Если логика была бы сложнее и конфликты в ней серьезнее, то нужно было бы:
- разбить метод create на protected методы
- вынести новые методы в базовый класс
- унаследоваться от базового класса и создать Companies и AdminCompanies
- в Companies и AdminCompanies сделать create метод с нуля на основе базовых методов
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
AlekseyArh
@AlekseyArh
Кибер существо
(new Companies)->create($data, null, 'Компания импортирована из стороннего сервиса"');


Как нибудь так

class Companies {

    public function create (CompanyData $data, null|User $initiator, $comment = null) : Company {

        $company        = new Company;
        $company->title = $data;
        $company->saveOrFail();

        if ($initiator) {
            $companyMember            = new CompanyMember;
            $companyMember->userId    = $initiator->id;
            $companyMember->companyId = $company->id;
            $companyMember->role      = 'owner';
            $companyMember->saveOrFail();
        }

        $companyLog            = new CompanyLog();
        $companyLog->companyId = $company->id;
        $companyLog->comment   = $comment ?? 'Компания создана';
        $companyLog->saveOrFail();

        return $company;
        
    }

}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы