2008-10-19 9 views
8

Mam bardzo dziwny problem, gdy próbuję uzyskać var_dump (lub print_r) obiekt Doctrine, moje odpowiedzi Apache z pustą pustą stroną (200 OK, nagłówek). Mogę var_dump normalny php var jak:Dlaczego var_dump a Doctrine Objects zabić mojego Apache?

$dummy = array("a" => 1, "b" =>2); 

I działa dobrze. Ale nie mogę z żadnym obiektem z żadnej klasy Doctrine (jak wynik z $connection->query() lub instancji klasy z mojego modelu obiektowego z Doctrine).

Ktoś wie, dlaczego tak się dzieje?

+4

jest to numer jeden wynik google dla „doktryny var_dum p ". Proszę przyjąć poprawną odpowiedź (http://stackoverflow.com/a/8646048/3408), a nie "zwiększyć limit pamięci", który tak naprawdę nie rozwiązuje problemu. – rjmunro

Odpowiedz

1

Zdarzyło mi się, że czasami, gdy próbuje się ustawić obiekt samodopasujący - wchodzi w pętlę i kończy się pamięć. Możliwe, że tak się z tobą dzieje.

Spróbuj zwiększyć limit pamięci (ini_set('memory_limit', '256M');) i sprawdź, czy to rozwiązuje.

Edycja: Nie sądzę, aby istniała rzeczywista poprawka - jest to wewnętrzny kod PHP var_dump/print_r, który nie ogranicza głębi przy rekursji (lub przynajmniej nie rób tego poprawnie). Jeśli zainstalujesz rozszerzenie XDebug, może ono zastąpić wbudowaną wersję var_dump wersją, która znacznie lepiej radzi sobie z rekurencją.

+11

nie otrzymasz pomocnych wyników, dlatego lepiej użyj zrzutów doktryny \ Doctrine \ Common \ Util \ Debug :: dump(), który jest opisany w innej odpowiedzi. – Gigala

+2

Zwiększenie limitu pamięci nie powinno być nigdy uważane za dobrą odpowiedź. To jak zalecanie 'chmod 777'. – renoirb

8

Użyj metody klasy Doctrine_RecordtoArray

var_dump($doctrine_record->toArray()); 

będą wyświetlane tylko pola DB i uniknąć dumpingu kompletne wewnętrzne Doktryna (która zawiera odniesienia self/rekurencji przy okazji)

49

Lazy proxy obciążenia zawsze zawierają instancję EntityManager Doctrine i wszystkie jej zależności.

W związku z tym var_dump prawdopodobnie zrzuci bardzo dużą strukturę rekursywną, której nie można wyrenderować i przeczytać. Musisz użyć \Doctrine\Common\Util\Debug::dump(), aby ograniczyć zrzut do poziomu czytelnego dla człowieka. Zauważ, że domyślna głębokość dla tej funkcji jest ustawiona na 2 (jest to drugi parametr)

+0

wielkie dzięki za tę wskazówkę! – Besnik

+0

Sposobem na obejście tego problemu, oprócz zwiększenia limitu pamięci, byłoby użycie [xdebug] (http://xdebug.org/) i wykorzystanie jego 'xdebug.var_display_max_depth' do zrzutu tylko do pewnej głębokości ta rekursja. – ficuscr

+0

to jakikolwiek inny sposób –

0

Możesz użyć toArray, jeśli jesteś pewien, że obiekt jest instancją Doctrine_Collection. Xdebug nie pomaga w zapisach doktryny.

Sposób Proponuję jest wdrożenie niestandardowych funkcji rekurencyjnej wydrukować obiektu, które używają Doctrine_Record :: ToArray(), gdy neeeded

function var_dump_improved() 
{ 
    foreach (func_get_args() as $arg) { 
     if ($args instanceof Doctrine_Collection) { 
      print_r($arg); 
     } else if ($arg instanceof Traversable || is_array($arg)) { 
      // do a foreach and recall var_dump_improved on subelements 
     } else if (...) { 
      // other types 
     } 
    } 
} 

Niektóre funkcji rekurencyjnej do debugowania z max poziomy zagnieżdżenia tutaj

http://php.net/manual/en/function.var-dump.php

spojrzeć na komentarze, szukać „rekursji”