tldr; Вы можете достичь этого, используя Абоненты и локаторы услуг .
В вашем контроллере:
use App\Service\AuxiliarService;
class DefaultController extends AbstractController
{
public function index(AuxiliarService $service)
{
$var = $service->MyFunction();
}
public static function getSubscribedServices()
{
return array_merge(parent::getSubscribedServices(), [
// services you want to access through $this->get()
'auxiliar_service' => AuxiliarService:class,
]);
}
// rest of the implementation
}
Если ваш сервиснеобходимо реализовать аналогичный шаблон, вам нужно реализовать ServiceSubscriberInterface
(AbstractController
, который вы расширяете для своего контроллера, уже делает это для вас).
class AuxiliaryService implements ServiceSubscriberInterface
{
private $container;
public function __construct(ContainerInterface $container)
{
$this->container = $container;
}
protected function has(string $id): bool
{
return $this->container->has($id);
}
protected function get(string $id)
{
return $this->container->get($id);
}
public static function getSubscribedServices()
{
return [
// array_merge is not necessary here, because we are not extending another class.
'logger' => LoggerInterface::class,
'service2' => AnotherService::class,
'service3' => AndMore::class
];
}
}
* 1016Как говорится, вы, вероятно, не делаете все правильно, если хотите продолжать в том же духе
До Symfony 4+ вы могли сделать $this->get('service')
, потому что все эти контроллеры имели доступ к контейнеру. Передача контейнера зависимостей для этого - это анти-шаблон, и делать это не следует .
Если вы не объявляете свои зависимости, ваши зависимости скрыты .Пользователи класса не знают, что он использует, и сломать систему проще, изменив поведение одной из скрытых зависимостей.
Более того, Symfony обеспечивает автоматическое подключение и скомпилированный контейнер;Внедрение зависимостей проще и быстрее в реализации.
То, что у вас возникли проблемы с его реализацией, вероятно, выявляет более глубокие проблемы с вашим кодом в целом, и вам следует поработать над разделением обязанностей ваших классов.Тот факт, что один сервис может зависеть от того множества других сервисов, о которых вы даже не знаете до времени выполнения, очень сильно пахнет, что проблемы плохо разделены.
Попробуйте приспособиться к изменениям, это подойдетваше приложение и вы хорошо себя чувствуете в долгосрочной перспективе (даже если сейчас приносит небольшое количество боли).