Ako injektnut property aby som nemusel pisat spagetti code?

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

Tuto diskusiu som nechtiac zalozil na GB fore:

Ako inejktnut priamo property params, aby som v presenteri nemusel pisat $this->config->params ale len $this->config?

Dakujem.

class ConfigService extends \Nette\Object {

    private $params;

    private $context;

    public function __construct($params, \Nette\Database\Context $context) {

        $this->context = $context;

        $config = (new \App\Model\ConfigurationModel($this->context))->getConfiguration();

        $this->params = array_merge($params, $config);
    }

    public function __invoke() {
        return $this->params;
    }

}

David Kudera mi poradil toto:

services:

    -
        class: App\Presenters\NejakyPresenter
        setup:
            - $param(value)

Ja potrebujem ale nie predat hodnotu do konstruktora, ale potrebujem ziskat hodnotu $this->params, aby som v presenteri skratil zapis z $this->config->params na $this->config. Riesil som to cez invoke() ale to sa mi nepaci.

Dakujem.

Editoval steelbull (8. 4. 2015 12:29)

Felix
Nette Core | 1186
+
+1
-

Moc nerozumim na co to potrebujes a proc si to nemuzes predat do konstruktoru?

David Kudera
Člen | 455
+
+1
-

Před 3 dny ještě další taková otázka

Edit: myslím si, že přístup přímo k parametrům je to stejné, jako přístup ke službám přes context. Toho se taky všichni zbavují (viz někde přednáška s klavírem a doutníkem). Přijde mi to, jako to stejné, protože na první pohled nevidím, co třída skutečně potřebuje

Editoval David Kudera (10. 4. 2015 11:15)

Jan Suchánek
Člen | 404
+
+1
-

@steelbull: Předávej jen to co potřebuješ ne celý klavír :)

// Co je configSerivs??
class ConfigService extends \Nette\Object {

    private $params;

    private $context; // fujky

    public function __construct($params, \App\Model\ConfigurationModel $configModel) {
        $this->params = array_merge($params, $configModel);
    }


}

Vůbec nechápu co ta daná služba má dělat to je další kontejner? A k čemu je ten základní a neon? :)

Editoval jenicek (10. 4. 2015 11:47)

steelbull
Člen | 240
+
0
-

@jenicek: Tovarnicka, ktoru som vytvoril nacitava konfiguraciu z databazy a prepisuje ju lokalnou konfigucatiou v neone – dovod: k databaze maju pristup pre edit viaceri.

…a nepaci sa mi, ze musim stale pouzivat $this->configuration->params, ale chcem ku konfiguracii pristupovat takto: $this->configuration; Preto by som potreboval nejako vratit ten params. Ja som to riesil cez invoke() kym mi poradis…

Dakujem :-)

Editoval steelbull (11. 4. 2015 17:59)

Jan Suchánek
Člen | 404
+
0
-

A nelze neon od konfigurace pomocí db oddělit? Proč musej být spolu?

Editoval jenicek (13. 4. 2015 16:26)

David Matějka
Moderator | 6445
+
+1
-

nevim, jestli chapu, ale z neonu muzes predat nejen sluzbu, ale muzes na ni i zavolat metodu:

-
	setup:
		- $config(@\ConfigService::params)

Ale obecne nedoporucuji predavat cele pole parametru, je to stejne predavani klaviru jako v pripade sluzeb, predavej si konkretni hodnoty. V tvem pripade je tam lehka komplikace, ze ty hodnoty jsou dynamicky a nemuzes tedy pouzit %fooValue%. Ale mela by stacit mala uprava ty config service a o par znaku vic v neonu:

class ConfigService
{
	...

	public function __get($name)
	{
		return $this->params[$name];
	}
}
services:
	config: ConfigService
    -
        class: App\Presenters\NejakyPresenter
        setup:
            - $param(@config::fooValue)