loophp/service-alias-autoregister-bundle

自动注册Symfony容器中的服务别名。

资助包维护!
drupol

安装: 5

依赖者: 0

建议者: 0

安全性: 0

星标: 1

关注者: 2

分支: 0

开放问题: 6

类型:symfony-bundle

1.0.1 2023-05-13 22:05 UTC

README

Latest Stable Version GitHub stars Total Downloads License Donate!

服务别名自动注册

一个用于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

如需更多详细的变更日志,请查看 发行版变更日志