标签: symfony-console

如何在没有 Symfony 框架包的情况下使用 Symfony 控制台进行依赖注入?

我有一个命令行应用程序,到目前为止它使用了 Symfony 依赖注入组件。我现在发现我想添加命令行选项并改进输出的格式,Symfony 控制台组件似乎是一个不错的选择。

但是,我无法理解如何让我的 Symfony 控制台命令类接收容器对象。

我发现的文档使用了 ContainerAwareCommand 类,但它来自 FrameworkBundle——这似乎是添加到纯 CLI 应用程序的大量开销,因为它需要更多的包,如路由、http、配置、缓存等,在这里,这些都与我无关。

(现有的 SO 问题如何向 Symfony 控制台命令注入依赖项?也假设 FrameworkBundle,顺便说一句。)

我在这里创建了一个测试存储库,其中包含一个说明问题的基本命令:https : //github.com/joachim-n/console-with-di

php dependency-injection symfony symfony-console

11
推荐指数
2
解决办法
2086
查看次数

Symfony:找不到命令

自过去几个月以来,我一直在尝试与 symfony 合作。昨晚我做了一个自动删除来清除不需要的存储库。之后,我无法使用 symfony 命令创建新的 symfony 项目。当我Symfony new SecurityDemo 2.8.1在终端中运行时,出现错误

Symfony: command not found
Run Code Online (Sandbox Code Playgroud)

我尝试按照文档http://symfony.com/doc/current/setup.html 中的指示再次安装Symfony 安装程序。我转到我的根目录并按照屏幕截图所示的安装过程进行操作 在此处输入图片说明

我仍然得到同样的错误。

感谢所有帮助。

编辑:

我正在使用 LAMP 并使用 PHP 5.6。

当我尝试使用更新 symfony 安装程序时,symfony self-update我得到输出

// Symfony Installer is already updated to the latest version (1.5.8).
Run Code Online (Sandbox Code Playgroud)

symfony symfony-console

9
推荐指数
3
解决办法
3万
查看次数

如何使用Symfony控制台识别是否提供了没有值的选项?

使用Symfony3控制台,如何判断用户何时提供了一个选项,但是在没有值的情况下提供了它?而不是根本不提供选项?

例如,采用以下控制台配置.

<?php

class MyCommand extends \Symfony\Component\Console\Command\Command
{
    // ...

    protected function configure()
    {
        $this->setName('test')
            ->setDescription('update an existing operation.')
            ->addOption(
                'option',
                null,
                InputOption::VALUE_OPTIONAL,
                'The ID of the operation to update.'
            );
    }
}
Run Code Online (Sandbox Code Playgroud)

命令帮助将说明选项--option[=OPTION],所以我可以通过以下方式调用它.

bin/console test
bin/console test --option
bin/console test --option=foo
Run Code Online (Sandbox Code Playgroud)

但是,$input->getOption()NULL在前两种情况下返回.我预计在第二种情况下它会返回TRUE,或者表示提供选项的东西.

所以我不知道如何识别根本没有提供的选项的差异,它是提供但没有值.

如果没有办法区分,那么用例是InputOption::VALUE_OPTIONAL什么?

php symfony symfony-console

8
推荐指数
3
解决办法
1514
查看次数

使用 Symfony 控制台 (CTRL+C) 捕获终端终止/退出

我已经构建了一个命令来触发通过互联网下载文件,但是由于这些文件需要由另一个组件处理,因此我们需要确保在过去 10 秒内已下载且未修改的每个文件都是正确的视频且未损坏/部分下载。

因此,我们需要找到一种方法来捕获 CTRL+C 或命令终止并清理任何尚未成功下载的适用文件。

这是我到目前为止通过使用symfony/consoleand尝试过的symfony/event-dispatcher

#!/usr/bin/env php
<?php

require_once(__DIR__ . '/../vendor/autoload.php');

use Symfony\Component\Console\Application;
use Symfony\Component\Console\ConsoleEvents;
use Symfony\Component\Console\Event\ConsoleTerminateEvent;
use Symfony\Component\EventDispatcher\EventDispatcher;
use ImportExport\Console\ImportCommand;
use Monolog\Logger;

$dotenv = new Dotenv\Dotenv(__DIR__ . '/../');
$dotenv->load();

$logger = new Logger('console');

$dispatcher = new EventDispatcher();
$dispatcher->addListener(ConsoleEvents::TERMINATE, function (ConsoleTerminateEvent $event) {
    // gets the command that has been executed
    $command = $event->getCommand();

    var_dump($command);
});

$application = new Application("Import-Export System", 'v0.1.0-ALPHA');
$application->add(new ImportCommand($logger));
$application->setDispatcher($dispatcher);
$application->run();
Run Code Online (Sandbox Code Playgroud)

但是,var_dump()如果我执行 CTRL+C,则永远不会在控制台中显示。

建议?

