11
votes

Zend Framework - Doctrine 2 Intégration: Où stocker l'entitémanager?

J'intégrène Zend Cadre et Doctrine 2.

La question est, dans mes contrôleurs et sur mes contrôleurs, dans le besoin d'accéder au modèle. Je peux faire tout cela à travers une autre instance unique de l'entitémanager .

Où puis-je stocker cette instance?

  • zend_registry ? C'est là que c'est maintenant, il est accessible de partout, mais pas vraiment pratique: $ em = zend_registry :: Obtenez ("EntityManager");
  • en tant que contrôleur et afficher une propriété? Ce serait accessible comme $ ceci-> em , j'aime ce
  • créer une classe d'usine qui retournera l'instance? $ em = mon \ entitymanager \ usine :: geInstance (); . L'encapsulation est bonne, mais longue à taper ...
  • est le entitymanager un singleton déjà? -> ( mise à jour ) non ce n'est pas

2 commentaires

Le gestionnaire d'entité n'est pas un singleton. Il est possible d'utiliser plusieurs gestionnaires d'entités pour traiter des bases de données distinctes dans la même demande.


OK merci pour l'information, question mise à jour


5 Réponses :


-2
votes

zend_registry je pense est une idée de biens.

Fondamentalement, c'est une mauvaise idée d'accéder à EM à partir de la vue, si vous avez vraiment besoin de cette fonctionnalité, votre peut créer une assistance de vue et l'utiliser


2 commentaires

Accéder à l'EM de la vue ou via Zend_registry est une mauvaise idée. La vue ne devrait pas traiter de l'EM directement - Zend_registry est une mauvaise idée, car ce n'est pas mieux qu'une variable globale; Cependant, il peut être utilisé de manière non globale-statique, mais ce n'est pas ce dont nous parlons ici :)


Je n'ai pas dit que c'est un bon moyen d'utiliser Zend_registry directement de la vue, ainsi que sur les em. J'ai dit que pour des opinions ont besoin d'aide



4
votes

Etant donné que le EntityManager est généralement créé et configuré pendant Bootstrap - soit comme la valeur de retour d'un _InitDoctrine explicite () appel ou à l'aide d'une ressource d'application - stocker-la dans Le bootstrap semble avoir le plus de sens pour moi. Ensuite, à l'intérieur d'un contrôleur, il est accessible comme suit:

$ em = $ ceci-> getinvokearg ('bootstrap') -> getresource ('doctrine');

Je vois beaucoup d'exemples d'accès bootstrap via le contrôleur avant Singleton:

$ em = zend_controller_front :: getinstance () -> getparam ('bootstrap') -> getresource ("doctrine");

qui a l'avantage qui fonctionne partout.


8 commentaires

C'est la meilleure option, vous devez éviter d'utiliser Zend_Riguy dans la mesure du possible. Bien que je ne recommanderais pas d'utiliser dans les composants de Zend-cadre; L'entitémanager ne doit être utilisé que par des services et des référentiels.


@Cobby: Quels sont les "services et référentiels"? Merci


@David $ em = zend_controller_front :: getinstance () -> getparam ('bootstrap') -> getresource ('doctri ne'); est une très longue ligne à taper! Cela peut devenir très ennuyeux;)


@Matthieu Départ Ce blog post et < un href = "http://www.doctrine-project.org/docs/orm/2.0/fr/referferferferferd/working-with-Object.html?hightlight=repository#custom-repositories" rel = "Nofollow Noreferrer"> Doctrine et Cette question .


@Matthieu en effet très longtemps. Bien trop long. Comme dans le deuxième lien de @ Coquet, je n'utiliserais probablement probablement qu'une seule fois, soit dans une méthode init () d'un contrôleur () ou dans un assistant d'action.


@Cobby: Merci! Je me rends compte que je devrais utiliser les EM dans les services, pas les contrôleurs et les vues ... Veuillez créer une réponse afin que je puisse l'accepter, je pense que c'est important pour quelqu'un d'autre qui a la même question.


@Cobby - Vous plaisantez-vous? La meilleure option??? Pourquoi la Zend_registry parfaitement indépendante serait-elle pire alors Zend_Controller_front avec des dépendances de Zillion? Que diriez-vous de tester vos services?


Je pense que vous pourriez avoir mal interprété mon premier commentaire. Le stockage de l'em dans zend_registry ou zend_controller_front est à la fois Bad IMO et ma solution ne fait pas cela. Mes services n'ont pas de dépendances-cadre Zend et peuvent simplement être instanciés à un EntityManager, car ils sont des cours simples - cela les rend super faciles à tester. S'il vous plaît voir la réponse acceptée (écrite par moi) pour plus d'informations.



0
votes

Je stocke le gestionnaire d'entité dans Zend_registry, puis j'ai également créé un assistant d'action que j'appelle dans mes contrôleurs.


0 commentaires

12
votes

Je ne recommanderais pas d'utiliser l'entitémanager directement dans vos contrôleurs et vos vues. Utilisez plutôt une couche de service et injectez l'entitémanager que cela.

J'ai deux aides d'action personnalisés, une pour récupérer des référentiels et un pour les services. Chaque action détient une référence à l'entitémanager et injectez-le en conséquence avant de le remettre au contrôleur. P>

pas mon code actuel mais quelque chose comme ceci (non testé): P>

Mon / contrôleur / action / assistant / service.php strong> p> xxx pré>

Vous pouvez écrire une assistante d'action similaire pour récupérer des référentiels. P>

Alors, Enregistrez l'aide de votre bootstrap (où nous avons également accès à l'entitémanager): p> xxx pré>

écrivez maintenant un service simple. P>

mon / Domaine / blog / service / postservice.php strong> p> xxx pré>

et pour l'apporter ensemble dans une action de contrôleur: P>

<?php

class Blog_PostController extends Zend_Controller_Action
{

    private $postService;

    public function init()
    {
        $this->postService = $this->_helper->Service('My\Domain\Blog\PostService');
    }

    public function createPostAction()
    {
        // normally we'd get data from the actual request
        $data = array(
            "title" => "StackOverflow is great!",
            "content" => "Imagine where I'd be without SO :)"
        );
        // and then validate it too!!

        $post = $this->postService->createPost($data);
        echo $post->getId(); // Blog post should be persisted
    }

}


1 commentaires

Dans l'assistant d'action de service ci-dessus, vous souhaitez étendre zend_controller_action_helper_abstract, pas zend_view_helper_abstract.



1
votes

Regardez l'intégration fournie par le paquet BISNA, écrite par l'une des doctrines 2 contribue. C'est à https://github.com/guilhermeblanco/zendframework1-doctrine2

Il vous permet de configurer la doctrine dans votre Application.ini . Il utilise un plugin de ressources d'application pour traiter les paramètres INI. J'ai écrit une documentation pour Bisna. Il peut être intégré à l'emballage au moment où vous le lisez. Si non, vous pouvez le trouver chez https://github.com/kkruecke/zendframework1-Doctrine2 , dans la Bisna-Documentation / HTML SubDirectory de cet emballage. J'ai également mis la documentation A http://www.kurttest.com/zfa/bisna.html < / a> (bien que cela puisse être temporaire).


0 commentaires