根据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
你会注意到:
现在当我对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
那里缺少什么?
谢谢,
本
答案 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
这对我来说很有帮助。