4

Zend Framework 2 のモジュールの詳細については、ZfcUserを参照してください。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言えます。より良い例を見ることができます。ZfcUser0.1.*BjyAuthorize

サービスとして定義されているクラスのFQCN (完全修飾クラス名)、またはそれが実装するインターフェイスのFQCNのいずれかを使用します。実装クラス。

また、すべてがサービス マネージャーで正規化される\ため、または_または小文字または大文字のサービス名を使用しても実際の違いはないと考えてください。それは基本的にそれまたは同じことを意味します。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

慣例はありませんが、invokables の使用方法を検討する必要があると思います。

たとえば、最初の 3 つは呼び出されたインターフェイスに依存しているため、これらのインスタンスは意図したとおりに機能するServiceManagerAwareInterfaceために から出てくる必要があります。ServiceLocatorこれらが完全修飾クラス名であることを考えると、ZfcUser 開発者はこれらをオーバーライドする人を想定していないと思います。

後者の 2 つは別名であるため、開発者がこれらの呼び出し可能オブジェクトをオーバーライドしたい場合、それは簡単な作業になります。この例は、開発者がZfcUser\Service\User機能を追加/変更するために拡張することを選択し、モジュールの呼び出し可能オブジェクトに行を作成することです:

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

次に、 を使用するすべてのコードは、ではなくzfcuser_user_serviceのインスタンスを受け取ります。MyModule\Service\ZfcUserZfcUser\Service\User

于 2013-02-23T13:41:03.577 に答える