Routování do konstruktoru

Rndoom04
Člen | 75
+
0
-

Zdravím všechny. :)

Je nějaká rozumná cesta (popřípadě jaká), aby routování šlo přes konstruktor? začnu nejdříve tím, co mám. :)

RouterFactory.php

...
$router = new RouteList;
$router[] = new Route('produkt[/<product_seo_name>]', 'Produkt:default');
$router[] = new Route('<presenter>/<action>', 'Homepage:default');
return $router;
...

A v presenteru to chytám jako:

...
public function renderDefault($product_seo_name)
    {
        // nějaké scripty..
    }

    public function createComponentSomeForm()
    {
		// zde potřebuji použít product_seo_name, který mi "vrací" router..
	}
...

Ták.. vše funguje v pořádku. Až do té doby, než odešlu formulář (vypsaný v latte), který potřebuje proměnnou product_seo_name Potřeboval bych, jestli je nějaká cesta, jak product_seo_name neházet do renderDefault, ale do konstruktoru? Nebo jak jinak vyřešit formulář, aby mi uměl vzít tu proměnnou? :)

Děkuji všem za pomoc. :)

Editoval Rndoom04 (16. 1. 2019 13:16)

h4kuna
Backer | 740
+
+1
-

V metodě createComponentSomeForm to vytáhneš pomocí

$this->getParameter('product_seo_name');

Editoval h4kuna (16. 1. 2019 14:42)

Polki
Člen | 553
+
0
-

Nebo, pokud chces fakt jit cestou konstruktoru, napriklad z duvodu aby si mel prehled kde to volas tak jake parametry to potrebuje a nehledat vevnitr jestli jsi tam dal nejake getParameter, tak asi takto:

Presenter:

...
    /** @var int tvuj parametr */
    private $product_seo_name;

    public function actionDefault($product_seo_name)
    {
        $this->product_seo_name = $product_seo_name;
    }

    public function createComponentSomeForm()
    {
        // zde potřebuji použít product_seo_name, který mi "vrací" router..
        $this->product_seo_name;  // toto posles pres konstruktor tady do tve komponenty.
    }
...

Editoval Polki (17. 1. 2019 8:27)

h4kuna
Backer | 740
+
+2
-

Když na to koukám, tak asi nechceš mít seo name v presenteru a řešit převod seo takto pozdě, ale mít rovnou id, což by si můžeš vyřešit na úrovni routeru. Se seo v aplikaci není důvod dále pracovat.

Je tu možnost udělat persistent parameter to nad celým presenterem bez toho setování.

/** @var int tvuj parametr @persistent */
public $product_seo_name;

Editoval h4kuna (17. 1. 2019 9:33)

Polki
Člen | 553
+
0
-

@h4kuna pravdu mas a hodne to resi. V tomto pripade je persistentni parametr dobra volba. Otazka je, jak to ma delane. Videl jsem uz lidi, kteri toto seo jmeno meli jako primary key v db, takze primo udelali jen dotaz na tu adresu. Kazdopadne to nemeni nic na tom ze by tim jen nedelal ten krok v routeru prepsani jmena na id.

Jeden dotaz. Pro @h4kuna. Neni sahani do db na urovni routeru spis spatne nez dobre? Narazil jsem na clanek, kde bylo popsano, ze misto id si z routeru do presenteru hodis rovnou danou entitu z db. Jenze kdyz mam tech routeru povicero, tak v tom pripade se mi muze provest hodne dotazu do db, ktere by se teoreticky v presenteru nikdy neprovedly ne?

h4kuna
Backer | 740
+
0
-

Třeba v tomto případě seo jako primary moc nejde https://www.csfd.cz/…nic/prehled/ a https://www.csfd.cz/…nic/prehled/ a najdeš to i na eshopech kde jsou produkty stejně pojmenované.

Router:
To záleží na přístupu. Router můžeš mít nakešovanej, keš můžeš plnit postupně. Teď když tedy máš entitu, využiješ ji? Nebo to id produktu co jsi dostal je jen pro výběr obrázků, výběru objednávek nebo tedy samotný produkt. Záleží jakou máš databázovou vrstvu pokud ti servíruje entity. Pokud používáš dibi nebo něco jednoduššího tak tady v základu entity moc nejsou. Není dogmaticky správná cesta.

Co to je vícero rout? Většinou ji mám pomálu jakože 1–5.

Polki
Člen | 553
+
0
-

Diky za vysvetleni.

Ja uz videl i projekty kde bylo rout prave 20–50 proto se ptam.

ondraondra81
Člen | 82
+
0
-

Hmm název $product_seo_name asi není nejstaštnější, je to spíše slug, ale to je jedno.
Nicméně může to udělat

$router[] = new Route('produkt[/<product_id>-<product_seo_name>]', 'Produkt:default');

a pak

public function actionDefault($product_id, $product_seo_name)
   {
      // ...
   }

a ridit se jen tim product_id, případně můžeš kontolovat že ten product_seo_name sedí…

delším možným řešením je napsat si dynamický router. dalo by se vycházet třeba z https://github.com/…omRouter.php
ale bacha ten kod je stary (je tam napr. Nette\Object) takže nebude kompatibilní s současným nette.
nebo pomocí globálního filtru viz: https://doc.nette.org/…tion/routing#… převést ten slug na id a posílat si do presenteru jen id.

Rndoom04
Člen | 75
+
0
-

h4kuna napsal(a):

V metodě createComponentSomeForm to vytáhneš pomocí

$this->getParameter('product_seo_name');

Děkuji za pomoc, tohle mi pomohlo. :)