Symfony2: Comment accéder aux services de référentiel
J'ai la classe ModelsRepository:
class ModelsRepository extends EntityRepository
{}
Et service
container_data:
class: ProjectName\MyBundle\Common\Container
arguments: [@service_container]
Je veux accéder à partir de ModelsRepository de service container_data. Je ne peux pas transmettre de service de contrôleur utilisé constructeur.
Savez-vous comment le faire?
OriginalL'auteur Alastor | 2012-10-19
Vous devez vous connecter pour publier un commentaire.
À mon humble avis, cela ne devrait pas être nécessaire puisque vous pouvez facilement briser les règles comme PRS et La loi de Déméter
Mais si vous en avez vraiment besoin, voici un moyen de le faire:
Tout d'abord, nous définissons une base "ContainerAwareRepository" de la classe qui a un appel "setContainer"
services.yml
La ContainerAwareRepository peut ressemble à ceci
AcmeBundle\Repository\ContainerAwareRepository.php
Ensuite, nous pouvons définir notre Modèle de Référentiel.
Nous utilisons ici la doctrine de l'
getRepository
méthode pour construire notre référentielservices.yml
Et puis, il suffit de définir la classe
AcmeBundle\Repository\ModelsRepository.php
Afin d'utiliser le référentiel, vous avez absolument besoin de l'appeler à partir du premier service.
Mais si vous ne
C'est une autre question. J'aimerais créer un "wrapper" de la classe qui prendra
UserRepository
comme argument. Ensuite, vous auriez une méthode dans votre enveloppe commefindUsersForUserByNameLike($name, User $user)
qui va d'abord vérifier les autorisations de l'utilisateur donné, construire la requête, puis de traiter les résultats. Pour le "règles" condition, je voudrais ajouter un tableau deRule
interface avec les méthodescheck(User $user)
etbuild(UserRepository $users)
Avec cela, vous voulez parcourir ce tableau et vérifier la règle qui correspond à l'utilisateur donné.Merci!! J'ai utilisé la même explication de l'utilisation de la méthode getService sur ma Couche de Service. 😉
OriginalL'auteur Touki
Vous devriez jamais passer conteneur pour le référentiel, tout comme vous ne devriez jamais laisser des entités à gérer de fortes logique. Les référentiels ont qu'un seul but - la récupération des données de la base de données. Rien de plus (lire: http://docs.doctrine-project.org/en/2.0.x/reference/working-with-objects.html).
Si vous avez besoin de quelque chose de plus complexe que cela, vous devriez probablement créer un document distinct (conteneur au courant si vous le souhaitez) de service.
OriginalL'auteur Itako
J'ai essayé des versions. Le problème a été résolu suit
ModelRepository:
de sécurité.yml:
services.yml
Comme un résultat que j'ai obtenu référentiel avec possibilité d'utiliser le conteneur que nécessaire.
Mais cette prise de conscience peut être utilisé que dans les cas critiques, parce qu'elle a des limites pour le Dépôt.
Thx 4all.
OriginalL'auteur Alastor
Je vous recommande d'utiliser un service de l'usine:
http://symfony.com/doc/current/components/dependency_injection/factories.html
OriginalL'auteur Piers
Êtes-vous sûr que c'est une bonne idée pour accéder à service de pensions?
Référentiels sont conçus pour SQL personnalisée où, dans le cas de la doctrine, la doctrine peut vous aider avec
find()
,findOne()
,findBy()
, [...] "de la magie".Prendre en compte afin d'injecter votre service lorsque vous utilisez votre repo et, si vous avez besoin de quelques paramètres, passer directement à des pensions de la méthode.
OriginalL'auteur DonCallisto
Je suis fortement d'accord que cela devrait être effectué uniquement lorsque cela est absolument nécessaire. Si il y a un approche la plus simple possible maintenant (testé avec Symfony 2.8).
RepositoryClass:
services.yml:
OriginalL'auteur con
L'extension de Laurynas Mališauskas réponse, pour passer d'un service à un constructeur de faire votre dépôt d'un service et de le passer avec des arguments:
OriginalL'auteur S3Mi
la façon la plus simple, consiste à injecter le service dans le référentiel constructeur.
J'ai écrit: "je ne peux pas transmettre de service de contrôleur utilisé constructeur".
de mon expérience, si vous ne pouvez pas faire quelque chose, c'est votre architecture de la faute, de ne pas le cadre. Vous êtes juste les faits les choses dans le mauvais endroit.
OriginalL'auteur Laurynas Mališauskas