Jak se dostat k parametrům z config.neon bez $this->getContext()->parameters

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

Ahoj,
v posledních verzích Nette 2.1-dev, konkrétně třeba z 5. 12. 2013, je v presenteru metoda getContext() označená jako deprecated. Jak se tedy správně dostat k hodnotám parametrů z config.neon jinak, než přes

$this->getContext()->parameters[...]

Díky

MartinitCZ
Člen | 580
+
0
-

Musíš si vytvořit servisu, kam ty parametry pošleš přes __constructor a poté si tuto složbu injectneš :)
Místo:

$this->getContext()->parameters['car'];

Můžeš mít:

$this->mojeSluzba->parameters['car'];
$this->mojeSluzba['car']
$this->mojeSluzba->car

Takhle bych to řešil já, pokud potřebuješ přístup ke všem parametrům.

Editoval martinit (18. 12. 2013 11:07)

Casper
Člen | 253
+
0
-

Do presenteru lze vkládat závislosti standardně přes konstruktor, takže to ani přes tu službu dělat nemusíš. Problém je, pokud to potřebuješ v nějakém BasePresenteru…

radas
Člen | 225
+
0
-

@Casper: Můžeš to prosím trochu přiblížit? BasePresenter je přece presenter jako každý jiný, když dědí od třídy Presenter z Nette.

Casper
Člen | 253
+
0
-

@radas:

Jasně, nicméně tím, že u něj uvedeš závislost na nějakém parametru (nelze použít autowire), způsobíš, že všichni potomci jej musí vyžadovat také a pak to musíš pracně předávat do parent::__construct, což je u presenterů docela opruz. Z toho důvodu jsou v presenterech i jiné možnosti injektování závilostí (anotace, inject metody, …), jenže to ti pro parametry nepomůže.

ViPEr*CZ*
Člen | 817
+
0
-

Nebo to taky lze obejít přes službu, která si vezme DI kontejner v konstruktoru:

public function __construct(\Nette\DI\Container $container) {
		$this->params = $container->getParameters();
}

Pak lze touto vlastní službou mít parametry k dispozici a obejít nutnost contextu v presenteru. Není to nejspíš asi úplně cool řešení, ale funkční. Možná někdo něco lepšího přihodí.

radas
Člen | 225
+
0
-

No a jak se teď dostat třeba k objektu HttpRequest, když dříve bylo možné použít

$this->getContext()->httpRequest->...
Casper
Člen | 253
+
0
-

@radas:

Metoda getHttpRequest nefunguje?

EDIT: nicméně všechno můžeš vyžádat jako standardní závilost

Editoval Casper (18. 12. 2013 12:51)

duskohu
Člen | 778
+
0
-

Ja sluzb do presentera injectujem:

public function injectRequest(\Nette\Http\Request $request)
{
	$this->request = $request;
}

v pripade parametrov bud pouzijem nejaku sluzbu ktorej parametre predas a tu si zase injectnem:

class Params extends Object{

	private $paramA;

	public function __construct($paramA){
		$this->paramA = $paramA;
	}

	public function getParamA(){
		return $this->paramA;
	}
}

neon:

services:
	Params : Params (%paramA%)

presenter:

public function injectParams(Params $params )
{
	$this->params= $params;
}

alebbo dalsia varianta je ContainerLocator, ako pisal **ViPEr*CZ*** znovu zaregistrujes injectnes kde potrebujes a pomocou getParameter() zavolas parameter. Nieco taketo.

class ContainerLocator extends Nette\Object
{

	/** @var array */
	private $parameters;


	/**
	 * @param Nette\DI\Container $systemContainer
	 */
	public function __construct(Nette\DI\Container $systemContainer)
	{
		$this->parameters = $systemContainer->getParameters();
	}


	/**
	 * getParameter
	 * @param array $parameter
	 * @return array
	 */
	public function getParameter($parameter = array())
	{
		$value = array();
		$i = 1;
		foreach ($parameter as $key) {
			if ($i == 1) {
				$value = isset($this->parameters[$key]) ? $this->parameters[$key] : FALSE;
			} else {
				$value = $value[$key];
			}
			$i++;
		}
		return $value;
	}
}

Editoval duskohu (18. 12. 2013 13:09)

MartinitCZ
Člen | 580
+
0
-

@**ViPErCZ**: Nooo nevim, tohle není dobré.
@**radas**: Toto se injectuje ;)

PavelJurasek
Člen | 39
+
+1
-

Presenter:

class BasePresenter extends UI\Presenter
{

	public function setMyParam($param)
	{
		$this->myParam = $param;
	}

}

Config:

services:
	BasePresenter:
		class: My\Space\BasePresenter
		setup:
			- setMyParam(%myParam%)
ViPEr*CZ*
Člen | 817
+
0
-

martinit napsal(a):

@**ViPErCZ**: Nooo nevim, tohle není dobré.
@**radas**: Toto se injectuje ;)

Jj, proto jsem psal, že to není úplně cool. Spíše by to mělo jít nějak nativně připojit, než-li to dělat takto ;-)

radas
Člen | 225
+
0
-

Tak jsem to nakonec vyřešil takto:

config.neon:

common:
  services:
    configParameters: Models\ConfigParameters([%login%, %code%, %upload%])

ConfigParameters.php:

class ConfigParameters extends Object
{
  public $login;
  public $code;
  public $upload;

  public function __construct(array $parameters)
  {
    list($this->login, $this->code, $this->upload) = $parameters;
  }
}

BasePresenter:

/**
 * @var \Models\ConfigParameters
 * @inject
 */
public $configParametersModel;

protected function startup()
{
  dump($this->configParametersModel->login);
}

Akorát je škoda, že nejde (nebo neumím) předat místo pole parametrů celé pole %parameters%, místo toho musím vypisovat jednotlivé klíče.

Tomáš Votruba
Moderator | 1114
+
0
-

@radas: Odpověď bys mohl najít v ParamService

Editoval Tomáš Votruba (27. 3. 2014 8:11)

Oli
Člen | 1215
+
0
-

V nette 2.1 si můžeš vytvořit předpis pro presenter v configu. Jsem na mobilu a nevyzkouším to, takze mozna budu psát blobsti, ale teoreticky by mohlo fungovat něco jako – MujPresenter(%params%), nebo ne?

Patrik Votoček
Člen | 2221
+
0
-

Tomáš Votruba napsal(a):

@radas: Odpověď bys mohl najít v ParamService, kterou registruješ v configu.

To je úplně stejná prasárna jako to tahat z context-u. Kde máš zaručeno že v ParamService určitě existuje parametr XYZ? Nemáš stejně jako u context-u.