2012-08-07 33 views
15

Hiện tại tôi đang học cách sử dụng Symfony2. Tôi đã đến lúc họ giải thích cách sử dụng Doctrine.Khi nào sử dụng Quản lý thực thể trong Symfony2

Trong ví dụ được đưa đôi khi họ sử dụng người quản lý thực thể:

$em = $this->getDoctrine()->getEntityManager(); 
$products = $em->getRepository('AcmeStoreBundle:Product') 
     ->findAllOrderedByName(); 

và trong các ví dụ khác người quản lý thực thể không được sử dụng:

$product = $this->getDoctrine() 
     ->getRepository('AcmeStoreBundle:Product') 
     ->find($id); 

Vì vậy, tôi thực sự cố gắng ví dụ đầu tiên mà không nhận được người quản lý thực thể:

$repository = $this->getDoctrine() 
     ->getRepository('AcmeStoreBundle:Product'); 
$products = $repository->findAllOrderedByName(); 

và có cùng kết quả.

Vì vậy, khi nào tôi thực sự cần người quản lý thực thể và khi nào thì OK để chỉ truy cập kho lưu trữ cùng một lúc?

Trả lời

28

Nhìn vào ControllergetDoctrine() tương đương với $this->get('doctrine'), ví dụ Symfony\Bundle\DoctrineBundle\Registry. Registry cung cấp:

Như vậy, $this->getDoctrine()->getRepository() bằng $this->getDoctrine()->getEntityManager()->getRepository().

quản lý Entity rất hữu ích khi bạn muốn kéo dài hoặc loại bỏ một thực thể:

$em = $this->getDoctrine()->getEntityManager(); 

$em->persist($myEntity); 
$em->flush(); 

Nếu bạn chỉ lấy dữ liệu, bạn có thể nhận được chỉ kho:

$repository = $this->getDoctrine()->getRepository('AcmeStoreBundle:Product'); 
$product = $repository->find(1); 

Hoặc tốt hơn , nếu bạn đang sử dụng kho lưu trữ tùy chỉnh, hãy quấn getRepository() vào chức năng điều khiển vì bạn có thể nhận tính năng tự động hoàn thành từ IDE của mình:

/** 
* @return \Acme\HelloBundle\Repository\ProductRepository 
*/ 
protected function getProductRepository() 
{ 
    return $this->getDoctrine()->getRepository('AcmeHelloBundle:Product'); 
} 
+0

Tôi đã biết tôi cần sử dụng trình quản lý thực thể khi sử dụng 'flush()'. Ngoài ra, ý tưởng sử dụng hàm 'getProductRepository()' là một thứ có thể hữu ích, cảm ơn! –

+1

@MatsRietdijk vui mừng được giúp đỡ! Tôi luôn luôn quấn '$ this-> get ('some service')' trong các hàm tùy chỉnh trong 'BaseController' của tôi để có được tự động hoàn thành ... – gremo

+1

Vị trí của' AcmeStoreBundle: Product 'ở đâu tôi có thể tìm thấy' Product' trong ứng dụng Symfony của tôi. –

2

Tôi nghĩ rằng getDoctrine()->getRepository() chỉ đơn giản là một phím tắt đến getDoctrine()->getEntityManager()->getRepository(). Đã không kiểm tra mã nguồn, nhưng âm thanh khá hợp lý với tôi.

+0

Cảm ơn, có vẻ như đó là lối tắt. –

0

Nếu bạn có kế hoạch thực hiện nhiều thao tác với trình quản lý thực thể (như lấy một kho lưu trữ, duy trì một thực thể, tuôn ra, vv), sau đó nhận trình quản lý thực thể trước và lưu nó trong một biến. Nếu không, bạn có thể lấy kho lưu trữ từ trình quản lý thực thể và gọi bất kỳ phương thức nào bạn muốn trên lớp kho lưu trữ tất cả trong một dòng. Cả hai cách sẽ hoạt động. Nó chỉ là vấn đề về phong cách mã hóa và nhu cầu của bạn.

Các vấn đề liên quan