Я использую эквивалент этого кода во множестве действий контроллера, в основном он захватывает имя пользователя пользователя, и если это имя пользователя привязано к объекту блога, это позволит пользователю чтобы увидеть сущность блога (ы):Symfony2 доступ к пользователю и доктрине в службе
$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,
Я хочу, чтобы переместить его в сервис, так что я могу сократить код повторения. Я хочу избегать делать как можно больше логики в моих контроллерах.
Это, как говорится, я не уверен, как я могу получить доступ к сеансу пользователя и доктрине в службе.
Вот мой services.yml:
mysite.user.blog:
class: MySite\SiteBundle\Services\BlogUser
И вот как я пытался вызвать в контроллере:
public function testAction() {
$response = $this->get('mysite.user.blog');
return new Response($response);
}
Я попытался с помощью событий subscriber/listener тег, но это Безразлично» Кажется, я выполняю задание, которое я хочу.
Вот моя совершенно ужасная попытка служения. Я не мог получить от него никакого ответа, не используя конструктор.
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));
}
}
Я об этом совершенно неправильно? Есть ли лучший способ, который мне не хватает?
EDIT/ОТВЕТ:
модифицирована мое именование немного:
//services.yml
mysite.user.blog.entities:
class: Mysite\SiteBundle\Services\BlogUser
arguments: ["@doctrine.orm.entity_manager", "@security.context"]
В действии контроллера:
$userEntities = $this->get('mysite.user.blog.entities');
$entities = $userEntities->getEntities();
В самой службе:
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;
}
}
Еще нужно две строки, чтобы получить переменную $ сущностей в контроллере, но это лучше, чем определение одной и той же вещи снова и снова.
Так как с symfony v. 2.6 контекст безопасности устарел: http://symfony.com/doc/current/book/security.html – 11mb