Rozšíření pro Debugger::dump()

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Filip Procházka
Moderator | 4668
+
0
-

Dump sám o sobě je strašně šikovná věc, ale některé hodnoty nevypíše úplně ideálně. Příkladem by mohlo být DOMDocument, nebo SplObjectStorage.

Kamarád mi dnes posílal projekt, na který narazil. Nestudoval jsem implementaci, ale líbil se mi nápad rozšiřitelného dumpu.

Nette by také mohlo umět přijímat callbacky, které by upravovaly strukturu objektu/resource a dump by je pak vypsal. Dalším příkladem by mohly být vlastní třídy. V některých třídách je hromada balastu, který prostě nepotřebuji vidět. V modelech mám Doctrine/dibi/jiný dbal a to prostě nepotřebuju dumpovat, zabírá to místo a stejně vím, co tam je.

Pro každý objekt/resource by se mohl volat handler, který by se zeptal, jestli má nějaký callback zájem upravit data. Úplně by to stačilo pro objekty, aby se to nepletlo s primitivními typy.

Debugger::$dumper->register(function ($var) {
	if (!$var instanceof Article) {
		return; // NULL = objekt nás nezajímá
	}

	return array( // nebude vypisovat reflexi objektu, ale použije vrácené hodnoty
		'id' => $article->getId(),
		'title' => $article->getTitle(),
	);
});

Může se to zdát příliš magické, nebo to naopak může vadit, když je potřeba vypsat celý objekt, ale v naprosté většině případů by to zpřehlednilo dumpy.

Co myslíte?

// edit: jo a taky by se hodil barevnej dump do konzole :)

Editoval HosipLan (3. 2. 2012 20:11)

David Grudl
Nette Core | 8133
+
0
-

Tak pošli pull.

paranoiq
Člen | 392
+
0
-

@HosipLan: na linuxu se dá podle resource id a id procesu dohledat jméno otevřeného souboru (nebo adresa spojení…). líbilo by se mi, kdyby laděnka uměla zobrazovat, co je resource zač na systémové úrovni

pokud jde o objekty, nejlepší by asi bylo buď rozhraní (public function debugFilter()…) nebo anotace (@debug-hide či tak…). registrovat callbacky apod. je opruz. EDIT: ale pro cizí třídy asi nic jiného nezbývá :/

Editoval paranoiq (6. 2. 2012 21:36)

Filip Procházka
Moderator | 4668
+
0
-

Pošlu brzo :)

hrach
Člen | 1834
+
0
-

udělal bych to obarvování, hm? :)

Filip Procházka
Moderator | 4668
+
0
-

Jestli se ti chce, tak budu jenom rád. Já se k tomu dostanu nejdřív o víkendu.

paranoiq
Člen | 392
+
0
-

kouknul bych se na ty resources, hm? :]

stekycz
Člen | 152
+
0
-

Resorces se budou určitě hodit. Nicméně co se týče debugu, kamarád vyvíjí vlastní dumper. Umí zobrazovat hodně informací (o něco víc než Laděnka, zvláště pak co se týče statických metod a proměných). Pokud vím, plánuje to dát brzo na GitHub.
Už jsem se s ním i bavil a o nějaké integraci do Nette a podobno ideu (s vlasním výpisem, ignorlistem a další) také navrhl. Nicméně zatím nejsou implementované resources, SplObjectStorage apod.
Pokud se tedy někdo vrhat na implementace, mohu předat kontakt na případnou domluvu o sdílení kódu.

hason
Člen | 23
+
0
-

Existuje nějaký důvod, proč nepoužít přímo Ladybug? Knihovna umí vše ohledně vypisování proměnných a navíc se nechová nepředvídatelně, viz https://phpfashion.com/…nty-promenne#…

David Grudl
Nette Core | 8133
+
0
-

A zejména není součástí Nette, viď ;-)

David Grudl
Nette Core | 8133
+
0
-

To obarvování funguje na Linuxu standarně ve všech terminálech?

Filip Procházka
Moderator | 4668
+
0
-

Mělo by se to chovat všude stejně, Davide.

Milo
Nette Core | 1283
+
0
-

David Grudl napsal(a):

To obarvování funguje na Linuxu standarně ve všech terminálech?

Sytaxe je standardní, ale některé terminály barvy neumí. Neznám sice nikoho, kdo by dnes terminál bez podpory barev používal, ale třeba remote SSH příkazy často používají terminál dumb, který barvy nedává. Kolik barev terminál podporuje se dá snadno zjistit pomocí tput colors. Jakmile to bude alespoň osm, je to OK.

bazo
Člen | 620
+
0
-

aj toto je celkom zaujimave http://pbl.elgatonaranja.com/demo

Filip Procházka
Moderator | 4668
+
0
-

@**bazo**: To je hrozne :)

David Grudl
Nette Core | 8133
+
0
-

Tudíž by se to podle detekce PHP_OS mohlo rovnou zapnout?

bazo
Člen | 620
+
0
-

co presne je hrozne? ak mysli, to ako to vyzera, tak suhlasim :) ale niektore info, co to zobrazuje by mohli byt zaujimave aj v nette debug bare.

