Tôi đang chạy mã tương đương với rất nhiều hành động điều khiển, về cơ bản nó lấy tên người dùng của người dùng và nếu tên người dùng đó được gắn với thực thể blog, nó sẽ cho phép người dùng để xem (các) thực thể blog:Người dùng truy cập và học thuyết của Symfony2 trong một dịch vụ
$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,
Tôi muốn chuyển nó thành dịch vụ để tôi có thể cắt giảm mã lặp lại. Tôi muốn tránh làm nhiều logic trong bộ điều khiển của mình càng tốt.
Điều đó đang được nói, tôi không chắc chắn cách tôi có thể truy cập vào phiên người dùng và học thuyết trong một dịch vụ.
Dưới đây là services.yml tôi:
mysite.user.blog:
class: MySite\SiteBundle\Services\BlogUser
Và dưới đây là cách tôi đã cố gắng gọi nó trong bộ điều khiển:
public function testAction() {
$response = $this->get('mysite.user.blog');
return new Response($response);
}
Tôi đã thử sử dụng một sự kiện subscriber/listener thẻ, nhưng điều đó không' t dường như hoàn thành nhiệm vụ tôi muốn.
Đây là nỗ lực hoàn toàn khủng khiếp của tôi đối với dịch vụ. Tôi không thể nhận được bất kỳ phản hồi từ nó mà không sử dụng một nhà xây dựng.
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));
}
}
Tôi sẽ làm điều này theo cách hoàn toàn sai? Có cách nào tốt hơn tôi đang thiếu?
EDIT/ĐÁP:
sửa đổi của tôi quy ước đặt tên một chút:
//services.yml
mysite.user.blog.entities:
class: Mysite\SiteBundle\Services\BlogUser
arguments: ["@doctrine.orm.entity_manager", "@security.context"]
Trong controller action:
$userEntities = $this->get('mysite.user.blog.entities');
$entities = $userEntities->getEntities();
Trong dịch vụ riêng của mình:
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;
}
}
Vẫn cần hai dòng để lấy biến $ entity trong controller, nhưng đây là cách tốt hơn so với việc định nghĩa cùng một thứ lặp đi lặp lại.
Như từ symfony v. 2.6 ngữ cảnh bảo mật không được dùng nữa: http://symfony.com/doc/current/book/security.html – 11mb