@jennik

Как загружаются сервисы в symfony?

Пытаюсь разобраться в symfony3.3
В закешировнном контейнере
%project_root%/var/cache/dev/appDevDebugProjectContainer.php

в методе создания сервиса вижу такой код:
/**
     * Gets the public 'assets.context' shared service.
     *
     * @return \Symfony\Component\Asset\Context\RequestStackContext
     */
    protected function getAssets_ContextService()
    {
        return $this->services['assets.context'] = new \Symfony\Component\Asset\Context\RequestStackContext(${($_ = isset($this->services['request_stack']) ? $this->services['request_stack'] : $this->get('request_stack')) && false ?: '_'});
    }

смущает вот-этот участок:
${($_ = isset($this->services['request_stack']) ? $this->services['request_stack'] : $this->get('request_stack')) && false ?: '_'}

не совсем понятно как он работает и зачем тут нужен, ведь в предыдущих версиях symfony не было такой странной конструкции и вместо этого было просто $this->get('request_stack')

Вопрос: зачем нужна эта странная конструкция?
И почему нельзя просто написать:
isset($this->services['request_stack']) ? $this->services['request_stack'] : $this->get('request_stack')

вместо
${($_ = isset($this->services['request_stack']) ? $this->services['request_stack'] : $this->get('request_stack')) && false ?: '_'}

?
  • Вопрос задан
  • 421 просмотр
Решения вопроса 1
voronkovich
@voronkovich
Небольшая поправка - лучше, вместо "кэшированный" контейнер говорить "скомпилированный". Последнее лучше отражает суть.
По поводу вопроса. Насколько я понял, по некоторым причинам имена классов при компиляции могут содержать символ $, поэтому имя класса нельзя вывести обычным способом. См. здесь: https://github.com/symfony/symfony/pull/19681/file...
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы
30 нояб. 2024, в 12:52
30000 руб./за проект
30 нояб. 2024, в 11:32
100 руб./за проект