2013-02-23 55 views
4

我要去槽ZfcUser更多地瞭解在Zend框架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」與給類之間的差異他們完全合格的名字?我認爲,沒有技術上的差異,但也許有一個約定如何命名invockables,因爲ZF依賴於它們,如何命名它們?

回答

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並找到他們所期待的。

如果可能的話,還可以將它用於工廠和從抽象類生成的服務,因爲它可以讓所有人都更容易記住。

+0

謝謝你的明確答案。你能否指出說明公約的參考?我在幾個月前開始使用ZF2時進行了搜索,但找不到有關命名約定的任何內容。 – 2013-02-23 23:20:59

+0

我? :)文檔在任何地方都缺少很多約定,所以我基本上很好地陳述它。你最終可以在irc頻道上詢問其他貢獻者。事實是,ZF2的配置超過了慣例,因此終端用戶仍然可以決定做什麼以及在哪裏做。如果您找到適合的部分,我會很樂意將PR zf2文檔添加進去。 – Ocramius 2013-02-23 23:50:01

+0

我與你同在你的約定;)。我認爲[serviceManager頁面](http://framework.zend.com/manual/2.0/en/modules/zend.service-manager.intro.html)上的**服務別名**部分將是一個很好的地方爲別名命名提供一些指導。甚至爲它創建一個單獨的頁面。我不時在IRC上(暱稱'bramstroker')。 – 2013-02-24 00:07:35

1

關於如何命名別名沒有約定。你應該只給你的別名一個獨特的名字,這樣你就不會與提供相同服務的其他模塊發生命名衝突。 我在我的項目中也使用FQCN,因爲它避免了100%的任何衝突,並且非常清楚您向服務管理器請求哪個類。最後,這一切都歸結爲個人的品味,但我會盡力確認你自己,主要是爲了一個單一的命名策略,而不是混淆了幾種口味。

+0

我真的認爲必須有更好的理由爲什麼zf2的貢獻者已經構建了ZfcUser模塊混合了invokeables。 – 2013-02-23 10:38:43

+1

我認爲這是因爲'zfcuser_user_service'和'zfcuser_register_form_hydrator'都是可以被用戶覆蓋的服務。在這種情況下,FQCN作爲別名會混淆用戶。 – 2013-02-23 10:42:37

+1

原因是'ZfcUser'需要重寫/清理。這就是所有的一切,所以要耐心或幫助它:)沒有奇怪的魔法或花哨的巫術:ZfcUser現在只是不擅長會議。 – Ocramius 2013-02-23 22:41:36

0

沒有約定,但我認爲你應該考慮如何使用invokables。

例如,前三個依賴於稱爲ServiceManagerAwareInterface的接口,因此這些實例需要從ServiceLocator中出來以按預期運行。鑑於它們是完全合格的類名,我會假設Z​​fcUser開發人員不會設想人們重寫這些名稱。

而後兩者是別名,所以如果開發人員想要重寫這些可調參數,這將是一個簡單的任務。這方面的一個例子是開發者選擇延長ZfcUser\Service\User添加/修改的功能,然後創建自己的模塊的invokables行:

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

然後使用zfcuser_user_service任何代碼將獲得的MyModule\Service\ZfcUser而不是ZfcUser\Service\User一個實例。

相關問題