paranoiq
Člen | 392
+
0
-

kouknul bych se na ty resources, hm? :]

Apache nesmí číst vlastní záznamy v /proc/{pid} tak tudy ne :[

llook
Člen | 407
+
0
-

bazo napsal(a):

co presne je hrozne? ak mysli, to ako to vyzera, tak suhlasim :) ale niektore info, co to zobrazuje by mohli byt zaujimave aj v nette debug bare.

Z toho, co tam vidím a co v Nette není, mě zaujal akorát panel ajax requests. Jenže když přemýšlím nad implementací, tak by z toho asi bylo víc problémů, než užitku.

Milo
Nette Core | 1283
+
0
-

paranoiq napsal(a):

kouknul bych se na ty resources, hm? :]

Apache nesmí číst vlastní záznamy v /proc/{pid} tak tudy ne :[

Pokud jde jen o cestu souboru/URL, tak to stream_get_meta_data() zmákne.

Milo
Nette Core | 1283
+
0
-

David Grudl napsal(a):

Tudíž by se to podle detekce PHP_OS mohlo rovnou zapnout?

Jestli myslíš barvy v terminálu, tak ano.

Filip Procházka
Moderator | 4668
+
0
-

@**llook**: Ajax requesty ti ukáže Chrome Developer Toolbar, záložka Network. Stejně tak dumpovat v ajaxu můžeš také, pokud máš Firelog.

llook
Člen | 407
+
0
-

HosipLan napsal(a):

@**llook**: Ajax requesty ti ukáže Chrome Developer Toolbar, záložka Network. Stejně tak dumpovat v ajaxu můžeš také, pokud máš Firelog.

Znám, používám.

Jenom si myslím, že by to šlo ještě líp. Kromě síťové komunikace by ten panel mohl pro každý subrequest dumpovat další podrobnosti, stejně jako u normálního requestu (SQL dotazy, apprequest, identity apod.). Nemusel bych tak často vypínat javascript, abych zjistil, co se děje (nemluvě o tom, že pak se může dít něco jiného, pokud někde větvím kód podle isAjax()).

Ještě nad tím popřemýšlím, už se mi začíná v hlavě rýsovat pár nápadů, jak na to.

David Grudl
Nette Core | 8133
+
0
-

Asi by bylo dobré vrátit téma k tomu dumpování. Samotné rozšíření Debugger baru je tématem samo o sobě.

ad obarvování v terminálu: nedalo by se to vyřešit snadným regulárem, který ve výstupu z Helpers::htmlDump nahradit <span class=""> za escape sekvence?

Lopo
Člen | 277
+
0
-

David Grudl napsal(a):

Asi by bylo dobré vrátit téma k tomu dumpování. Samotné rozšíření Debugger baru je tématem samo o sobě.

ad obarvování v terminálu: nedalo by se to vyřešit snadným regulárem, který ve výstupu z Helpers::htmlDump nahradit <span class=""> za escape sekvence?

pri tomto bacha na trosku iny princip fungovania – je to neparove, tj moze to robit problemy pri vnorenych <span>-och

terminalove ESC sekvencie totiz nemaju „posun o uroven vyssie“, len natvrdo sa da urcit jake bravy sa odteraz pouziju – chcelo by to potom asi trosku hrania aby to nehaluzilo

hrach
Člen | 1834
+
0
-

@DavidGruld: presne tak jsem to chtel implemetnovat, replace danych span.

Milo
Nette Core | 1283
+
0
-

Tak jsem si pro radost to obarvování implementoval :) Implementace počítá se zanořením <span> do sebe ikdyž je to asi zbytečné, protože se to v dumpu neobjeví. Je také třeba detekovat, jestli je STDOUT interaktivní terminál, jinak filtry jako less a přesměrování do souboru zobrazí/uloží i escape sekvence.

$cb = function($match) use (& $seqStack) {
	static $colors = array(
		'bool' => '1;37',
		'null' => '1;37',
		'int' => '1;36',
		'float' => '1;36',
		'string' => '0;32',
		'array' => '1;31',
		'key' => '0;37',
		'object' => '1;31',
		'visibility' => '1;33',
		'resource' => '1;37',
	);

	if (isset($match[3])) { // </span>
		array_pop($seqStack);
		return count($seqStack) ? end($seqStack) : "\033[0m";
	}

	// <span class="php-......">
	$color = isset($colors[$match[2]]) ? $colors[$match[2]] : '0;37';
	$seq = "\033[{$color}m";

	$seqStack[] = $seq;
	return $seq;
};

if(defined('STDOUT') && function_exists('posix_isatty') && posix_isatty(STDOUT)){
	$seqStack = array();
	$output = preg_replace_callback('~(<span.+?class="php-([^"]+)".*?>)|(</span>)~', $cb, $output) . "\033[0m";
}

$output = htmlspecialchars_decode(strip_tags($output), ENT_QUOTES);
David Grudl
Nette Core | 8133
+
0
-

SPAN se do sebe zanoří pouze v případě, že jde o array nebo object (třídy php-array a php-object), což by se dalo úspěšně ignorovat a kód by se zjednodušil.