12

Symfony 2 と Doctrine 2 のエンティティに関連付けられていないカスタム リポジトリを持つことは可能でしょうか? 他のリポジトリにはうまく適合しないネイティブ SQL をいくつか入れたいと思います (抽象またはエンティティ階層を参照する場合があります)。

コントローラ コードをどの$this->getDoctrine()->getRepositoty(/* ??? */)ように置き換える必要がありますか?

4

3 に答える 3

16

必要な数のリポジトリを持つことができます。ただし、エンティティ マネージャとリンクできるリポジトリは 1 つだけです。

カスタム リポジトリを追加するには、いくつかのサービスを定義する必要があります。

<!-- My custom repository -->
<service id="acme.repository.my_entity" class="Acme\FQCN\MyEntityRepository" >
    <argument type="service" id="doctrine.orm.entity_manager" />
    <argument type="service" id="acme.metadata.my_entity" />
</service>

<!-- MyEntity metadata -->
<service id="acme.metadata.my_entity" class="Doctrine\ORM\Mapping\ClassMetaData">
    <argument>Acme\FQCN\MyEntity</argument>
</service>

リポジトリ クラスは から継承する必要がありますEntityRepository

namespace Acme\FQCN;

use Doctrine\ORM\EntityRepository;

class MyEntityRepository extends EntityRepository
{
    /** 
     * If you want to inject any custom dependencies, you'd have either have to
     * add them to the construct or create setters. I'd suggest using setters
     * in which case you wouldn't need to use the constructor in this class.
     *
     * public function __construct($em, Doctrine\ORM\Mapping\ClassMetadata $class, $custom_dependency)
     * {
     *     parent::__construct($em, $class);
     * }
     *
     */
}

残念ながら、doctrine サービス経由で取得することはできません。代わりに、コンテナーから直接取得します。

$this->get('acme.repository.my_entity');

編集

どのエンティティにもリンクしてはならないリポジトリを作成する場合は、サービスを作成して必要な依存関係を注入するだけです。

<!-- Repository for misc queries -->
<service id="acme.repository.misc" class="Acme\FQCN\MiscRepsitory">
    <argument type="service" id="database_connection" />
</service>

カスタム リポジトリでは Doctrine の ORM 機能を使用していないため、拡張する必要はありませんEntityManager

namespace Acme\FQCN;

use \Doctrine\DBAL\Connection;

class MiscRepository
{
    protected $conn;

    public function __construct(Connection $conn)
    {
        $this->conn = $conn;
    }
}
于 2012-07-10T10:27:11.470 に答える
1

私の提案は、コンストラクターで必要な依存関係を持つプレーンな PHP クラスを作成し、それをサービス コンテナーを介して取得することです。

于 2012-07-10T10:26:55.117 に答える