我要通过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依赖它们,如何命名它们?
答案 0 :(得分:12)
与其他答案相反,我可以说 IS 是一种惯例,即尽可能使用完全qualified class names的服务名称(以及服务所在的假类名)虚拟和另一个类的实例)。
如果问题只是关于ZfcUser
如何做,我可以告诉你ZfcUser
不是最先进的(目前为0.1.*
),需要重写。您可以查看BjyAuthorize
以获得更好的示例。
我使用定义为服务的类的 FQCN (完全限定类名),或者它实现的接口的 FQCN ,这有助于避免使用该服务的用户使用未在接口中指定的API,并且仅在实现类中。
另外,如果您使用\
或_
或小写或大写的服务名称,则认为没有什么区别,因为所有内容都是normalized in the service manager。
这基本上意味着zfcuser_service_user
或ZfcUser\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
的实例。