从服务中获取getEnvironment()

Pau*_*aul 17 symfony

在我的通知服务中,我必须通过邮件发送通知,但在开发中我想将所有电子邮件发送到特定地址:

if ( $this->container->get('kernel')->getEnvironment() == "dev" ) {

    mail( 'mymail@mail.com', $lib, $txt, $entete );

} else {

    mail( $to->getEmail(), $lib, $txt, $entete );

}
Run Code Online (Sandbox Code Playgroud)

但是$this->container->get('kernel')->getEnvironment()只能在控制器中工作.

我想我必须在我的服务构造函数中添加一个参数:

notification:
  class:      %project.notification.class%
  arguments: [@templating, @doctrine]
Run Code Online (Sandbox Code Playgroud)

但我没有找到任何关于此的信息

谢谢

小智 42

没有必要注入容器.事实上,注入容器不是一个好主意,因为你的课程依赖于DI.

你应该注入环境参数:

services.yml

notification:
  class:      NotificationService
  arguments: ["%kernel.environment%"]
Run Code Online (Sandbox Code Playgroud)

NotificationService.php

<?php

private $env;

public function __construct($env)
{
    $this->env = $env;
}

public function mailStuff()
{
    if ( $this->env == "dev" ) {
        mail( 'mymail@mail.com', $lib, $txt, $entete );  
    } else {
        mail( $to->getEmail(), $lib, $txt, $entete );
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 没错,但是正如上面答案中所述,它甚至更简单:Symfony带有内置功能,可以在特定地址发送电子邮件,您只需要在“ app / config / config_dev.yml”中设置正确的配置即可。案件。您无需在服务中处理此逻辑。 (2认同)
  • 在这种情况下,最佳实践仍然是使用配置文件。你可以有一个只为生产yams设置的slack地址参数,在dev yaml中为null,在你行动之前检查它是否为null。 (2认同)

Das*_*Ben 26

对于 Symfony 4,您可以执行以下操作:

use Symfony\Component\HttpKernel\KernelInterface;

class SomeService
{
    /**
     * @var string
     */
    private $environment;

    /**
     * Your Service constructor.
     */
    public function __construct(KernelInterface $kernel)
    {
        $this->environment = $kernel->getEnvironment();
    }
}
Run Code Online (Sandbox Code Playgroud)

$this->environment 现在保存您的环境,如 dev、prod 或 test。


Ale*_*x L 5

您可以在控制器中获取 $this->container 的原因是因为它被注入到您扩展的控制器中。

例如,您可以注入容器并在构造函数中设置它。

服务.yml

notification:
  class:      %project.notification.class%
  arguments: [@templating, @doctrine]
Run Code Online (Sandbox Code Playgroud)

通知服务.php

<?php

private $container;

public function __construct()
{
    $this->container = $container;
}

public function mailStuff()
{
    if ( $this->container->get('kernel')->getEnvironment() == "dev" ) {
        mail( 'mymail@mail.com', $lib, $txt, $entete );  
    } else {
        mail( $to->getEmail(), $lib, $txt, $entete );
    }
}
Run Code Online (Sandbox Code Playgroud)

查看依赖注入以获取更多信息。


请注意

一般来说,在容器中注入是不好的,意味着有更好的方法来做某事。在这种情况下,Symfony 已经有了我们正在尝试解决的解决方案。

输入 SwiftMailer。

具体来说,是将所有开发电子邮件发送到设定地址的部分。

尝试设置 Swiftmailer 并将以下内容添加到您的开发配置中。

应用程序/配置/config_dev.yml

swiftmailer:
    delivery_address: 'dev@example.com'
Run Code Online (Sandbox Code Playgroud)


nin*_*sky 5

在Symfony 4(也可能是3.x)中,您可以像这样在控制器中获取环境:

$env = $this->getParameter('kernel.environment');
Run Code Online (Sandbox Code Playgroud)

(无需通过services.yaml进行显式的控制器注入)