Rozšíření pro Debugger::dump()
- Filip Procházka
- Moderator | 4668
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)
- paranoiq
- Člen | 392
@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
Jestli se ti chce, tak budu jenom rád. Já se k tomu dostanu nejdřív o víkendu.
- stekycz
- Člen | 152
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
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#…
- Milo
- Nette Core | 1283
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.
- llook
- Člen | 407
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.
- Filip Procházka
- Moderator | 4668
@**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
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 | 8218
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
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
- Milo
- Nette Core | 1283
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 | 8218
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.