代码之家  ›  专栏  ›  技术社区  ›  Ben

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

  •  5
  • Ben  · 技术社区  · 7 年前

    根据 the documentation ,命令类必须扩展command或ContainerWareCommand才能自动发现和注册(当然,前提是其捆绑包在内核中注册)。

    由于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
    

    您会注意到:

    • Crawler:maxmind:geoip更新未注册(“Crawler”命名空间下没有任何内容
    • Crawler\MaxMindGeoIpBundle\Command\UpdateDatabaseCommand扩展ContainerWareCommand
    • Bundle-Crawler\MaxMindGeoIpBundle\CrawlerMaxMindGeoIPBundle在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 回复  |  直到 7 年前
        1
  •  7
  •   Matteo    7 年前

    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']
    

    希望这有帮助

        2
  •  2
  •   Cerad    7 年前

    基本上,为了自动配置您的服务,您必须向包的服务文件中添加一些内容。遵循配置/服务中的示例。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之前,命令目录中定义的任何类都被视为命令。这种扫描被认为是神奇的,并且被移除了。然而,大约在同一时间,哈利·波特加入了核心团队,魔法是他的专长。因此,命令目录的扫描被各种自动接线和自动标记咒语所取代。

        3
  •  1
  •   mc.watras Matt S    5 年前

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

    $ composer dump-autoload
    

    这对我很有帮助。

        4
  •  0
  •   Tac Tacelosky    6 年前

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

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

    command类扩展了Symfony\Component\Console\command\command。