【发布时间】:2014-02-21 02:17:24
【问题描述】:
我已经看过这个How can i inject dependencies to Symfony Console commands?,但这个答案并没有真正提供足够的信息,并且已经在这里解释了http://symfony.com/doc/current/cookbook/console/console_command.html
问题是 containerAwareCommand 不适用于此处的设置 http://symfony.com/doc/current/components/console/introduction.html
据我所知,为了使用 containerAwareCommand,我需要我的应用程序使用
Symfony\Bundle\FrameworkBundle\Console\Application
而不是
Symfony\Component\Console\Application
但是使用 frameworkBundle 应用程序类需要一个 KernelInterface 实例,并且不允许我将名称和版本传递给我的应用程序。
这是我所拥有的不适用于 containerAwareCommands 的内容
#!/usr/bin/env php
<?php
require __DIR__.'/../src/vendor/autoload.php';
$app = new Symfony\Component\Console\Application('spud', '0.0.1');
$app->add(new Isimmons\Spudster\Console\Commands\SayHelloCommand);
$app->run();
它自己运行的命令,但在尝试使用 getContainer 时出现错误
Call to undefined method Symfony\Component\Console\Application::getKernel()
关于接下来可能会出现的相关主题,在容器中注册类的文档显示使用 app/config/config.php 文件。但我没有 app 目录,因为这不是一个完整的 symfony 应用程序。除了上面的文件之外,所有应用程序都位于我的基本目录是 src/lib。如果我能弄清楚上面的第一部分,symfony 是否能够在 src/lib/config/config.php 找到配置文件?
【问题讨论】:
-
如果您没有运行完整的 Symfony 应用程序,那么您可能应该在一开始就说明,因为人们会使用他们对 Symfony 的了解来回答您的问题。
-
更新了标题。谢谢
-
Symfony 控制台组件没有对依赖注入组件的内置支持。因此,您需要构建自己的容器,扩展应用程序类并将容器添加到其中,然后扩展命令类以从应用程序中提取容器。
-
虽然如果可以将 containerAware 命令添加到简单的非框架 symfony 控制台命令中会很好,但我认为真正的问题是需要在文档中更清楚地说明 containerAware 命令它们与文档的其他部分中也演示的简单命令不同,并且不能与这些简单命令一起使用。我终于弄清楚了如何制作自己的容器和容器感知命令,并将在今天发布答案。
-
@isimmons 太糟糕了,你没有发布那个答案,看来我在这里遇到了同样的问题。