如何使 symfony 4 命令仅在开发环境中注册并在生产环境中禁用?

Xav*_*ero 5 command production-environment autowired symfony4 disable

在我的App我有一个 helper 类App\Command\GenerateFixturesCommand,它提供了一个名为my-nice-project:generate-fixtures.

此命令使用我自己的项目的服务,该服务名为App\Services\CatalogFixtureGenerator在开发应用程序时生成 1000 个随机 PDF 文档用于测试。

为此,此服务使用joshtronic\LoremIpsum仅在dev. LoremIpsum 是第三方库。我需要在作曲家的require-dev.

所以注入是:

  1. 我运行我的GenerateFixturesCommand.
  2. 在此之前,系统会透明地定位 myCatalogFixtureGenerator并将其注入命令中。
  3. 在此之前,系统透明地定位LoremIpsum第三方服务将其注入到我的夹具生成器服务中。

一切都是自动装配的。

当我部署prod并执行时composer install --no-dev --optimize-autoloader,当然LoremIpsum没有安装该类。

但是当我用APP_ENV=prod php bin/console cache:clear框架清除缓存时找到了命令并且无法注入自动装配的依赖项。

[WARNING] Some commands could not be registered:
In CatalogsFixtureGenerator.php line 26:
Class 'joshtronic\LoremIpsum' not found
Run Code Online (Sandbox Code Playgroud)

此my-nice-project:generate-fixtures命令永远不会在生产服务器中使用。

题

如何“禁用”中的命令prod?

我的意思是:如何告诉框架GenerateFixturesCommand不应加载该类及其自动装配的依赖项,也不应自动装配它们prod?

Gus*_*ooL 6

使用isEnabled()命令中的方法。例如

    public function isEnabled(): bool
    {
        // disable on prod
        if ($this->appKernel->getEnvironment() === 'prod') {
            return false;
        }

        return true;
    }
Run Code Online (Sandbox Code Playgroud)


Yah*_*yaE 0

在我的上一个项目中,我需要一些命令仅在开发环境中工作。您可以使用getenv函数来实现此目的:

# src/Command/SomeCommand.php
...

public function __construct()
{
    parent::__construct();
    if (getenv("APP_ENV") !== "dev") {
        exit('This command should work only "dev" environment.');
    }
}
Run Code Online (Sandbox Code Playgroud)

这样就可以解决问题了。

代码乐趣:)