从服务中获取getEnvironment()

时间:2016-10-03 22:28:35

标签: symfony

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

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

8 个答案:

答案 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;
}