dump do laděnky – jde to?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
mildabre
Člen | 62
+
0
-

Zatím jsem ještě nenašel odvahu si do Netbeans které díky bohu fungují i s pluginem pro Nette doinstalovat Xdebug a tak občas dumpuji.

Při použití dump() se mě data vypisují přímo do stránky tak jako za mlada když jsem si psal aplikace v čistém PHP. Napadlo mě, zda by nebylo možné výstup tohoto dump()-u nějak přesměrovat do dalšího panelu v DebugBaru – laděnce Nette, podobně jako tam jsou schované provedené SQL dotazy. Tak, že by se dal rozbalit do další vrstvy nad webovou stránku.

Neví někdo zda toto jde či ne ?

enumag
Člen | 2118
+
0
-

Na to slouží \Nette\Diagnostics\Debugger::barDump(). Doporučuji vytvořit si nějaký alias abys nemusel pokaždé psát tak dlouhý název.

Filip Procházka
Moderator | 4668
+
0
-

Doporučuji

function bd($var, $title = NULL) {
	Nette\Diagnostics\Debugger::barDump($var, $title);
}
enumag
Člen | 2118
+
0
-

@HosipLan: Netušíš náhodou proč se pole vypisuje po složkách a ne najednou? Dost mne to irituje, protože když dumpuju pole, které je náhodou prázdné tak vidim velký …nic.

Filip Procházka
Moderator | 4668
+
0
-

Netuším, ale nějak mně to nikdy netrápilo. Napiš si k tomu titulek, ten se ukáže vždy.

enumag
Člen | 2118
+
0
-

Na psaní titulků při každém dumpu jsem línej, kromě toho mi tam také chyběla informace, kde ten dump byl zavolán. Zde je výsledek: ;-)

function bd($var)
{
	$bt = debug_backtrace();
	$caller = array_shift($bt);
	$title = pathinfo($caller['file'], PATHINFO_BASENAME) . ':' . $caller['line'];
	if (is_array($var) && empty($var)) {
		$var = array('[]' => array());
	}
	Debugger::barDump($var, $title);
}

EDIT: Anebo raději takhle?

/**
 * Nette\Diagnostics\Debugger::barDump shortcut.
 * @param mixed $var
 */
function bd($var)
{
	$bt = debug_backtrace();
	$caller = array_shift($bt);
	$title = pathinfo($caller['file'], PATHINFO_BASENAME) . ':' . $caller['line'];
	if (is_array($var) && empty($var)) {
		$title .= ' [empty]';
	}
	Debugger::barDump($var, $title);
}

EDIT2: Anebo ještě o něco lépe. Že já z toho neudělal Gist hned na začátku… :-D

Editoval enumag (11. 12. 2012 23:30)

Filip Procházka
Moderator | 4668
+
0
-

Nette tohle dělá přece automaticky, stačí povolit $showLocation

enumag
Člen | 2118
+
0
-

Nestačí, mám to už dlouho zapnuté, ale location u barDumpu mi to nikdy neukazovalo. Tohle má význam pouze u dumpu, nikoli u barDumpu a to ještě pouze pokud se dumpuje přímo na výstup.

Z tvých komentářů je vidět, že barDump zřejmě téměř nepoužíváš. Co tedy používáš? Xdebug?

Filip Procházka
Moderator | 4668
+
0
-

Používám ho docela hojně, ale asi mám jiné workflow, které mě od těchhle divných problémů odstiňuje ;)

enumag
Člen | 2118
+
0
-

Že ty budeš jeden z těch TDD guys. :-D

mildabre
Člen | 62
+
0
-

Díky všem za objasnění že s dumpem lze jít do debugbaru což je elegantní a už mne to u Nette ani nepřekvapuje – kolikrát už jsem si řekl chtělo by to tohle či ono vylepšení a ejhle ono to v Nette už je, jenom o tom vědět.

Kdosi kdysi řekl k otázce jak ladit PHP aplikace, že se snaží kód napsat tak, aby ladit nemusel. Komu se to podaří je odstíněn od diskuzí kam vyplivnout dump().

LeonardoCA
Člen | 296
+
0
-

Mně chyběl u dumpů často trace, tak jsem si udělal ještě trochu sofistikovanější výpis.

Například:

public function addEditButton($control, $signal = 'Edit')
{
    sdump($this->primaryKey);
    $this->AddContent(Html::bsButton('a', ' Edit ', 'btn-mini btn-primary', Html::bsIconw('edit'))
                    ->href($control->lazyLink($signal, $this->primaryKey))
    );
    return $this;
}

zobrazí jako title název metody a v dump info, co přesně jsem do dumpu napsal, protože tam někdy píšu pole nebo i výrazy, u kterých si nejsem jistý výsledkem

a v config.neon si nastavím jakou hloubku trace chci vidět. Standartně používám 2, ať vím odkud byla daná metoda kde mám dump volána.

Má to ještě pár much, proto jsem to zatím nezveřejnil.

Editoval LeonardoCA (13. 12. 2012 2:40)

Filip Procházka
Moderator | 4668
+
0
-

@LeonardoCA dump info a trace bych sloučil, jinak je to super. Než si to vymazlíš, tak jsem si zatím upravil svou :)

function bd($var, $title = NULL) {
	if ($title === NULL) {
		$trace = debug_backtrace();
		$title = (isset($trace[1]['class']) ? htmlspecialchars($trace[1]['class']) . "->" : NULL) .
			htmlspecialchars($trace[1]['function']) . '()' .
			':' . $trace[0]['line'];
	}

	return Nette\Diagnostics\Debugger::barDump($var, $title);
}