在我的通知服务中,我必须通过邮件发送通知,但在开发中我想将所有电子邮件发送到特定地址:
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)
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。
您可以在控制器中获取 $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)
在Symfony 4(也可能是3.x)中,您可以像这样在控制器中获取环境:
$env = $this->getParameter('kernel.environment');
Run Code Online (Sandbox Code Playgroud)
(无需通过services.yaml进行显式的控制器注入)
| 归档时间: |
|
| 查看次数: |
24312 次 |
| 最近记录: |