Как сделать сервис LoggerInterface общедоступным в Symfony 4 - PullRequest
0 голосов
/ 07 марта 2019

Я хочу, чтобы Psr\Log\LoggerInterface public в Symfony, чтобы иметь возможность получить его напрямую из контейнера с $container->get('Psr\Log\LoggerInterface').

Я попробовал следующее services.yaml:

_defaults:
 public: true

Psr\Log\LoggerInterface:
 public: true

Psr\Log\LoggerInterface:
 alias: 'logger'
 public: true

Psr\Log\LoggerInterface:
 alias: 'monolog.logger'
 public: true

Я не могу понять, почему так сложно переписать сервис.

Ответы [ 2 ]

1 голос
/ 07 марта 2019

Как отмечалось ранее, прямой доступ к сервисам из контейнера не рекомендуется.Но мне было немного любопытно посмотреть, как сделать частную услугу публичной.Я попробовал то, что было указано в вопросе, и подтвердил, что это не работает.

Возможно, это не самый простой подход, но проход компилятора поможет:

# src/Kernel.php
# Make the kernel a compiler pass
use Psr\Log\LoggerInterface;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
class Kernel extends BaseKernel implements CompilerPassInterface
...
public function process(ContainerBuilder $container)
{
    $logger = $container->getAlias(LoggerInterface::class);
    $logger->setPublic(true);
}

# And that should do the trick, you can confirm with
bin/console debug:container Psr\Log\LoggerInterface

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

Посмотрите на Подписчики услуг , если вам нужен регистратор в контроллере или вы просто хотите «лучше»способ сделать это.

1 голос
/ 07 марта 2019

Использование $ container-> get () - плохая практика. Это нарушает многие хорошие принципы проектирования программного обеспечения.

Вместо этого вы должны использовать конструктор.

class Foo
{
    protected $logger;

    public function __construct(LoggerInterface $logger)
    {
        $this->logger = $logger;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...