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
您会注意到:
- cravler:maxmind:geoip-update 未注册("cravler" 命名空间下没有任何内容
- Cravler\MaxMindGeoIpBundle\Command\UpdateDatabaseCommand 扩展 ContainerAwareCommand
- 捆绑包 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
那里缺少什么?
谢谢,
本
基本上,您必须向捆绑包的服务文件中添加一些内容才能自动配置您的服务。按照 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
这对我有帮助。
根据 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
您会注意到:
- cravler:maxmind:geoip-update 未注册("cravler" 命名空间下没有任何内容
- Cravler\MaxMindGeoIpBundle\Command\UpdateDatabaseCommand 扩展 ContainerAwareCommand
- 捆绑包 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
那里缺少什么?
谢谢,
本
基本上,您必须向捆绑包的服务文件中添加一些内容才能自动配置您的服务。按照 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
这对我有帮助。