loophp / service-alias-autoregister-bundle
自动注册Symfony容器中的服务别名。
Requires
- php: >= 8.1
Requires (Dev)
- ext-pcov: *
- drupol/php-conventions: ^5
- phpunit/phpunit: ^10
- symfony/dependency-injection: ^6
- symfony/framework-bundle: ^6
- symfony/http-kernel: ^6
- symfony/test-pack: ^1.0
This package is auto-updated.
Last update: 2024-08-30 15:45:45 UTC
README
服务别名自动注册
一个用于Symfony的包。
描述
S.O.L.I.D.原则是一组设计指南,旨在提高软件设计的清晰性、灵活性和可维护性。其中之一是开放-封闭原则,主张使用接口而不是具体实现。
在Symfony中,通常的做法是在注入服务时依赖于具体服务实现,而不是使用接口。不幸的是,这种方法牺牲了代码的灵活性,有时还会使测试变得复杂。
幸运的是,在Symfony中可以通过在容器中为每个类手动引入别名来克服这种限制,这种方法提高了灵活性和测试能力。
为了解决这个问题并增强这种做法,此包将在Symfony容器中声明新的别名。因此,当发现的服务实现接口时,将自动生成别名。例如,如果一个服务实现了三个接口,容器将自动创建三个新的对应别名。
这些别名在发现的服务实现一个或多个接口时自动创建,使用服务类名的完全限定域名(FQDN)。
利用别名可以注入使用接口和命名参数的服务,而不是具体的实现,从而解决了常被忽视的开放-封闭原则。这样,我们的代码更加符合S.O.L.I.D.原则,特别是开放-封闭原则,因此更加健壮且易于管理。
以下示例展示了现有情况,如您所见,我们没有遵守该原则,而是直接注入了具体实现
<?php declare(strict_types=1); namespace App\Controller; use App\Repository\UserRepository; final class MyTestController { // Here we inject a concrete implementation of a Doctrine repository. public function __invoke(UserRepository $userRepository): Response { // Do stuff. } }
当启用此包时,您可以使用特定的参数名通过接口注入仓库。
<?php declare(strict_types=1); namespace App\Controller; use Doctrine\Persistence\ObjectRepository; final class MyTestController { // Here we inject the UserRepository (which implements ObjectRepository) // using the variable which has been created from the UserRepository class name. public function __invoke(ObjectRepository $userRepository): Response { // Do stuff. } }
我们甚至可以做得更好,通过构造函数注入它。然后我们可以在注入时使用接口,在属性中使用实现。两者兼得。
<?php declare(strict_types=1); namespace App\Controller; use App\Repository\UserRepository; use Doctrine\Persistence\ObjectRepository; final class MyTestController { private UserRepository $userRepository; public function __construct(ObjectRepository $userRepository) { $this->userRepository = $userRepository; } public function __invoke(): Response { // Do stuff. } }
安装
composer require loophp/service-alias-autoregister-bundle
请参阅下一节了解如何在项目中启用它。
用法
只需添加特定的标签即可启用此包:autoregister.alias
添加它找到的所有别名
services: App\: resource: "../src/*" exclude: "../src/{DependencyInjection,Entity,Tests,Kernel.php}" tags: - { name: autoregister.alias }
仅添加实现特定接口的特定服务
services: _instanceof: Doctrine\Persistence\ObjectRepository: tags: - { name: autoregister.alias }
完成后,执行以下命令进行验证
bin/console debug:container --tag=autoregister.alias
另一个示例:查找所有新的Doctrine仓库别名
bin/console debug:container ObjectRepository
配置包
您可以通过在应用程序中创建配置文件来配置此包。
service_alias_auto_register: whitelist: ~ blacklist: - Countable - Psr\Log\LoggerAwareInterface - Symfony\Contracts\Service\ServiceSubscriberInterface
可用的配置键
whitelist:允许您配置要使用的一组接口。清空列表以允许所有接口。blacklist:允许您配置要忽略的一组接口。默认为空数组。它优先于whitelist。
贡献
请随时通过发送Github拉取请求来贡献。
如果您不能为代码做出贡献,您也可以在 GitHub 上赞助我。
变更日志
请参阅基于 git 提交 的变更日志,链接为 CHANGELOG.md。
如需更多详细的变更日志,请查看 发行版变更日志。