2012-11-20 28 views
7

Điều tôi muốn biết là cách tốt nhất để tạo biểu mẫu khớp với một thực thể.Tạo các mẫu ZF 2 từ các thực thể học thuyết

  • Tạo thủ công biểu mẫu bằng mã hoặc sử dụng chú thích biểu mẫu?
  • Sử dụng chú thích từ thực thể?

Tôi đã xem một vài ví dụ khác nhau, một số sử dụng @Annotation và một số khác sử dụng @Form? Ai đó có thể giải thích sự khác biệt?

Trong trường hợp các thực thể có thực thể liên quan/lồng nhau, tôi có cần cung cấp trình điều chỉnh tùy chỉnh cho mọi thực thể không? Tôi cho rằng Doctrine có thể đã có một trình cài đặt giao diện hydrator?

Để tóm tắt: - Cách tốt nhất để tạo biểu mẫu từ Thực thể. - Sự khác biệt giữa @Form và @Annotation - Doctrine có Hydrator cho thực thể của nó không?

Trả lời

11

Trước hết: Chú thích là Kẻ giết tốc độ. Nếu bạn muốn sử dụng trình tạo chú thích, vui lòng LUÔN LẬP Cache các đối tượng đã tạo. Nhưng chú thích cũng là cách dễ nhất để có được một biểu mẫu đang chạy;)

Thứ hai: Hydrator. Khi sử dụng các biểu mẫu ZF2 kết hợp với Doctrine 2, rất có thể bạn muốn sử dụng DoctrineEntity Hydrator nằm bên trong. Xét đoạn mã sau:

$form = new ReferenzwertForm(); 
$form->setHydrator(new DoctrineEntity($serviceLocator->get('Doctrine\ORM\EntityManager'))) 
    ->setObject(new Referenzwert()) 
    ->setInputFilter(new ReferenzwertFilter()) 
    ->setAttribute('method', 'post'); 
return $form; 
  • ReferenzwertForm() là loại Zend\Form\Form Object
  • DoctrineEntity() là loại DoctrineORMModule\Stdlib\Hydrator\DoctrineEntity
    • DoctrineEntity cần EntityManager cung cấp. Bạn nên làm quen với điều này khi sử dụng Doctrine, 2 trong ZF2
  • Referenzwert() là một Entity-Object

Khi không sử dụng các chú thích và bạn đang tham khảo khác Entity, thì chắc chắn rằng bạn sử dụng yếu tố hình thức thích hợp (trong hầu hết các trường hợp này sẽ là một yếu tố lựa chọn (như lựa chọn một CategoryEntity cho một BlogEntity hoặc một cái gì đó)

$this->add(array(
    'name' => 'type', 
    'type' => 'DoctrineORMModule\Form\Element\DoctrineEntity', 
    'options' => array(
      'label' => 'Choose a MyEntity', 
      'object_manager' => $this->getEntityManager(), 
      'target_class' => 'Namespace\Entity\MyEntity', 
      'property' => 'name' 
    ), 
    'attributes' => array(
     'required' => true 
    ) 
)); 

như bạn thấy, yếu tố biểu mẫu cần biết về EntityManager, quá. Đây lý do tại sao lý tưởng bạn muốn ext kết thúc Code-Example đầu tiên với một setter khác để inject entityManager vào đối tượng form của bạn.

$form->setEntityManager($serviceLocator->get('Doctrine\ORM\EntityManager')) 
    ->set()//all the other stuff 

Cách tiếp cận tốt nhất nói chung là gì? Tôi muốn nói không có gì. Vì mục đích tốc độ, chú thích chỉ là một kẻ giết người. Sử dụng các phiên bản được lưu trong bộ nhớ cache sẽ giúp ích, mặc dù tôi chưa có kinh nghiệm cá nhân về bộ nhớ đệm trong ZF2. Tôi muốn tạo biểu mẫu của mình từ tay bên ngoài chú thích, đơn giản vì IDE của tôi hỗ trợ rất nhiều nội dung, nhưng chắc chắn không tạo thành chú thích: D

Hy vọng điều này có thể giúp bạn một chút và tôi không viết quá nhiều ngữ cảnh: P

+0

Câu trả lời hay, cảm ơn. Tôi có thể đúng khi cho rằng ví dụ mã của bạn với target_class etc có thể được chuyển thành Chú thích không?Tôi không cảm thấy như thể hiệu suất sẽ là một vấn đề lớn trong các lĩnh vực này và bộ nhớ đệm là một cái gì đó chúng ta có thể thực hiện nếu cần thiết. – Ben

+0

Tôi đã không làm việc với chú thích cho đến nay, vì vậy tôi không thể cho bạn biết chính xác. Những gì tôi biết là phân tích cú pháp là một hiệu suất vẽ lớn, do đó tôi bước ra khỏi nó. Đó là đủ để tôi có các thực thể phân tích cú pháp rồi;) 'target_class' xác định thực thể được hiển thị và' property' là thuộc tính được hiển thị bên trong phần tử chọn – Sam

+0

Tôi không cảm thấy như là hiệu suất đạt được là không đáng kể trên biểu mẫu. Bạn có một số bằng chứng về điều này? Nếu không, mẫu mã của bạn hoạt động tốt. Cảm ơn vì sự giúp đỡ. – Ben

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