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

时间:2018-03-06 15:24:57

标签: symfony symfony4 symfony-console symfony-flex

根据the documentation,命令类必须扩展Command或ContainerAwareCommand以自动发现和注册(当然,如果它的bundle在内核中注册)。

自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

你会注意到:

  • cravler:maxmind:geoip-update未注册(“cravler”命名空间下没有任何内容
  • Cravler \ MaxMindGeoIpBundle \ Command \ UpdateDatabaseCommand扩展ContainerAwareCommand
  • Bundle Cravler \ MaxMindGeoIpBundle \ CravlerMaxMindGeoIpBundle在config / bundles.php中注册适用于所有环境(自动生成的配方)

现在当我对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

那里缺少什么?

谢谢,

4 个答案:

答案 0 :(得分:2)

来自UPGRADE FROM to 4.0指南here

  

不支持依赖基于约定的命令发现   了。改为使用基于PSR-4的服务发现。

     

在:

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

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

后:

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

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

希望这个帮助

答案 1 :(得分:1)

基本上,您必须在捆绑包的服务文件中添加一些内容才能自动配置您的服务。按照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目录中定义的任何类都被视为命令。这种扫描被认为是神奇的并被删除。然而,大约在同一时间,哈利波特被添加到核心团队,魔术是他的事。所以Command目录的扫描被各种自动布线和自动标记法术所取代。

答案 2 :(得分:0)

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

textKeterangan

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

答案 3 :(得分:0)

如果您完全确定配置正确且命令仍未被识别,请尝试重置作曲家的自动加载器:

$ composer dump-autoload

这对我来说很有帮助。