在我的通知服务中,我必须通过邮件发送通知,但在开发中我想将所有电子邮件发送到特定地址:
if ( $this->container->get('kernel')->getEnvironment() == "dev" ) {
mail( 'mymail@mail.com', $lib, $txt, $entete );
} else {
mail( $to->getEmail(), $lib, $txt, $entete );
}
但$this->container->get('kernel')->getEnvironment()
仅适用于控制器。
我想我必须在服务构造函数中添加一个参数:
notification:
class: %project.notification.class%
arguments: [@templating, @doctrine]
但我没有找到关于此
的任何信息THX
答案 0 :(得分:36)
无需注射容器。事实上,注入容器并不是一个好主意,因为你的课程依赖于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( 'mymail@mail.com', $lib, $txt, $entete );
} else {
mail( $to->getEmail(), $lib, $txt, $entete );
}
}
答案 1 :(得分:4)
在Symfony 4(也可能是3.x)中,您可以在像这样的控制器中获取环境:
$env = $this->getParameter('kernel.environment');
(无需通过services.yaml进行明确的控制器注入)
答案 2 :(得分:3)
您可以在控制器中获取$ this-&gt;容器的原因是因为它被注入您扩展的控制器中。
例如,您可以在容器中注入并在构造函数中进行设置。
<强> 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( 'mymail@mail.com', $lib, $txt, $entete );
} else {
mail( $to->getEmail(), $lib, $txt, $entete );
}
}
有关详细信息,请查看dependency injection。
请注意
一般来说,注入容器是不好的,这意味着有更好的方法可以做某事。在这种情况下,Symfony已经有了我们试图解决的解决方案。
输入SwiftMailer。
具体而言,关于发送所有dev emails to a set address的部分。
设置Swiftmailer并将以下内容添加到您的dev配置中。
应用/配置/ config_dev.yml 强>
swiftmailer:
delivery_address: 'dev@example.com'
答案 3 :(得分:1)
对于Symfony 4,您可以执行以下操作:
<mat-table [dataSource]="dataSource1" class="mat-elevation-z8" cdkDropListGroup matSort>
<ng-container *ngFor="let column of columns; let i = index" [matColumnDef]="column.field">
<mat-header-cell *matHeaderCellDef cdkDropList cdkDropListLockAxis="x" cdkDropListOrientation="horizontal"
(cdkDropListDropped)="dropListDropped($event, i)" cdkDrag (cdkDragStarted)="dragStarted1($event, i)"
[cdkDragData]="{name: column.field, columIndex: i}" mat-sort-header>
{{ column.field }}
</mat-header-cell>
<mat-cell *matCellDef="let row"> {{ row[column.field] }}</mat-cell>
</ng-container>
<mat-header-row *matHeaderRowDef="wathcListDisplayColumns"></mat-header-row>
<mat-row (click)="openDialog(row)" *matRowDef="let row; columns: wathcListDisplayColumns;"></mat-row>
</mat-table>
I want to drag and drow row and column in mat-table
$ this-> environment现在可以保存开发,生产或测试之类的环境。
答案 4 :(得分:1)
由于dotenv,您可以使用$ _ENV superglobal在.env文件中获取所有环境
$ _ ENV ['APP_ENV']
答案 5 :(得分:0)
如果您进入静态类并且无权访问容器,则始终可以在AppKernel.php-> registerBundles()中进行此操作:
$_ENV['APP_ENV'] = $this->getEnvironment();
这样,您将始终在超全局$ _ENV中拥有环境。
这有点像黑客,但是却像魅力一样。
答案 6 :(得分:0)
实际上,您不需要获取实际环境。例如,如果您只需要在生产时发送闲置通知,则可以配置send_slack_notification
参数并将其在不同环境中设置为true / false。
然后,您可以在代码中执行以下操作:
if ($parameters->get('send_slack_notification') == true) {
//send the notifications
}
通过使用这种方法,您以后可以在不同的环境中打开/关闭此设置,而无需更改实现。另一个好处是,当您检查参数文件时,您可以立即查看不同环境中的所有选项,这将使调试更加容易。
注意
KernelInterface $kernel->getEnvironment()
可以同时返回小写和大写结果,具体取决于您在.env文件中的配置方式。您不应该使用它的另一个原因。
答案 7 :(得分:0)
在 symfony 中,您可以通过 $variableName 绑定默认值。
config/services.yaml
services:
_defaults:
bind:
$kernelEnvironment: '%kernel.environment%'
NotificationService.php
private $env;
public function __construct($kernelEnvironment)
{
$this->env = $kernelEnvironment;
}