Общие зависимости в нескольких Сервисах - PullRequest
1 голос
/ 11 июля 2020

Моя цель - иметь одинаковые зависимости в разных Сервисах.

Мне это нужно, потому что в некоторых случаях я использую одну и ту же сущность для разных Сервисов. Пример:

...
$user = $this->userRepository->find(123);
$this->userService->doSomeWithUserRepository(); # here using $user entity
$this->commentService->doSomeWithUserRepository(); # and ! here too the same
...

Вот пример того, как я добился этого сейчас:

public function __construct(
    UserRepositoryInterface $userRepository,
    FileRepositoryInterface $fileRepository,
    CommentRepositoryInterface $commentRepository
  ) {
    $this->userRepository = $userRepository;
    $this->fileRepository = $fileRepository;
    $this->commentRepository = $commentRepository;

    $this->userService = new UserService(
      $userRepository, $fileRepository, $commentRepository
    );

    $this->commentService = new CommentService(
      $userRepository, $fileRepository, $commentRepository
    );

    $this->middleware(...
    ...
  }

Итак, как вы можете видеть, при таком подходе конструктор может быть действительно большим и некрасивым , если у каждой службы будет много зависимостей.

Я хочу добиться чего-то вроде этого:

public function __construct(
    UserRepositoryInterface $userRepository,
    FileRepositoryInterface $fileRepository,
    CommentRepositoryInterface $commentRepository
    UserService $userService,
    CommentService $commentService
  ) {
    $this->userRepository = $userRepository;
    $this->fileRepository = $fileRepository;
    $this->commentRepository = $commentRepository;
    $this->userService = $userService;
    $this->commentService = $commentService;

    $this->middleware(...
    ...
  }

Я буду рад выслушать любую справку / подсказку / замечание. Может я неправильно использую logi c или что-то в этом роде?

Спасибо

1 Ответ

1 голос
/ 11 июля 2020

Вы немного неправильно понимаете инъекцию зависимостей. Первое правило - никогда не использовать ключевое слово new.

Если у вас есть UserService. php, как показано ниже, то репозитории будут автоматически загружаться через контейнер.

class UserService
{
    public function __construct(UserRepository $userRepository, FileRepository $fileRepository, CommentRepository $commentRepository)
    {
        ...
    }
}

Для этого вы можете сделать следующее. Этот код разрешит UserService и, поскольку все репозитории находятся в конструкторе, он также разрешит их. можно использовать app() или resolve(), чтобы сделать то же самое.

resolve(UserService::class); // will resolve user service with it 3 repositories
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...