Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Symfony控制台:对服务感到困惑_Php_Symfony_Symfony4 - Fatal编程技术网

Php Symfony控制台:对服务感到困惑

Php Symfony控制台:对服务感到困惑,php,symfony,symfony4,Php,Symfony,Symfony4,我使用Symfony Console作为单机版来创建CLI应用程序 Symfony控制台文档在服务方面一目了然。有人能给我一个实际的例子说明它是如何工作的吗 例如,在您拥有的文档中: 但它有一条注释“从未在命令行上执行的代码调用命令不是一个好主意” 但这并没有告诉你如何创建它们 我真的很困惑 例如,“从服务容器获取服务”中的示例显示了一个示例$this->userManager->create($input->getArgument('username')) 但我看不出来。如何创建这个具有c

我使用Symfony Console作为单机版来创建CLI应用程序

Symfony控制台文档在服务方面一目了然。有人能给我一个实际的例子说明它是如何工作的吗

例如,在您拥有的文档中:

  • 但它有一条注释“从未在命令行上执行的代码调用命令不是一个好主意”
  • 但这并没有告诉你如何创建它们
我真的很困惑

例如,“从服务容器获取服务”中的示例显示了一个示例
$this->userManager->create($input->getArgument('username'))

但我看不出来。如何创建这个具有
create
功能的神奇的
userManager


如果我创建
userManager
作为标准命令,那么鉴于Symfony控制台只有三个生命周期,我不知道如何创建子函数
initialize()
interactive()
execute()
基本上,您的
命令描述了它将在其构造函数中使用哪些服务,因此如果您只需要
UserManager
,它看起来会是这样的:


类MyCommand扩展命令
{
私人$userManager;
公共函数构造(UserManager$UserManager)
{
//确保调用父构造函数
父项::_构造(null);
$this->userManager=$userManager;
}
// ...
}
Symfony Console没有说明服务的创建,因为这不是它的责任,这是典型Symfony应用程序中(依赖项注入组件的一部分)的用途,您也可以使用它,但在您的小型CLI工具中,它可能会被过度使用

捷径 在您的
bin/console.php
(或其等效工具)中,当添加类似命令时,可以实例化所有服务:

使用Symfony\Component\Console\Application;
$application=新应用程序();
$userManager=newusermanager(…);
$application->add(新建MyCommand($userManager));
$application->run();
不那么容易的方法 您可以想象,这可能会变得非常乏味和烦人,尤其是当您需要不同的配置时。您可以单独使用服务容器并使其读取服务配置(基本上是
$app=new Application()
$app->run()
之间的整个内容的表示):

$containerBuilder=newcontainerbuilder();
$loader=newyamlfileloader($containerBuilder,newfilelocator(_DIR__));
$loader->load('config.yaml');
// ...
$containerBuilder->compile();
有关详细信息,请参阅文档

替代方法 如果您希望保留用于创建所有这些服务的代码,并且不希望使用容器,则可以创建工厂类,以创建您的UserManager(在需要时,而不是预先创建所有服务):

$application=新应用程序();
$userManagerFactory=新的userManagerFactory();
$application->add($userManagerFactory->createUserManager());
$application->run();
如果您认为配置和编译Symfony的容器太麻烦,您也可以使用其他容器,而不是Symfony的容器。例如,有一个非常轻量级的基于数组的解决方案,称为Pimple,它可能更适合您的用例,或者您可以使用许多其他lib中的一个

太长,读不下去了
创建服务不是Console组件的责任,因此没有对其进行说明。有许多不同的方法有不同的优点/缺点,例如,仅在需要时实例化服务,而不是配置容器(或类似容器的东西来保存服务).

当然,
$this->userManager=$userManager;
但是我说的是
->create()
位,它是
用户管理器
服务的提供?我看不出这在Symfony控制台的生命周期中是如何适应的,文档也没有提供任何实际示例。@LittleCode the
UserManager
是一个应该存在的类,并且应该有一个
create
方法。您可以想象用UserManager替换您自己注册的类d作为带有symfony的服务容器的服务。只是澄清一下,您是在symfony框架中使用控制台命令,还是使用独立的控制台组件?您的问题表明它是独立的命令。在这种情况下,容器(及其服务)不可用。@Cerad只是独立的(
php composer.phar需要symfony/console
)好的。您正在查看如何在框架文档中使用console命令。您需要查看独立文档:您不会在其中看到任何关于容器和服务的内容,因为容器组件甚至没有加载,更不用说配置了。可以安装容器,但最好只使用fr在你感到舒适之前,你需要使用骨架。骨架为你提供了容器、控制台和一些配置。