php symfony symfony-console symfony-eventdispatcher

7
推荐指数
1
解决办法
2801
查看次数

从一个命令中运行多个 Symfony 控制台命令

我在 Symfony 控制台应用程序中定义了两个命令,clean-redis-keys并且clean-temp-files. 我想定义一个clean执行这两个命令的命令。

我该怎么做?

php symfony-components symfony-console

6
推荐指数
1
解决办法
6269
查看次数

symfony/控制台输入长度

我正在编写一个 symfony/控制台应用程序(使用 v4 组件),但我遇到了问题的输入长度问题。

当要求用户输入时,我最多只能输入 1023 个字符?有没有办法增加这一点 - 还是有其他影响?

使用 OSX、iTerm2、PHP 7.1

谢谢。

编辑:问题要求一个安全令牌,这是一个很长的字符串 - 因此需要更多的字符。

php symfony symfony-console symfony4

6
推荐指数
0
解决办法
145
查看次数

Symfony控制台 - 覆盖默认选项

我正在使用Symfony控制台为我的应用程序构建CLI应用程序.应用程序需要执行一些简单的包管理操作来管理插件.因此,我需要一个--version以快捷方式命名的命令选项-v,这似乎不可能,因为它--version是为应用程序版本-v保留的,并保留用于默认的详细程度设置.
如何禁用默认选项或为此子命令覆盖它们?

错误弹出状态

[Symfony\Component\Console\Exception\LogicException]名为"version"的选项已存在.

php command-line-interface symfony symfony-console

5
推荐指数
1
解决办法
759
查看次数

Symfony 4,一种从现有数据库生成实体的方法?

使用 Symfony 3 及其控制台,我们可以通过命令“php bin/console algorithm:mapping:import”(非常有用!)从已经存在的数据库生成实体。

从 symfony 4 开始,命令“./bin/console algorithm:mapping:import”需要一个包名,但 symfony 4 现在不适用于包。

使用新版本的 symfony,有没有一种我没有看到从现有数据库(例如 mysql)生成实体的方法?或者我必须等待新版本的学说才能拥有与 Symfony 4 兼容的“学说:映射:导入”?

我找到了一个(n)(丑陋的)解决方案。我部署了一个一次性的 symfony 3,我将 symfony 3 链接到我的数据库,并在一个包中生成实体。然后我将生成的文件复制到 symfony 4。它很难看,但它有效哈哈

doctrine symfony symfony-console symfony4

5
推荐指数
1
解决办法
5769
查看次数

如何使用命令在独立应用程序中使用 symfony 的 DependencyInjection?

我一直在使用 symfony/console 来创建命令并像这样注册它们,一切正常:

垃圾箱/控制台:

#!/usr/bin/env php
<?php
require_once __DIR__ . '/../vendor/autoload.php';

use App\Commands\LocalitiesCommand;
use Symfony\Component\Console\Application;

$app = new Application();
$app->add(new LocalitiesCommand(new LocalitiesGenerator()));
$app->run();
Run Code Online (Sandbox Code Playgroud)

src/Commands/LocalitiesCommand.php:

<?php

declare(strict_types=1);

namespace App\Commands;

use App\LocalitiesGenerator;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;


final class LocalitiesCommand extends Command
{
    protected static $defaultName = 'app:generate-localities';

    public function __construct(private LocalitiesGenerator $localitiesGenerator)
    {
        parent::__construct();
    }

    protected function configure(): void
    {
        $this
            ->setDescription('Generate localities.json file')
            ->setHelp('No arguments needed.');
    }

    protected function execute(InputInterface $input, OutputInterface $output): int
    {
        $this->localitiesGenerator->generateJsonLocalities();
        $output->writeln("File localities.json generated!"); …
Run Code Online (Sandbox Code Playgroud)

php dependency-injection symfony symfony-console

5
推荐指数
1
解决办法
2271
查看次数

Symfony 4 - 3rd-party bundle commands are no longer automatically discovered

According to the documentation, a command class must extend Command or ContainerAwareCommand to be automatically discovered and registered (provided its bundle is registered in the Kernel, of course).

Since Symfony 4+, this discovery doesn't work as expected.

Try this:

composer create-project symfony/skeleton test-maxmind-sf4
cd test-maxmind-sf4
composer req cravler/maxmind-geoip-bundle dev-master
php bin/console list
Run Code Online (Sandbox Code Playgroud)

You will notice that:

  • cravler:maxmind:geoip-update is not registered (nothing under a "cravler" namespace
  • Cravler\MaxMindGeoIpBundle\Command\UpdateDatabaseCommand extends ContainerAwareCommand
  • Bundle Cravler\MaxMindGeoIpBundle\CravlerMaxMindGeoIpBundle is registered in config/bundles.php for all environments (auto-generated recipe) …

symfony symfony-console symfony-flex symfony4

4
推荐指数
1
解决办法
1988
查看次数