服务提供商/ DI标识符-如何在PHP中命名它们?

时间:2019-06-12 10:05:16

标签: php dependency-injection naming-conventions service-provider

复杂的PHP应用程序提供数百种服务。每个服务都与一个服务标识符关联,通常是开发人员选择的字符串。例如,repository.users.sqlite是配置为与 users 表(默认为 sqlite 实例)一起使用的UserRepository类的实例。

此类字符串的正确命名约定是什么?

我想避免不必要的输入,思考,CR辩论,复制/粘贴服务名称以及搜索代码库以找出标识符后面的内容。

我看到了一些选择,但是没有一个是完美的:

  • 使用字符串(类似repository.users.sqlite)并将其复制/粘贴到任何地方
$di['users.service'] = new UsersService($di['repository.users.sqlite']);
  • 创建一个常量,将服务标识符保存在服务提供者类中的某个位置并使用它:
const USERS_REPOSITORY_SQLLITE = 'repository.users.sqlite'; 
const USERS_SERVICE = 'users.service';

$di[self::USERS_SERVICE] = new UsersService($di[self::USERS_REPOSITORY_SQLITE]);
  • 使用内置的PHP类常量(UserRepository::class)作为服务标识符的命名方法。因此,没有必要创建一个常数或记住一些东西。此外,在这种情况下,IDE的代码完成功能也可以使用。
$di[UsersService::class] = new UsersService($di[UsersRepository::class]); // default sqlite implementation is used here

您使用什么DI服务标识符名称约定,为什么?

1 个答案:

答案 0 :(得分:0)

如果框架没有像Symphony那样强迫您使用字符串标识符,则我更喜欢使用 :: class 常量,原因是:

  • 就绪的内置常量。无需考虑标识符的名称和值。
  • 类常量已经包含了用于标识类的所有信息:名称空间,模块和名称。
  • 尽管IDE更容易在容器定义中找到此类的用法。

对于某些重复了相同的具体服务定义的异常,我将其用作标识符: MyClass :: name。 ':: customIdentifier';

顺便说一句:我已经在Symphony DI上工作了很多年,但是我还是喜欢我提到的这种方式(我现在正在使用)。