2012-10-23 46 views
7

Có cách nào tốt hơn để liên kết dữ liệu từ lớp thực thể doctrine2 ODM với biểu mẫu Zend2 ngoài việc sử dụng bind() không?Ràng buộc dữ liệu biểu mẫu Zend2 từ doctrine2 ODM

Nếu có, nó sẽ là gì? Tôi có thể truy xuất dữ liệu dưới dạng mảng và chuyển từng trường riêng lẻ không? Tôi đang đấu tranh với điều này và rất có thể làm cho nó khó hơn nó cần phải được.

Khi tôi gọi hàm bind(), nó xuất ra lỗi Zend tham chiếu trình kết xuất mặc định. Tôi có cần phải làm điều gì đó đặc biệt trong lớp thực thể của tôi không?

Edit: Đây là những lỗi chính xác Zend là ném

~ \ nhà cung cấp \ ZendFramework \ ZendFramework \ library \ Zend \ stdlib \ Hydrator \ ArraySerializable.php: 35

Zend \ stdlib \ Hydrator \ ArraySerializable :: chiết xuất hy vọng cung cấp đối tượng để thực hiện getArrayCopy()

Họ làm cho tôi nghĩ rằng tôi cần phải hoặc là:

  1. sử dụng Zends hydrators (mà tôi sẽ phải nghiên cứu làm thế nào để thực hiện) hoặc
  2. hydrators
  3. sử dụng doctrine2 (mà, tôi cũng sẽ phải tìm ra cách tốt nhất để thực hiện)
+0

Vui lòng chỉnh sửa câu hỏi của bạn để chứa các thông báo lỗi thực tế. Cách ZF2 hoạt động bạn liên kết một đối tượng/thực thể với biểu mẫu của bạn và sau đó Trình quản lý Hydrator được chỉ định đảm bảo các trường Mẫu được tham chiếu được ánh xạ phù hợp. Điều này thực sự là một trường hợp sử dụng rất đơn giản và một sự tách biệt tốt các mối quan tâm, như được đưa ra bởi các thông báo lỗi bạn sẽ luôn luôn biết nơi để tìm. – Sam

Trả lời

14

Đối với Zend \ Mẫu có khả năng dưỡng ẩm thực thể của bạn, bạn cần phải có một cái gì đó như thế trong lớp thực thể của bạn:

public function getArrayCopy() 
{ 
    return get_object_vars($this); 
} 
+1

Ma thuật hydrat hóa tự động, kiểu ZF2. Đường cong học tập dễ dàng ... –

+1

Bị hấp dẫn bởi hàm get_object_vars. Tham khảo: [get_object_vars] (http://php.net/manual/en/function.get-object-vars.php) - "Gets các thuộc tính không tĩnh có thể truy cập của đối tượng đã cho theo phạm vi." –

+1

Để rõ ràng hơn, chúng tôi thêm phương thức trên vào tệp này: '\ zf2-tutorial \ module \ Album \ src \ Album \ Model \ Album.php'. –

1

tôi sử dụng phương thức phổ biến trong lớp thực thể của tôi. một cái gì đó như thế này

public function populate($data = array()) 
    { 
     $this->id = (isset($data['id'])) ? $data['id'] : null; 
     $this->username = (isset($data['username'])) ? $data['username'] : null; 
     $this->pass = (isset($data['pass'])) ? $data['pass'] : null;    

    } 

và sau đó trong bộ điều khiển, bạn có thể sử dụng chức năng giống như thế này.

$user = new User(); 
$request = $this->getRequest(); 
$user->populate($request->getPost()); 

Tôi không chắc liệu tôi có hiểu chính xác yêu cầu của bạn hay không.

+0

Về cơ bản, các câu hỏi của tôi liên quan đến một editAction(). Tôi muốn người dùng có thể chỉnh sửa thông tin họ đã đăng, rõ ràng. Tôi đã thực hiện một số nghiên cứu và tìm thấy Zend sử dụng một phương thức bind() sẽ lấy dữ liệu từ thực thể của tôi và điền vào biểu mẫu để chỉnh sửa. Hiện tại tôi đang làm một cái gì đó như $ form = new Form(); $ form-> bind ($ entity). Thực thể $ của tôi đang sử dụng getServiceLocator của doctrne2() và tôi tạo một truy vấn bằng cách sử dụng getQueryBuilder(). Khi tôi điều hướng đến editAction của mình, tôi nhận được lỗi sau Zend \ Stdlib \ Hydrator \ ArraySerializable :: extract mong đợi đối tượng được cung cấp để thực hiện getArrayCopy() – bl4design

1

May mắn thay, bạn không cần bất cứ điều gì nhiều hơn vào các đơn vị của bạn nếu bạn làm theo hướng dẫn này:

http://samminds.com/2012/07/a-blog-application-part-1-working-with-doctrine-2-in-zend-framework-2/ tôi sử dụng gần bằng phương pháp tương tự và nó là (hầu như) hoạt động tốt. Hai điều bạn nên quan tâm:

1.) Đảm bảo bạn xác thực tất cả dữ liệu bạn có trong bảng của mình (hoặc ít nhất là các bảng không rỗng), vì chỉ các trường được xác thực mới được gửi đến DB. Nó đã được nói với tôi bởi tác giả của blog này. :)

2.) Khi bạn tạo cấu hình riêng cho hình thức chỉnh sửa, thêm id để các tuyến đường:

$form->setAttribute('action', $this->url('post', 
        array('action'=>'add', 'id'=>"$this->id")))->prepare(); 

Chúc may mắn!

2

trong bạn .../mẫu/XXXXTable.php
định nghĩa một hàm muốn để có được một kỷ lục.

$id = (int)$id; 
    $row = $this->tableGateway->select(array('id'=>$id)); 
    $row = $row->current(); //this line is very important 
+0

cảm ơn, thực sự đã cứu giờ của tôi. –

2

tôi sử dụng đoạn mã sau vào module.config.php sử dụng học thuyết Hydrator

$form = new ...; 
$dm = $sm->get('doctrine.documentmanager.odm_default'); 
$form->setHydrator(new \DoctrineModule\Stdlib\Hydrator\DoctrineObject($dm)); 
return $form; 
Các vấn đề liên quan