Vlastní proměnná v config.neon

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

Zdravím,
V presenteru by jsem chtěl použít vlastní proměnné které by jsem si nastavil v config.neon stejně jako se třeba nastavuje přístup k databázi a v tom presenteru je získávat. Nevíte někdo jak na to?
Díky.

David Matějka
Moderator | 6445
+
+2
-

Ahoj, jednou z moznosti je registrovat presenter jako sluzbu

Pavel Kravčík
Člen | 1182
+
-7
-

Nabídnu ještě třetí řešení, které jsme začali používat po zkušenostech, které zmínil David s Alešem. Vytvoř si službu SettingManager a ten si předávej jako službu do presenterů, kde ho potřebuješ.

Pak tam používáme věci jako jsou kategorie, máme dynamicky generované menu přes neon a různé další kategorie jako je nastavení mailů, barviček a podobně. :)

Ještě přidám tu nejpodstatnější část pro Tebe, zbytek už je jednoduchý:

	- Core\SettingManager(@container::getParameters())

Editoval Pavel Kravčík (23. 2. 2017 15:17)

David Matějka
Moderator | 6445
+
0
-

@PavelKravčík to uz rovnou muzes sahat na context.

abych jeste doplnil svou odpoved. osobne si nepamatuji, kdy jsem naposled potreboval nejaky parametr v presenteru. vzdy je predavam pouze komponentam a sluzbam. ale pokud je opravdu potreba predat presenteru, tak radeji explicitne skrz config. tahani parametru pres context i nejaky setting manager, ktery bude mit vsechny parametry, se skryvani zavislosti

Pavel Kravčík
Člen | 1182
+
0
-

@DavidMatějka: Mohl bys trochu rozvést nevýhody? Parametrů používáme relativně hodně a tohle nám pomohlo je lépe spravovat, testovat a hlavně lépe přenášet nastavení mezi servery. Případně, jak to řešit lépe? Díky.

David Matějka
Moderator | 6445
+
0
-

jak rikam, predavat konkretni parametry tam, kde jsou potreba (nejlepe do sluzeb a komponent, vyhnout se presenterum)

s tim setting managerem, abys zjistil, co opravdu presenter potrebuje za parametry, tak musis prolizt kod a hledat.

Pavel Kravčík
Člen | 1182
+
0
-

My do presenterů nepředáváme nic. Ale třeba pokud upload komponenta potřebuje 4 parametry, tak mi přišlo hezčí mít manager, který jí předá ty parametry a například zkontroluje, jestli vůbec existuje cesta kam ta komponenta má ty soubory nahrát. Případně vyhodit výjimku či cestu vytvořit a komponenta přijímá jen konkrétní cestu a ostatní jí nezajímá. Přišlo mi to čistější řešení než uploadComponent(%uploadDir%) a vyhazovat chybu až někde v renderu. Ale jsem amatér, proto se ptám, jak by to bylo hezčí.

Právěže bylo vždy pracné procházet všechny složky a zjišťovat, kde co mám založit aby ta komponenta fungovala, takhle si jí jen zavolám v jakkémkoliv projektu a funguje.

Editoval Pavel Kravčík (23. 2. 2017 16:19)

CZechBoY
Člen | 3608
+
+3
-

Pkud máš kategorii parametrů tak se hodí mít na to nějakou obálku.
Tenhle přístup se mi docela líbí a rád bych ho začal používat víc https://pehapkari.cz/…kty-v-nette/

Editoval CZechBoY (23. 2. 2017 16:27)

David Matějka
Moderator | 6445
+
0
-

asi to „test“ nemas odsazeny

Pavel Kravčík
Člen | 1182
+
0
-

@CZechBoY: Díky. Skvělý!

AdamBI
Člen | 17
+
0
-

Rozhodl jsem se to udělat podle první metody v tomto článku https://pehapkari.cz/…kty-v-nette/
Nastavil jsem si vlastní parameters a zaregistroval presenter takto:

services:
	router: App\RouterFactory::createRouter
	- App\Presenters\CronPresenter(%test%)

do presenteru jsem dal proměnné $config ale teď mi to hlásí chybu: Service ‚24_App_Presenters_CronPresenter‘: Parameter $config in App\Presenters\CronPresenter::__construct() has no class type hint or default value, so its value must be specified.

David Matějka
Moderator | 6445
+
0
-

ten parametr je tam v konstruktoru na prvnim miste?

AdamBI
Člen | 17
+
0
-

Ano je

AdamBI
Člen | 17
+
0
-

Vlastně je až na druhém na prvním místě je

$this->database = $database;

Ten konstruktor vypadá takto:

private $database;
	private $config;

	public function __construct(Nette\Database\Context $database, array $config)
{
    $this->database = $database;
    $this->config = $config;
}
jiri.pudil
Nette Blogger | 1028
+
+2
-

Dej ho na první místo, nebo v configu uveď i ten Context (místo explicitního předání lze použít ..., Nette pak použije standardní autowiring):

services:
	- App\Presenters\CronPresenter(..., %test%)
AdamBI
Člen | 17
+
0
-

jiri.pudil napsal(a):

Dej ho na první místo, nebo v configu uveď i ten Context (místo explicitního předání lze použít ..., Nette pak použije standardní autowiring):

services:
	- App\Presenters\CronPresenter(..., %test%)

Výborně uvedení Contextu pomohlo moc díky!