proc se do frameworku vratilo define?
- Filip Procházka
- Moderator | 4668
Protože ty informace jsou prostě konstanty. Ale možná by stálo za to, je dát do namespace.
V aplikaci je ale používat nemusíš (a neměl bys).
- Filip Procházka
- Moderator | 4668
@**xxxObiWan**: prostě na ně nesahej a bude ti hej ;)
$presentersDir = $this->context->expand('%appDir%/presenters');
Editoval HosipLan (10. 1. 2012 7:24)
- joseff
- Člen | 233
Ja se take priklanim k tomu ze to moc nechapu, prijde mi to krok zpet… Ma nekdo rozumne vysvetleni? Connection se take v drtive vetsine aplikaci nemeni a neni to konstanta. I kdyz by se dalo uplne stejne udelat databaze jako konstanta a pak rict aby ji nikdo nepouzival… prijde mi to to same.
- Aurielle
- Člen | 1281
Když se podíváte do kódu Nette tak zjistíte, že existenci konstant Nette vůbec nekontroluje a není potřeba je využívat. Proč se vrátily do sandboxu je věc druhá, možná z důvodu „přehlednosti“ pro začátečníky – přece jenom je lepší nadefinovat konstantu než inicializovat $container->params (a to mám pocit že v novém configuratoru ani nejde).
- David Grudl
- Nette Core | 8227
Konstanty v sandboxu nemají nic společného s frameworkem, je to čistě
věc souborů index.php a bootstrap.php a nikde jinde se nepoužívají. Klidně
můžete používat proměnné, je to fuk. Obojí je globální úplně stejně,
není rozdíl mezi přístupem přes APP_DIR
nebo
$GLOBALS['appDir']
.
- duke
- Člen | 650
@Nox: Problém s kolizemi s jinými knihovnami by šel vyřešit přes namespaced konstanty, např.:
namespace MyApp;
const WWW_DIR = __DIR__;
Z hlediska DI by to byl problém, pouze pokud by se tyto konstanty používali zevnitř aplikace (tj. kdekoli mimo index.php a bootstrap.php). Samotná existence těchto konstant nevytváří nijakou závislost ničeho na ničem. Pokud nedojde k nevhodnému použití (zevnitř aplikace), je zde nedostatek jen z pohledu „data hiding“.
Ve verzi, kdy se místo konstant používala globální proměnná $params, která se následně kopírovala do containeru, byl problém úplně stejný, protože pokud si pamatuju, tak se žádné unset($params) nekonalo (patrně proto, že používat globální $params narozdíl od globálních konstant, by nikoho ani nenapadlo). Nicméně pokud by ten unset proběhl, bylo by to z pohedu data hiding asi čistší. Na druhou stranu, použití konstant mi přijde estetičtější. :-)
- duke
- Člen | 650
David Grudl napsal(a):
A teď ještě jak stejným způsobem vyrobit APP_DIR ;-)
David naráží na to, že const narozdíl od define neumožňuje pracovat s výrazy, což jsem skutečně přehlédl. Nicméně možným řešením je zde eval.
function defConst($name, $value)
{
$code = __NAMESPACE__ !== '' ? ('namespace ' . __NAMESPACE__ . ';') : '';
$code .= "const $name = '" . str_replace("'", "\\'", (string) $value) . "';";
eval($code);
}
defConst('APP_DIR', __DIR__ . '/../app');
- Jan Tvrdík
- Nette guru | 2595
duke wrote:
David naráží na to, že const narozdíl od define neumožňuje pracovat s výrazy, což jsem skutečně přehlédl. Nicméně možným řešením je zde eval.
Doprdele proč eval? Vždyť jde normálně použít define.
define(__NAMESPACE__ . '\\APP_DIR', __DIR__ . '/../app');
- bojovyletoun
- Člen | 667
tak třeba já používám své, řešení bez konstant a bez
paramentrů.
index.php: <?php require "./app/bootstrap.php";
bootstrap
/* # set dirs */
$dir = __DIR__;
$tmp = "$dir/../temp";
$log = "$dir/../log";
$lib = "$dir/../../../libs";
/* # load nette, start debug */
require "$lib/nette/loader.php";
- duke
- Člen | 650
Jan Tvrdík napsal(a):
Vždyť jde normálně použít define.
Máš pravdu. Z nějakého důvodu jsem měl za to, že define toto nepodporuje. Dík za tuto informaci. Nicméně na mou obhajobu musím podotknout, že můj příklad s evalem byl přímou opovědí na to, jak stejným způsobem (tj. pomocí const) nastavit APP_DIR. :-)
- Patrik Votoček
- Člen | 2221
Proč je tu proboha tolik příspěvků? Vždyť vám nikdo nebrání udělat si vlastní sandbox kde konstanty nebudou! Nikdo vás přece nenutí používat výhradně officiální sandbox/skeleton.