Symfony 4 - 不再自动发现第 3 方捆绑命令

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

根据 the documentation,命令 class 必须扩展 Command 或 ContainerAwareCommand 才能被自动发现和注册(当然前提是它的包已在内核中注册)。

自 Symfony 4+ 起,此发现无法按预期工作。

试试这个:

composer create-project symfony/skeleton test-maxmind-sf4
cd test-maxmind-sf4
composer req cravler/maxmind-geoip-bundle dev-master
php bin/console list

您会注意到:

现在当我用 Symfony 3 做同样的事情时,一切正常。

composer create-project symfony/skeleton test-maxmind-sf3 ^3.0
cd test-maxmind-sf3
composer req cravler/maxmind-geoip-bundle dev-master
php bin/console list

那里缺少什么?

谢谢,

基本上,您必须向捆绑包的服务文件中添加一些内容才能自动配置您的服务。按照 config/services.yaml:

中的示例
# Cravler/MaxMindGeolpBundle/Resources/config/services.xml
<services>
    <defaults autowire="true" autoconfigure="true" public="false" />
    <prototype 
        namespace="Cravler\MaxMindGeoIpBundle\" 
        resource="../../*" 
        exclude="../../*/{Entity,Migrations,Tests}" />

    <service id="cravler_max_mind_geo_ip.service.geo_ip_service"
             public="true"
             class="Cravler\MaxMindGeoIpBundle\Service\GeoIpService">
    </service>
</services>

清除缓存,你的命令应该在那里。

然后你当然应该调整命令本身并注入 ip 服务而不是定位它。

我确实四处寻找了一下,没有发现任何地方记录了这种方法。正如我在评论中提到的,我检查过的所有包仍然明确定义了它们的命令服务。所以我不确定是否不鼓励这种方法。

更新:正如@Matteo 在他们的回答中所说,在 4.0 之前,Command 目录中定义的任何 类 都被视为命令。这种扫描被认为是神奇的并且被移除了。然而,大约在同一时间,哈利波特加入了核心团队,魔法是他的专长。所以命令目录的扫描被各种自动连接和自动标记法术所取代。

来自 UPGRADE FROM to 4.0 指南 here:

Relying on convention-based commands discovery is not supported anymore. Use PSR-4 based service discovery instead.

Before:

# app/config/services.yml
services:
    # ...

    # implicit registration of all commands in the `Command` folder

After:

# app/config/services.yml
services:
    # ...

    # explicit commands registration
    AppBundle\Command\:
        resource: '../../src/AppBundle/Command/*'
        tags: ['console.command']

希望对您有所帮助

我认为命令应该在包中注册,而不是在应用程序中注册。我认为这会起作用:

# Cravler\/axMindGeoIpBundle/src/Resources/config/services.xml
<services>
  <service
      id="Cravler\MaxMindGeoIpBundle\Command\UpdateDatabaseCommand" 
      class="Cravler\MaxMindGeoIpBundle\Command\UpdateDatabaseCommand" 
      public="false">
      <tag name="console.command" />
  </service>
</services>

命令 class 扩展了 Symfony\Component\Console\Command\Command。

如果您绝对确定您的配置是正确的,但仍然无法识别命令,请尝试重置 composer 的自动加载器:

$ composer dump-autoload

这对我有帮助。