Environment is @deprecated

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

Zdarec,
chtěl bych se zeptat do jaké míry je Environment deprecated. Využívám Environment v bootstrapu na loadování configu (používám config.neon). Dále ho používám na kvúli přepsání fce formatLayoutTemplateFiles a formatTemplateFiles konkrétně ji využívám takto

<?php
$appDir = NEnvironment::getVariable('appDir');
?>

Dále skrze třídu Environment načítám a ukládám nette session

<?php
$this->sessionSap = NEnvironment::getSession('sap');
?>

Zatím mě laděnka nenapsala žádný Error, ale jak tak čtu, tak dříve či později k tomu dojde. Je už v této chvíli nějaká možnost jak aspoň v mém případě Enviroment nahradit? Případně jaká?

studna
Člen | 181
+
0
-

Přečti si něco o DI v Nette:
https://forum.nette.org/…cy-injection

Editoval studna (5. 6. 2011 20:02)

loov
Člen | 49
+
0
-

studna napsal(a):

Přečti si něco o DI v Nette:
https://forum.nette.org/…cy-injection

Díky určitě pročtu

srigi
Nette Blogger | 558
+
0
-

Aby si nemal tolko citania – zapamataj si, ze v Presentari je dostupny DI kontainer ($this->context). Skus si ho dumpnut a uvidis co v nom vsetko je:

$this->context->params; // konfig direktivy
$this->context->session; // sessna

atd, atd. Drobny problem bude asi predstavovat Model. Je totiz velmi pohodne niekde v UserModel ziskat config alebo povedzme authenticator z Environment. Ked sa vsak rozhodnes na Environment vykaslat, zistis ze nemas ako ziskat tieto veci, pretoze v Modeloch nemas DI kontainer automaticky dostupny (Model si v Nette riesi kazdy inak). Skus sa preto pozriet na moj clanok v kucharke, kde sa tymto prave zaoberam.

Editoval srigi (5. 6. 2011 23:18)

smi
Člen | 75
+
0
-

srigi napsal(a):

Aby si nemal tolko citania – zapamataj si, ze v Presentari je dostupny DI kontainer ($this->context). Skus si ho dumpnut a uvidis co v nom vsetko je:

$this->context->params; // konfig direktivy
$this->context->session; // sessna

atd, atd. Drobny problem bude asi predstavovat Model. Je totiz velmi pohodne niekde v UserModel ziskat config alebo povedzme authenticator z Environment. Ked sa vsak rozhodnes na Environment vykaslat, zistis ze nemas ako ziskat tieto veci, pretoze v Modeloch nemas DI kontainer automaticky dostupny (Model si v Nette riesi kazdy inak). Skus sa preto pozriet na moj clanok v kucharke, kde sa tymto prave zaoberam.

Já to četl, ale furt tomu nerozumím – poraď prosím jednoduše, jak do modelu dostat věc z konfigurace.

Mám v configu jméno tabulky, kterou chci použít v modelu, ale nedostanu se k ní. Třeba při autentizaci nevím kdy a kde se uživatelský model inicializuje.

Díky moc.

Filip Procházka
Moderator | 4668
+
0
-

Mohl by ti pomoci tento příklad: https://gist.github.com/976155

srigi
Nette Blogger | 558
+
0
-

smi napsal(a):

HosipLan napsal(a):

Ten priklad je na uplny zaciatok s DI uz trosku overkill (vlastny kontainer a tak, hadam sa Filip neurazi, ak sem pridam jednoduchsie riesenie). Keby si kcel uplne najjednoduchsi priklad, bol by to totalne hlupy ModelLoader, ktory iba instancuje Modely:

services:
	modelLoader:
		# do tejto statickej metody Nette vzdy preda DI\Container
		factory: ModelLoader::factory

development < common:
	database:
		host: localhost
		user: php
		password: php
		# ...
class BasePresenter extends Nette\UI\Presenter {
	public function getModel($modelName) {
		return $this->context->modelLoader->loadModel($modelName);
	}
}
class FooPresenter extends BasePresenter {
	public function renderBar() {
		$this->template->bar = $this->getModel('bar')->doSomething();
	}
}
class ModelLoader {
	private $connection;
	private $config;

	public static function factory(Nette\DI\Container $container) {
		$config = $container->params['database'];
		// TODO pripojenie na DB
		return new self($db, $config);
	}

	public function __construct($connection, $config) {
		$this->connection = $connection;
		$this->config = $config;
	}

	public function loadModel($modelName) {
		$class = "Model\\$modelname";
		return new $class($this->connection, $this->config);
	}
}
namespace Model;

class Bar {
	public function __construct($connection, $config) {
		// TODO
	}

	public function doSomething() {
		// TODO
	}
}

Toto je uplne najminimalnejsi priklad ako sa zbavit Environment a dostat do svojich Modelov objekty, ktore si predtym ziskaval z Environment. Je to dost vela pisania, ale toto je mozne oznacit za cisty navrh aplikacie.

Editoval srigi (7. 6. 2011 14:49)

smi
Člen | 75
+
0
-

Už to asi začínám chápat, ale porotože jsem starší potřebuji více času.

Každopádně díky moc za radu

Editoval smi (7. 6. 2011 15:17)

hAssassin
Člen | 293
+
0
-

@srigi > diky moc za super ukazku tady na foru i v kucharce… konecne tomu DI zacinam prichazet nejen na zoubek ale i na chut… ModelLoader mam vytvorenej a funguje to pekne, zda se mi. Ted se jeste rozhodnou jak cely model resit. Jestli jako jednu vrstvu nebo jak pise PhpGuru jako petivrstvy model. Jinak pouzivam Dibi (database ani notORM se mi sice libi ale nejak se mi do nej nechce :D).