fo_otman
@fo_otman
Веб-разработчик

Как вызвать объект сервиса и передать в параметрах объект какого-либо класса?

Есть сервис App\Service\Status. Ему в качестве аргумента при вызове нужен объект класса App\Entity\Stage. В контроллере я, не зная как сделать иначе, вызываю сервис вот так:
$objStatus = new Status($stage, $this->getUser());
Хотя мы знаем, что сервисы в Symfony нужно вызывать как-то так:
$objStatus = $this->get('status');
Почему я не могу напрямую создать объект сервиса, мне непонятно. Но главное - как при правильном способе передать в качестве параметра объект класса App\Entity\Stage? И совсем сложный вопрос - как избежать передачи в качестве второго параметра зарегистрированного юзера?
  • Вопрос задан
  • 164 просмотра
Пригласить эксперта
Ответы на вопрос 2
IgorPI
@IgorPI
$objStatus = new Status($stage, $this->getUser());

Это уже не сервис, а хрень какая-то.

Сервисы прописываются в конфигурации сервисов и там пишутся инструкции для их запуска.
Вам сюда
Ответ написан
Комментировать
kimono
@kimono
Web developer
Во-первых, по-умолчанию, в настройках проекта папка Entity исключается из мониторинга на предмет наличия нужных сервисов. Это описано в конфигурации здесь:
# services.yaml
App\:
        resource: '../src/*'
        exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}'

Во вторых, зачем делать из Entity сервис? Entity лишь является "представлением сущностей". Возможно вам следует передать репозиторий StageRepository в сервис Status. Это можно сделать так:
class Status {
    private $stageRepository;
    public function __construct(StageRepository $stageRepository){
        $this->stageRepository = $stageRepository;
    }
}

class SiteControllers extends AbstractController {
    public function status(Status $status) {
        // ...
    }
}

В итоге вы получите доступ к сервису Status в экшене контроллера, а внутри этого сервиса будете иметь доступ к StageRepository.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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