Contributed by
Robin Chalas
in #22734.

Symfony Console 组件是第二大受欢迎组件(超过5400万次下载),它被用在至关重要的PHP项目之中,包括Drupal和Magento。

尽管拥有超强功能,Symfony命令行从第一天起就受制于一个短板: 你必须初始化全部命令,并将其在命令行程序中进行注册。这么做的原因是,就算命令名称自身,也是被定义在一个叫做 configure() 方法中,因此你必须实例化这个命令的类,以便配置它并获取命令的名称。

实践中,这一短板并未在许多程序中成为一个真正的问题。只是,如果你有海量命令,或者命令极其复杂(因为它们会利用大量服务),这可能会影响性能。更甚者,在实例化任何一个命令时如果有一个小错误,你就不能使用程序的控制台,你无法运行命令行,哪怕你并没有执行那个出错的命令。

这解决这一问题进行了大量努力 (见 #12063, #13946, #16438, #21781, 等待) 在Symfony 3.4中,这问题最终得到解决,并且 命令行现已能够懒加载。这意味着,在运行命令行时,命令不需要再初始化,因此在Symfony 3.4中执行任何一个命令时将会快得多。

为了创建一个lazy-loaded懒加载命令,你必须首先 把命令定义为服务,然后还必须添加一个 command 属性到定义了命令名称的 console.command 标签中 (可选的,你也可以添加一个 alias 属性):

1
2
3
4
5
6
7
8
9
app.command.complex_command:
    # ...
    tags:
        # the value of the 'command' attribute is the name of the command
        # (which is what the user needs to type in to execute it)
        - { name: console.command, command: app:my-command }
 
        # optionally you can define an alias for the command too
        - { name: console.command, command: app:my-command, alias: 'my-shortcut' }

这就是全部了!多亏了我们的 兼容PSR-11的容器dependency injection tags,现在这个命令可以被懒加载了。