5

根据文档,命令类必须扩展 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

你会注意到:

  • 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

4 回答 4

7

这里UPGRADE FROM to 4.0的指南:

不再支持依赖基于约定的命令发现。请改用基于 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']

希望这有帮助

于 2018-03-06T16:55:52.467 回答
2

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

于 2018-03-06T16:32:30.087 回答
1

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

$ composer dump-autoload

这对我有帮助。

于 2020-04-04T07:57:42.337 回答
0

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

# 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>

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

于 2019-07-09T10:46:36.510 回答