Config\Configurator – nekonzistentní užití konstant

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

Config\Configurator má aktuálně 4 konstanty: DEVELOPMENT, PRODUCTION, AUTO a NONE. To ovšem způsobuje zmatky kvůli jejich nešťastnému pojmenování a použití.
Opakovaně jsem si všiml, že začátečníci používají tyto konstanty domnívajíce se, že tak správně zapnou debug mód. Za jádro celého problému považuji tento řádek v bootstrapu sandboxu: $configurator->setDebugMode($configurator::AUTO);, ze kterého se začátečník domnívá, že pro změnu módu se používají konstanty, a tak sáhne po té nejvhodnější – DEVELOPMENT (tedy: $configurator->setDebugMode($configurator::DEVELOPMENT);). To samozřejmě fungovat nebude, jelikož je to string a tak se použije jako povolená IP pro debug mód. Výsledkem je zmatený začátečník a nefunkční debug mód.
Celé je to ještě o to horší, že Configurator::AUTO se používá i ve zcela jiném kontextu, a to u určení sekce při načítání konfiguračního souboru (k čemuž je zjevně z logického pohledu i původně určena).

Ascaria
Člen | 187
+
0
-

Potvrzuju. Měl jsem to špatně nastavený po stáhnutí nejnovějšího Nette taky. Pak když jsem se snažil tu někomu radit, tak sem náhodou zjistil, že to jsou stringy, a pamatoval jsem si naštěstí, že debugger se nastavuje boolama.

David Grudl
Nette Core | 7445
+
0
-

Nápady co s tím?

Ascaria
Člen | 187
+
0
-

No jelikož je development a production pořád to samý, ať už jde o nastavení konfigurátoru, či debuggeru, navrhuju rozšířit detekční metodu:

	/**
	 * Detects debug mode by IP address.
	 * @param  string|array  IP addresses or computer names whitelist detection
	 * @return bool
	 */
	public static function detectDebugMode($list = NULL)
	{
		$list = is_string($list) ? preg_split('#[,\s]+#', $list) : $list;
		$list[] = '127.0.0.1';
		$list[] = '::1';
		return in_array(isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : php_uname('n'), $list, TRUE) || in_array(self::DEVELOPMENT, $list, true);
	}

protože je podle mě logické, aby to fungovalo jednotně takto:

$configurator->setDebugMode($configurator::DEVELOPMENT);
// než takto, to nikomu nedojde
$configurator->setDebugMode(Nette\Diagnostics\Debugger::DEVELOPMENT);

Editoval Ascaria (29. 5. 2012 9:50)

David Grudl
Nette Core | 7445
+
0
-

Co třeba změnit setDebugMode na enableDebugMode ?

Majkl578
Moderator | 1364
+
0
-

Původně mě napadlo ponechat setDebugMode akceptující boolean parametr (ruční nastavení) a pro automatickou detekci použít jinou metodu, např. detectDebugMode. Ty konstanty bych do toho každopádně vůbec netahal – to, co navrhuje Ascaria v #4, mi nepřijde o nic míň matoucí oproti současnosti.

Ascaria
Člen | 187
+
0
-

David Grudl napsal(a):

Co třeba změnit setDebugMode na enableDebugMode ?

V tom případě bych udělal něco jako

enableDebugMode()
enableProductionMode()

obojí by bylo bez argumentů a přenastavovalo jednu property. Bez zavolání metod, nebo přímo po zavolání

detectMode()

by se zjišťovalo automaticky, čili „reset“ prvních dvou metod.

Vím že pak bude v API o metodu navíc, ale pokud je jen setdebug nebo předtím jen setproduction, je to podle mě polovičatý.

edit:
Nebo jen přidat další metodu setMode(), která by nastavila jak debug tak sekci configu, ale to je už přeplácaný a blbý asi. No nevim jak to vymyslet.

Editoval Ascaria (30. 5. 2012 9:13)