Получить 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.