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

- MartinitCZ
 - Člen | 580
 
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
 
@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 | 822
 
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í.

- Casper
 - Člen | 253
 
@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
 
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)

- PavelJurasek
 - Člen | 39
 
Presenter:
class BasePresenter extends UI\Presenter
{
	public function setMyParam($param)
	{
		$this->myParam = $param;
	}
}
Config:
services:
	BasePresenter:
		class: My\Space\BasePresenter
		setup:
			- setMyParam(%myParam%)
				
- radas
 - Člen | 226
 
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
 
@radas: Odpověď bys mohl najít v ParamService
Editoval Tomáš Votruba (27. 3. 2014 8:11)

- Patrik Votoček
 - Člen | 2221
 
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.