Parametr z URL pro službu

Milo
Nette Core | 1283
+
0
-

Jak vytáhnout parametr z URL pro konstruktor služby v DI?

Konkrétně parametr lang pro službu Language, kterou využívají jiné služby a továrničky komponent. Pokud je jazyk v query stringu, dá se vytáhnout pomocí Nette\Http\Request::getQuery('lang'), ale když je schovaný v URL, třeba example.com/en/homepage, musel bych znovu matchovat routy, a to se mi nechce, a pak použít Nette\Application\Request::getParameter('lang').

Nějaký tip?

Martk
Člen | 661
+
0
-

Jedině přes Nette\Application\Application, buďto použít event onRequest nebo funkci getRequests() . Jiné řešení kromě tohoto a tvého neexistuje.

David Matějka
Moderator | 6445
+
0
-

blbě :)

  • nastavovat to někde v base presenteru té službě přes setter
  • (externí) listener na Application::onRequest a tam ten parametr nastavovat té službě
  • závislost Language na Application a z toho vytáhnout aktuální request (nebo presenter)

ale nic z toho není ideální a závisí na stavu té aplikace

Milo
Nette Core | 1283
+
0
-

@Martk @DavidMatějka Ubíral jsem se myšlenkami stejným směrem. Ještě mě napadla vlastní implementace IRouter, která si bude podle identity Http\Request objektu kešovat výsledek match() a opětovné volání tak nebude nic stát.

David Grudl
Nette Core | 8218
+
0
-

Router je prostý serializátor/deserializátor URL, Http\Request i App\Request jsou přenosky na data, které parametrům jako je lang nedávají žádný sémantický význam, rozklíčovává je až presenter. Tam bych to asi řešil.

Milo
Nette Core | 1283
+
0
-

V případě jazyku mi to tak nepřijde. Anglická a česká aplikace by mohly být úplně samostatné, takže jazyk beru jako parametr prostředí. Tím, že se jazyk přenáší v URL, se mixují parametry prostředí a aplikace. Proto bych se k jazyku chtěl dostat co nejdříve.

V praxi bude asi setup v onRequest stačit. První výstup jde až z prezenteru.