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