命名像类这样的invokable是什么意思?

时间:2013-02-23 09:42:40

标签: zend-framework2

我要通过ZfcUser了解Zend Framework 2中的模块。在Module.php中你可以看到

'invokables' => array(
  'ZfcUser\Authentication\Adapter\Db' => 'ZfcUser\Authentication\Adapter\Db',
  'ZfcUser\Authentication\Storage\Db' => 'ZfcUser\Authentication\Storage\Db',
  'ZfcUser\Form\Login'                => 'ZfcUser\Form\Login',
  'zfcuser_user_service'              => 'ZfcUser\Service\User',
  'zfcuser_register_form_hydrator'    => 'Zend\Stdlib\Hydrator\ClassMethods',
),

现在,给类真正的 abbr(如“zfcuser_user_service”)与完全限定名称之间的区别是什么?我假设,没有技术差异,但也许有一个约定如何命名invokables,因为ZF依赖它们,如何命名它们?

3 个答案:

答案 0 :(得分:12)

与其他答案相反,我可以说 IS 是一种惯例,即尽可能使用完全qualified class names的服务名称(以及服务所在的假类名)虚拟和另一个类的实例)。

如果问题只是关于ZfcUser如何做,我可以告诉你ZfcUser不是最先进的(目前为0.1.*),需要重写。您可以查看BjyAuthorize以获得更好的示例。

我使用定义为服务的类的 FQCN (完全限定类名),或者它实现的接口的 FQCN ,这有助于避免使用该服务的用户使用未在接口中指定的API,并且仅在实现类中。

另外,如果您使用\_或小写或大写的服务名称,则认为没有什么区别,因为所有内容都是normalized in the service manager。 这基本上意味着zfcuser_service_userZfcUser\Service\User是相同的。

总结一下,这是一个你可以遵循的好习惯:

'invokables' => array(
    // interface FQCN
    'Namespace\MyInterface' => 'Namespace\MyImplementation',

    // no interface available
    'Namespace\ClassName'   => 'Namespace\ClassName',

    // no interface nor own implementation available (similar to an alias)
    'Namespace\MyStuff'     => 'OtherNamespace\Stuff',
),

这很容易记住,并允许您的服务的最终用户查找Namespace\MyInterface并找到他们正在寻找的内容。

如果可能的话,也可以将它用于工厂和从抽象类产生的服务,因为这样可以让每个人都更容易记住。

答案 1 :(得分:1)

没有关于如何命名别名的约定。您应该只为别名指定一个唯一的名称,这样就不会与提供相同服务的其他模块发生命名冲突。 我也在我的项目中使用FQCN,因为它可以100%避免任何冲突,并且非常清楚您从服务管理器请求的是哪个类。

最后,这一切都归结为个人品味,但我会尝试通过单一的命名策略来确认自己,而不是混淆几种口味。

答案 2 :(得分:0)

没有惯例,但我认为你应该考虑如何使用invokables。

例如,前三个依赖于名为ServiceManagerAwareInterface的接口,因此这些实例需要从ServiceLocator出来才能按预期运行。鉴于它们是完全合格的类名,我认为ZfcUser开发人员不会设想覆盖这些名称的人。

后两者是别名,所以如果开发人员想要覆盖这些可调用的东西,那将是一项简单的任务。一个例子是开发人员选择扩展ZfcUser\Service\User来添加/修改功能,然后在他的模块的invokables中创建一行:

'invokables' => array(
  'zfcuser_user_service' => 'MyModule\Service\ZfcUser',
),

然后,使用zfcuser_user_service的任何代码都会收到MyModule\Service\ZfcUser而不是ZfcUser\Service\User的实例。