Получить getEnvironment() из службы
В моей службе уведомлений мне нужно отправить уведомления по почте, но в dev я хочу отправить все письма на конкретный адрес:
if ( $this->container->get('kernel')->getEnvironment() == "dev" ) {
mail( '[email protected]', $lib, $txt, $entete );
} else {
mail( $to->getEmail(), $lib, $txt, $entete );
}
Но $this->container->get('kernel')->getEnvironment()
работает только в контроллере.
Я думаю, что мне нужно добавить аргумент в свой конструктор сервисов:
notification:
class: %project.notification.class%
arguments: [@templating, @doctrine]
Но я не нашел информации об этом
спасибо
Ответы
Ответ 1
Нет необходимости вводить контейнер. На самом деле, не рекомендуется вводить контейнер, потому что вы делаете свой класс зависимым от DI.
Вы должны ввести параметр среды:
services.yml
notification:
class: NotificationService
arguments: ["%kernel.environment%"]
NotificationService.php
<?php
private $env;
public function __construct($env)
{
$this->env = $env;
}
public function mailStuff()
{
if ( $this->env == "dev" ) {
mail( '[email protected]', $lib, $txt, $entete );
} else {
mail( $to->getEmail(), $lib, $txt, $entete );
}
}
Ответ 2
В Symfony 4 (возможно, и 3.x) вы можете получить окружение в контроллере следующим образом:
$env = $this->getParameter('kernel.environment');
(не требуется явное внедрение контроллера через services.yaml)
Ответ 3
Причина, по которой вы можете получить $this- > container в контроллере, состоит в том, что он вводится в контроллер, который вы расширяете.
Например, вы можете вводить в контейнер и настраивать его в своем конструкторе.
services.yml
notification:
class: %project.notification.class%
arguments: [@templating, @doctrine]
NotificationService.php
<?php
private $container;
public function __construct()
{
$this->container = $container;
}
public function mailStuff()
{
if ( $this->container->get('kernel')->getEnvironment() == "dev" ) {
mail( '[email protected]', $lib, $txt, $entete );
} else {
mail( $to->getEmail(), $lib, $txt, $entete );
}
}
Посмотрите инъекцию зависимостей для получения дополнительной информации.
ОБРАТИТЕ ВНИМАНИЕ
Как правило, инъекция в контейнере плоха и означает, что есть лучший способ сделать что-то. В этом случае Symfony уже имеет решение, которое мы пытаемся решить.
Введите SwiftMailer.
В частности, раздел по отправке всех dev сообщений на заданный адрес.
Попробуйте настроить Swiftmailer и добавьте следующее в конфигурацию dev.
приложение /Config/config _dev.yml
swiftmailer:
delivery_address: '[email protected]'
Ответ 4
Для Symfony 4 вы можете сделать:
/**
* @var string
*/
private $environment;
/**
* Your Service constructor.
*/
public function __construct(KernelInterface $kernel)
{
$this->environment = $kernel->getEnvironment();
}
$this-> среда теперь содержит вашу среду, такую как dev, prod или test.