Czy istnieje dobry sposób na sprawdzenie obiektów, których typ pochodzi od klasy EntityDrupalWrapper?

38

Jestem pewien, że to pytanie dotyczy innych złożonych typów obiektów, ale z EntityDrupalWrappertym obecnie pracuję. Jest to typ obiektu zwracanego przez entity_metadata_wrapper()(i prawdopodobnie inne).

Podczas korzystania z kodu w następujący sposób:

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

dane wyjściowe z Devel nie są zbyt pomocne:

zrzut ekranu

Nie pokazuje, czego można się spodziewać po wywołaniu dpm()na przykład z stdClassobiektem.

Podobne wywołanie dvm()powoduje wydrukowanie obiektu, ale w pewien sposób nie jestem zaznajomiony i nie jest zbyt czytelny.

Próbowałem debug()i generuje komunikat PHP, który wygląda mniej więcej tak:

zrzut ekranu 2

Nawiasem mówiąc, wynik HTML zawarty w tym ostrzeżeniu jest tym samym wyjściem, dvm()co na ekranie.

Jak mogę sprawdzić tego rodzaju obiekty (najlepiej za pomocą Krumo), aby zobaczyć, jakie właściwości są dostępne? A może utknąłem przy użyciu dvm()?

Clive
źródło
try debug () wprowadzony w Drupal 7
Shoaib Nawaz
Dzięki @ShuaibNawaz, jeszcze mniej sukcesów z tym, chociaż się obawiam (zaktualizowałem pytanie)
Clive
2
Tak, to dokładnie jeden z problemów z klasami opakowań. dpm () / krumo widzi tylko właściwości publiczne. Wszystko w klasach opakowań jest chronione i dostęp za pomocą magicznych metod __get () i __set ().
Berdir
@Berdir Bałem się tego; Nie wyglądałem, ale pachniało bardzo __get()i __set()byłem zaangażowany. Czy poza zainteresowaniem masz jakiś preferowany sposób sprawdzenia, jakie właściwości klasy są dostępne dla danego opakowania? A może chodzi tylko o „wiedzę” opartą na doświadczeniu?
Clive
1
@Berdir Nie sądzę, że zostaniesz o tym powiadomiony, możesz go użyć dpm($wrapper->getPropertyInfo());, to naprawdę pomaga
Clive

Odpowiedzi:

38

Użyj dpm ($ wrapper-> getPropertyInfo ());

To jest w dokumentacji .

TwiiK
źródło
Aby sprawdzić poszczególne pola ze swojego węzła, możesz użyćkpr($wrapper->my_custom_field->value());
wranvaud 28.04.16
4

Bawiłem się obiektami EntityDrupalWrapper. debug () zwykle zwraca dane wyjściowe, które mogły zostać przygotowane przez __toString ()

I iterowałem obiekt EntityDrupalWrapper za pomocą foreach i pomogło to wyświetlić listę właściwości.

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

Oto $objobiekt typuEntityValueWrapper

$ obj można odczytać za pomocą $ obj-> wartość () i można zapisać za pomocą $ obj-> set ('wartość');

EDYTOWAĆ:

Jeśli utworzyłeś opakowanie bez
podania drugiego parametru, tj. Entity_metadata_wrapper ('commerce_order');
następnie metody set i value wygenerują wyjątek, ponieważ nie są zaimplementowane.

Shoaib Nawaz
źródło
4

Skończyło się na pisaniu własnego małego widżetu, aby rozwinąć opakowanie:

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));

Mam nadzieję, że ktoś uzna to za przydatne.

Armadillo Jim
źródło
3

Sprawdzić moduł zapewnia piękny widok strukturalną dane chcesz debugować.

Uzyskaj pouczające i dobrze sformatowane zrzuty zmiennych, ślady głębokiego stosu i profile czasu wykonania - do dziennika bazy danych (Raporty / Najnowsze komunikaty dziennika), do pliku lub do ekranu.

Lars Nielsen
źródło
3

Jeśli chcesz sprawdzić oryginalny obiekt, który „zasila” opakowanie, spróbuj:

dpm($wrapper->raw())

To działa dobrze dla mnie.

Nacięcie
źródło
2

Dostępna jest łatka rozwojowa, która umożliwia Krumo wyświetlanie wszystkich prywatnych i chronionych właściwości.

Oto wątek na drupal.org

Ta łatka była dla mnie bardzo pomocna.

Felix Eve
źródło
0

Użyj drupal cli

$ drupal debug:entity
// Displays current events 
Kevin Howbrook
źródło