我有一个命令行应用程序,到目前为止它使用了 Symfony 依赖注入组件。我现在发现我想添加命令行选项并改进输出的格式,Symfony 控制台组件似乎是一个不错的选择。
但是,我无法理解如何让我的 Symfony 控制台命令类接收容器对象。
我发现的文档使用了 ContainerAwareCommand 类,但它来自 FrameworkBundle——这似乎是添加到纯 CLI 应用程序的大量开销,因为它需要更多的包,如路由、http、配置、缓存等,在这里,这些都与我无关。
(现有的 SO 问题如何向 Symfony 控制台命令注入依赖项?也假设 FrameworkBundle,顺便说一句。)
我在这里创建了一个测试存储库,其中包含一个说明问题的基本命令:https : //github.com/joachim-n/console-with-di
自过去几个月以来,我一直在尝试与 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) 使用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什么?
我已经构建了一个命令来触发通过互联网下载文件,但是由于这些文件需要由另一个组件处理,因此我们需要确保在过去 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,则永远不会在控制台中显示。
建议?
我在 Symfony 控制台应用程序中定义了两个命令,clean-redis-keys并且clean-temp-files. 我想定义一个clean执行这两个命令的命令。
我该怎么做?
我正在编写一个 symfony/控制台应用程序(使用 v4 组件),但我遇到了问题的输入长度问题。
当要求用户输入时,我最多只能输入 1023 个字符?有没有办法增加这一点 - 还是有其他影响?
使用 OSX、iTerm2、PHP 7.1
谢谢。
编辑:问题要求一个安全令牌,这是一个很长的字符串 - 因此需要更多的字符。
我正在使用Symfony控制台为我的应用程序构建CLI应用程序.应用程序需要执行一些简单的包管理操作来管理插件.因此,我需要一个--version以快捷方式命名的命令选项-v,这似乎不可能,因为它--version是为应用程序版本-v保留的,并保留用于默认的详细程度设置.
如何禁用默认选项或为此子命令覆盖它们?
错误弹出状态
[Symfony\Component\Console\Exception\LogicException]名为"version"的选项已存在.
使用 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。它很难看,但它有效哈哈
我一直在使用 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) 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: