Có cách nào tốt để kiểm tra các đối tượng có loại được lấy từ lớp EntityDrupalWrapper không?


38

Tôi chắc chắn câu hỏi này áp dụng cho các loại đối tượng phức tạp khác, nhưng EntityDrupalWrapperlà loại tôi hiện đang làm việc. Đây là loại đối tượng được trả về bởi entity_metadata_wrapper()(và có thể là những người khác).

Khi sử dụng mã như sau:

$order_wrapper = entity_metadata_wrapper('commerce_order', $order_object);
dpm($order_wrapper);

đầu ra từ Devel không quá hữu ích:

ảnh chụp màn hình

Nó không hiển thị những gì bạn muốn thấy cho một cuộc gọi đến dpm(), ví dụ, một stdClassđối tượng.

Một lệnh gọi tương tự để dvm()in đối tượng, nhưng theo cách mà tôi không quen thuộc và nó không dễ đọc lắm.

Tôi đã thử debug()và nó tạo ra một thông báo người dùng PHP trông giống như thế này:

ảnh chụp màn hình 2

Ngẫu nhiên, đầu ra HTML có trong cảnh báo đó là cùng một đầu ra dvm()in ra màn hình.

Làm cách nào tôi có thể kiểm tra các loại đối tượng này (tốt nhất là với Krumo), vì vậy tôi có thể xem các thuộc tính nào có sẵn? Hay tôi bị mắc kẹt khi sử dụng dvm()?


thử gỡ lỗi () được giới thiệu trong Drupal 7
Shoaib Nawaz

Cảm ơn @ShuaibNawaz, thậm chí ít thành công hơn với điều đó mặc dù tôi rất sợ (tôi đã cập nhật câu hỏi)
Clive

2
Đúng, đó chính xác là một trong những vấn đề với các lớp bao bọc. dpm () / krumo chỉ thấy các thuộc tính công cộng. Mọi thứ trong các lớp bao bọc đều được bảo vệ và truy cập thông qua các phương thức ma thuật __get () và __set ().
Berdir

@Berdir Tôi sợ điều đó; Tôi đã không nhìn nhưng nó có mùi rất giống __get()__set()có liên quan. Bạn có bất kỳ cách ưa thích nào để tìm hiểu các thuộc tính lớp nào có sẵn cho trình bao bọc nào không? Hay đó chỉ là vấn đề 'hiểu biết' dựa trên kinh nghiệm?
Clive

1
@Berdir Tôi không nghĩ bạn sẽ được thông báo về điều này, bạn có thể sử dụng dpm($wrapper->getPropertyInfo());, nó thực sự giúp ích cho mọi thứ
Clive

Câu trả lời:


38

Sử dụng dpm ($ Wrapper-> getPropertyInfo ());

Đó là trong các tài liệu .


Và để kiểm tra các trường cụ thể từ nút của bạn, bạn có thể sử dụngkpr($wrapper->my_custom_field->value());
wranvaud

4

Tôi đã chơi với các đối tượng EntityDrupalWrapper. debug () thường trả về đầu ra có thể đã được chuẩn bị bởi __toString ()

Tôi đã lặp lại đối tượng EntityDrupalWrapper bằng cách sử dụng foreach và nó giúp liệt kê tên của các thuộc tính.

foreach($order_wrapper as $name => $obj){
  debug($name);
  debug(get_class($obj)); //EntityValueWrapper
}

Đây $objlà một đối tượng của loạiEntityValueWrapper

$ obj có thể được đọc bởi $ obj-> value () và có thể được viết bởi $ obj-> set ('value');

CHỈNH SỬA:

Nếu bạn đã tạo trình bao bọc của mình mà không vượt qua param thứ hai
tức là entity_metadata_wrapper ('Commerce_order');
sau đó thiết lập và các phương thức giá trị sẽ đưa ra ngoại lệ vì chúng không được thực hiện.


4

Tôi cố gắng viết tiện ích nhỏ của riêng mình để hủy đăng ký trình bao bọc:

function _wrapper_debug($w) {
  $values = array();
  foreach ($w->getPropertyInfo() as $key => $val) {
    $values[$key] = $w->$key->value();
  }
  return $values;
}

dpm(_wrapper_debug($some_object_wrapper));

Hy vọng ai đó thấy nó hữu ích.


3

Các Kiểm tra mô-đun cung cấp cái nhìn cấu trúc tốt đẹp của các dữ liệu bạn muốn gỡ lỗi.

Nhận các kết xuất biến được định dạng và định dạng tốt, dấu vết ngăn xếp sâu và hồ sơ thời gian thực hiện - vào nhật ký cơ sở dữ liệu (Báo cáo / thông báo nhật ký gần đây), để tệp hoặc sàng lọc.


3

Nếu bạn muốn kiểm tra đối tượng ban đầu đang "cấp nguồn" cho trình bao bọc, hãy thử:

dpm($wrapper->raw())

Công việc này phù hợp với tôi.



Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.