我在很多控制器操作中运行与此代码等效的代码,基本上它会获取用户的用户名,如果该用户名附加到博客实体,它将允许用户查看博客实体:
$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);
}
我确实尝试过使用事件订户/听众 http://symfony.com/doc/current/cookbook/doctrine/event_listeners_subscribers.html标签,但这似乎没有完成我想要的任务。
这是我对服务的完全可怕的尝试。如果不使用构造函数,我无法从中得到任何响应。
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 变量,但这比一遍又一遍地定义相同的东西要好得多。