Задать вопрос
@systemaworking

Как менять код соблюдая второй принцип SOLID?

Покажу простой rest api псевдо код:

class UserController:
    public function all(): array
        return $this->userService->all()->toArray();
       
    public function single($id): array
        return $this->userService->single($id)->toArray();
        
        
class UserService:
    public function all(): UserServiceDTOCollection
        $users = $this->repo->all();
        # convert UserRepositoryDTOCollection -> UserServiceDTOCollection
        $users->convert(UserServiceDTOCollection::class);
        
        return $users;
        
    public function single($id): UserServiceDTO
        $user = $this->repo->single($id);
       # convert UserRepositoryDTO-> UserServiceDTO
        $user->convert(UserServiceDTO::class);
        
        return $user
        
        
class UserRepository:
    public function all(): UserRepositoryDTOCollection
        ...
        
    public function single($id): UserRepositoryDTO
       ...


Вот мой код, если кратно тут 3 слоя: UserController, UserService, UserRepository, все отделены DTO'шками.

1. Как по принципам солид добавлять/удалять/менять контроллеры?

Как вижу я:

Добавлять/изменять - UserController2 extends UserController и DI:container(UserControllerInterface::class, new UserController2)

Удалять - тут уже в route.php просто удалять путь

2. Если поступила задача юзеру добавить новое поле, например Avatar, то как это сделать?

Как я вижу:

1. UserResitoryWithAvatar extends UserRepository
2. UserRepositoryAvatarDTO extends UserRepositoryDTO
3. UserRepositoryAvatarDTOCollection extends UserRepositoryDTOCollection,
4. UserService доваляют новый метод allWithAvatar():UserServiceWithAvatarDTOCollection
5. UserService доваляют новый метод singleWithAvatar():UserServiceWithAvatarDTO
6. DI:container(UserRepositoryWithAvatarInterface::class, new UserRepositoryWithAvatar)

Ни как не могу понять как все это менять, если есть кто толковый был бы рад списаться и обсудить в каком то чате (whatsapp, discord, ...). Все читаю, читаю, ... и не понимаю как использовать
  • Вопрос задан
  • 628 просмотров
Подписаться 1 Средний 19 комментариев
Пригласить эксперта
Ответы на вопрос 1
SilenceOfWinter
@SilenceOfWinter Куратор тега PHP
та еще зажигалка...
для начала научись грамотно формулировать мысли и приводить работоспособные примеры
1. все строится на интерфейсах которые у тебя нихрена не описаны - откуда-то появляется UserControllerInterface
2. для проброса объектов использовать либо контейнеры, либо фабрики
3. не стоит пытаться создать holy controller подходящий для решения все задач
4. к OCP твой вопрос никак не относится - суть данного принципа в том, что свойства классов приватные, а геттеры/сеттеры - публичные, это позволит расширять класс при этом не модифицируя напрямую родителя
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы