Es ist möglich, so viele Repositories zu haben, wie Sie möchten. Es kann jedoch nur ein einzelnes Repository mit dem Entity Manager verknüpft werden.
Sie müssen einige Dienste definieren, um ein benutzerdefiniertes Repository hinzuzufügen.
<!-- 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>
Die Repository-Klasse würde von EntityRepository
erben hat.
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);
* }
*
*/
}
Leider können Sie es nicht über den Doktrin-Dienst abrufen. Stattdessen rufen Sie sie direkt aus dem Behälter:
$this->get('acme.repository.my_entity');
EDIT
Wenn Sie ein Repository erstellen, von nicht an Einheiten verknüpft werden sollten, einfach einen Dienst erstellen und die injizieren notwendige Abhängigkeiten.
<!-- Repository for misc queries -->
<service id="acme.repository.misc" class="Acme\FQCN\MiscRepsitory">
<argument type="service" id="database_connection" />
</service>
Da Sie nicht in einem benutzerdefinierten Repository jede der Lehre ORM-Funktionen verwenden, gibt es keine Notwendigkeit EntityManager
zu verlängern.
namespace Acme\FQCN;
use \Doctrine\DBAL\Connection;
class MiscRepository
{
protected $conn;
public function __construct(Connection $conn)
{
$this->conn = $conn;
}
}
Sorry, ich meinte, dass Repository sollte nicht mit einer Entität verbunden werden. Also, warum die Metadaten-Sache? – gremo
@Gremo in diesem Fall wäre es sinnvoll, nur einen zusätzlichen Dienst zu erstellen und eine Datenbankverbindung selbst zu injizieren. – gilden
nach dem Injizieren von Datenbankverbindung sollte ich nur eine Klasse machen, die von EntityRepository erbt, bin ich richtig? – gremo