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 | 817
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 | 225
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.