2 votes

Gestionnaire d'entités et référentiel Symfony Doctrine

Je comprends l'avantage du modèle de dépôt mais je n'arrive pas à comprendre que dans Symfony3 Doctrine il y a Doctrine\ORM\EntityManager y \Doctrine\ORM\EntityRepository

  1. Quelle est la différence entre les deux ?

  2. Le référentiel doit-il être injecté dans le contrôleur ou le gestionnaire d'entités ?

    Modifier La bonne question devrait être : Quelle est la bonne façon d'accéder à un référentiel depuis un contrôleur ?

    • Un référentiel doit-il être injecté dans un contrôleur comme un service ?
    • Un référentiel doit-il être injecté dans un autre service en tant que service ?
  3. Le gestionnaire d'entités doit-il contenir une quelconque requête ?
    Modifier La bonne question devrait être : un service doit-il contenir une requête ? Comme @MateuszSip l'a déjà expliqué, cela peut être fait en injectant un gestionnaire d'entités.

  4. Une fonction personnalisée comme getAvailableManagers être mis en dépôt ou des services ? (Où manager est un dépôt et il y a il y a une certaine logique dans la détermination available manager )

  5. Que diriez-vous d'une fonction plus générique comme findAllManager doit-il être dans le référentiel ou dans le gestionnaire d'entités ?

Actuellement, j'utilise Symfony3. Merci beaucoup

A la vôtre,

Modifier En parlant à @MateuszSip (merci mon pote), j'ai décidé de rendre ma question plus claire avec un exemple ci-dessous. Veuillez noter que le code ci-dessous ne représente pas le problème réel.

contrôleur

Class ManagementController
{
    public function assignManager($projectType)
    {
        // Grabbing a service
        $s = $this->get('mycompany_management_management_service')

        $managers = $s->findAvailableManagers();
        $managers = $s->checkCapability($managers, $projectType);

        return $managers
    }
}

dépôt

class ManagerRepository extends \Doctrine\ORM\EntityRepository
{
    public function findAvailableManagers() 
    {
        ...
        return $managers
    }

    public function checkCapability($managers, $type)
    {
        ...
        return $capableManagers
    }
}

services

class ManagementService 
{
   ... I am not sure what should be here.
}

2voto

Mateusz Sip Points 1155
  1. EntityManager est utilisé pour gérer les objets liés à la doctrine, donc :
    • vous pouvez faire persister un objet entité (il est maintenant géré par doctrine, et prêt à être sauvegardé)
    • vous pouvez supprimer un objet entité (afin qu'il soit supprimé plus tard)
    • vous pouvez vider, et ça va déclencher des opérations en attente
    • vous pouvez obtenir un référentiel (pour obtenir les objets dont vous aurez besoin) ou utiliser une api générique pour obtenir un objet par une clé primaire. etc.

C'est une classe qui gère l'état des objets et leur relation avec la base de données.

Le référentiel est un modèle qui normalise l'accès aux entités.

  1. Si votre application est complexe, vous devez injecter un ou plusieurs services distincts dans votre contrôleur. Ainsi, il y a un service UserSaver (par exemple) qui utilise entityManager pour créer/mettre à jour un utilisateur et UserFinder (ou quelque chose de bien nommé) utilisant UserRepository qui est responsable de la recherche d'utilisateurs selon des critères définis.

  2. Vous pouvez créer une requête en utilisant le gestionnaire d'entités, mais l'em lui-même ne peut pas contenir de requêtes.

  3. A mon avis, définissez une méthode dans un service, et une méthode correspondante dans votre UserRepository. Pour le moment, tout ce que vous voulez devrait être récupéré par une base de données, mais cela peut changer plus tard.

  4. En dépôt. Des méthodes comme : findByRole(role=manager), findIsActive, findOneBySecurityNumber sont reliées à un référentiel.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X