9

いくつかのモジュールで構成される Zend Framework 2 を使用して Web アプリケーションを開発しています。エンティティ クラスをそれらが属するモジュールに配置したいと考えています。

Doctrine2 ORMを使用してこれを行うことは可能ですか? ドキュメントを読むと、すべてのエンティティが最大で 1 つの名前空間の下にあることが常に期待されているようですが、私はそうしたいと思っています。

  • Module1\Entity
  • Module2\エンティティ
  • 等々...

どうすればこれを可能にすることができますか?

ありがとうございます!

4

2 に答える 2

15

doctrine 設定の最初のステップは、グローバル設定ファイル内で接続をセットアップすることです。個人的には、これを 2 つのファイルで行います。最初のファイルと./config/autoload/global.php2 番目のファイルは./config/autoload/local.php

これはまさに 1 つの理由であり、これを含むものはすべてlocal私の git リポジトリに投稿されないためです。だから私の資格情報は安全です。

./config/autoload/global.php

return array(
  'doctrine' => array(
    'connection' => array(
      'orm_default' => array(
        'driverClass' => 'Doctrine\DBAL\Driver\PDOMySql\Driver',
        'params' => array(
          'host'     => 'localhost',
          'port'     => '3306',
          'dbname'   => 'dbname'
        )
      )
    )
  ),
);

./config/autoload/local.php

return array(
  'doctrine' => array(
    'connection' => array(
      'orm_default' => array(
        'params' => array(
          'user'     => 'root',
          'password' => ''
        )
      )
    )
  ),
);

2 番目のステップは、エンティティのドライバーを作成することです。これはモジュール名前空間ベースで行われます。

./modules/ModuleNamespace/config/module.config.php

<?php
namespace ModuleNamespace;

return array(
  //... some more configuration

  'doctrine' => array(
    'driver' => array(
      __NAMESPACE__ . '_driver' => array(
        'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
        'cache' => 'array',
        'paths' => array(__DIR__ . '/../src/' . __NAMESPACE__ . '/Entity')
      ),
      'orm_default' => array(
        'drivers' => array(
          __NAMESPACE__ . '\Entity' => __NAMESPACE__ . '_driver'
        )
      )
    )
  )
);

そこで何が起こっているのですか?さて、新しいドライバーを追加して doctrine['driver'] 配列を拡張します。ドライバーには、モジュールの名前空間があります。このために、構成ファイルで名前空間を定義する必要もあります。ドライバーは、このドライバーのすべてのエンティティが特定のパス内にあることを定義します。

次のステップは、すべてのクラスが構成からロードされるorm_defaultsことを定義する割り当てによってドライバーが拡張されることです。ModuleNamespace\EntityModuleNamespace_driver

最終的に、これは単一のモジュールごとに行われます。Filemanager\Entity\Fileしたがって、またはクラスを持っているかどうかに関係なくPictureDb\Entity\File、両方が機能し、両方がロードされます。モジュールは、本質的に互いに独立しています。依存関係を持つことも、連携してうまく機能することもできますが、単独で機能します。したがって、複数のエンティティを持つ複数のモジュールはまったく問題ありません;)

これで、このトピックを少し理解していただければ幸いです。実際の作業例については、トピックをカバーする 2 つのブログ記事を書きました。

これらも少しは役に立ちます。

于 2012-10-04T08:17:55.320 に答える
0

DoctrineORMModule を使用している場合、プロキシは/data/DoctrineORMModule/Proxyに書き込まれます。フォルダーを手動で作成して権限を調整する必要があるかどうかはわかりません。

注意: 何らかの理由で、ZendSkeletonApplicationは名前空間が設定されていない状態で出荷されます! ZendSkeletonApplication / モジュール / アプリケーション / config / module.config.php

module.config.phpで名前空間を設定するのを忘れると、このエラーが発生する可能性があります。 クラス ... はチェーン構成された名前空間 ZfcUser\Entity、\Entity、ZfcUserDoctrineORM\Entity で見つかりませんでした

于 2014-05-14T10:26:55.013 に答える