我在很多很多控制器操作中运行此代码的等价物,基本上它获取用户的用户名,如果该用户名附加到博客实体,它将允许用户查看博客实体:
$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);
}
我确实尝试过使用事件订阅者/侦听器标签,但这似乎并没有完成我想要的任务。
这是我对服务的完全可怕的尝试。如果不使用构造函数,我无法得到任何响应。
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));
}
}
我会以完全错误的方式解决这个问题吗?有没有更好的方法让我想念?
编辑/回答:
稍微修改了我的命名约定:
//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;
}
}
仍然需要两行来获取控制器中的 $entities 变量,但这比一遍又一遍地定义相同的东西要好得多。