Symfony2 d'accès de l'utilisateur et de la doctrine dans un service
Je suis en cours d'exécution, l'équivalent de ce code dans beaucoup, beaucoup d'actions de contrôleur, fondamentalement, il saisit le nom de l'utilisateur, et si ce nom d'utilisateur est attaché à une entité blog il permettra à l'utilisateur de voir le blog de l'entité(s):
$em = $this->getDoctrine()->getManager();
$user = $this->get('security.context')->getToken()->getUser();
$entities = $em->getRepository('MySiteBundle:Blog')->findBy(array('user' => $user));
return $this->render('MySiteBundle:Blog:index.html.twig', array(
'entities' => $entities,
Je veux le déplacer dans un service, de sorte que je peux couper vers le bas sur la répétition de code. Je veux éviter de faire autant de logique dans mes contrôleurs que possible.
Cela étant dit, je ne suis pas sûr de savoir comment je peux accéder à la session de l'utilisateur et de la doctrine dans un service.
Voici mes services.yml:
mysite.user.blog:
class: MySite\SiteBundle\Services\BlogUser
Et voici comment je tente de l'appeler dans le contrôleur:
public function testAction() {
$response = $this->get('mysite.user.blog');
return new Response($response);
}
Je l'ai fait essayer à l'aide d'un événement l'abonné/écouteur tag, mais qui ne semble pas accomplir la tâche que je veux.
Voici ma complètement horrible tentative de service. Je ne pouvais pas obtenir de réponse, sans l'aide d'un constructeur.
namespace MySite\SiteBundle\Services;
use MySite\SiteBundle\Entity\Blog;
class BlogUser {
protected $entities;
public function __construct(){
$em = $this->getDoctrine()->getManager();
$user = $this->get('security.context')->getToken()->getUser();
$this->entities = $em->getRepository('MySiteBundle:Blog')->findBy(array('user' => $user));
}
}
Vais-je à ce propos sur l'complètement mauvais sens? Est-il une meilleure façon que je suis absent?
MODIFIER/RÉPONSE:
modifié ma convention de nommage un peu:
//services.yml
mysite.user.blog.entities:
class: Mysite\SiteBundle\Services\BlogUser
arguments: ["@doctrine.orm.entity_manager", "@security.context"]
Dans l'action du controller:
$userEntities = $this->get('mysite.user.blog.entities');
$entities = $userEntities->getEntities();
Dans le service lui-même:
class BlogUser {
protected $entities;
public function __construct($em, $securityContext){
$user = $securityContext->getToken()->getUser();
$this->entities = $em->getRepository('MySiteBundle:Blog')->findBy(array('user' => $user));
}
public function getEntities(){
return $this->entities;
}
}
A encore besoin de deux lignes pour obtenir les $entités variable dans le contrôleur, mais c'est mieux que de définir la même chose encore et encore.
OriginalL'auteur gan | 2013-08-14
Vous devez vous connecter pour publier un commentaire.
"De sécurité.contexte" a été abandonné depuis Symfony 2.6
Source
Ainsi, la nouvelle façon de faire il serait, tout d'abord configurer votre service:
Puis dans la classe de service constructeur:
OriginalL'auteur Sawant
Oui, vous le faites dans le mauvais sens. Regardons votre code:
Vous ne pouvez pas appeler l'obtention de l'entitymanager et
security.context
dans votre service, de la même manière comme dans votre contrôleur. Au lieu de cela, vous avez à injecter un entitymanager etsecurity.context
services. Exemple:Et l'amélioration du service:
Plus d'infos sur L'injection de dépendance
il est toujours valide noms de propriétés.
le
"calls:"
partie du service d'exécuter n'importe quelle fonction vous préciser? Est-il un avantage à utiliser à la place du constructeur en dehors de la flexibilité (ou de ré-utilisation de la même classe appelée par différents services?)J'utilise principalement l'injection par mutateur parce que: 1. c'est plus clair pour moi (surtout quand il y a beaucoup d'injection), 2. les poseurs sont faciles à gérer lorsque j'utilise le Service Parent. Plus d'infos: symfony.com/doc/current/components/dependency_injection/..., symfony.com/doc/current/components/dependency_injection/...
Vous êtes de droite. Fixe.
OriginalL'auteur NHG
Vous êtes à la recherche sur la façon de "injecter" autres services au sein de votre service personnalisé. Jetez un oeil à Conteneur De Service de la documentation.
Dans votre cas, vous pouvez injecter
doctrine.orm.entity_manager
etsecurity.context
services dans votreBlogUser
classe via le constructeur de l'injection. Par exemple:Et configurer votre service comme suit:
OriginalL'auteur dezull