4

我将通过 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',
),

现在,给类一个真正的缩写,比如“zfcuser_user_service”和它们的完全限定名有什么区别?我认为,没有技术差异,但也许有一个约定如何命名可调用对象,因为 ZF 依赖于它们,如何命名它们?

4

3 回答 3

12

与其他答案相反,我可以声明有一个约定,即尽可能使用完全限定的类名作为服务名(以及服务是虚拟的和另一个类的实例的假类名)。

如果问题只是ZfcUser它是如何做到的,我可以告诉你这ZfcUser不是最先进的(目前0.1.*)并且需要重写。你可以看看BjyAuthorize一个更好的例子。

我使用定义为服务的类的FQCN (Fully Qualified Class Name),或者它实现的接口的FQCN,这有助于避免使用服务的用户使用接口中未指定的 API,而只是在实现类。

此外,请考虑使用\or_或小写或大写服务名称并没有真正的区别,因为一切都在 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并找到他们正在寻找的内容。

如果可能的话,也将它用于工厂和从抽象类派生的服务,因为它使每个人都更容易记住事情。

于 2013-02-23T22:19:38.150 回答
1

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

最后,这一切都归结为个人品味,但我会尽量确认自己主要使用单一的命名策略,而不是混淆几种口味。

于 2013-02-23T10:18:29.567 回答
0

没有约定,但我认为您应该考虑如何使用可调用对象。

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

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

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

然后使用的任何代码zfcuser_user_service都会收到一个MyModule\Service\ZfcUser而不是ZfcUser\Service\User.

于 2013-02-23T13:41:03.577 回答