Nová route – Načtení pěkné URL adresy

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

Zdravím všechny,

snažím se nastavit routu pro pěkné URL adresy a zasekl jsem se na tom jak dostat slug z databáze. Mám v namespace FrontModule třídu ProductFrontRepository ve které mám funkci getProductDetailBySlug a potřeboval bych vědět jak tuto funkci v bootstrap.php zavolat. V bootstrap.php mám tuto routu:

    $productRouter[] = new Route('produkt/<id>', array(
        'id' => array(
            Route::FILTER_IN => function ($id) use ($container){
                if(is_numeric($id)){
                    return $id;
                }else{
                    $page = $container->productFrontRepository->getProductDetailBySlug($id);
                    return $page->id;
                }
            },
            Route::FILTER_OUT => function ($id) use ($container){
                if(!is_numeric($id)){
                    return $id;
                }else{
                    $page = new FrontModule\productFrontRepository($id);
                    return $page->slug;
                }
            }
        ),
        'presenter' => 'Product',
        'action' => 'default'
    ));

Zkoušel jsem všemožné varianty ale žádná mi nefungovala.

Díky za pomoc.

Myiyk
Člen | 321
+
0
-

Kód vypadá bez chyby. Nefuguje to vůbec, nebo funguje překlad aspoň jedním směrem ?

Zkontroluj jestli se routa vykonává a jestli productFrontRepository funguje tak jak předpokládáš.

Pavel Macháň
Člen | 282
+
0
-

quiced napsal(a):

Zdravím všechny,

snažím se nastavit routu pro pěkné URL adresy a zasekl jsem se na tom jak dostat slug z databáze. Mám v namespace FrontModule třídu ProductFrontRepository ve které mám funkci getProductDetailBySlug a potřeboval bych vědět jak tuto funkci v bootstrap.php zavolat. V bootstrap.php mám tuto routu:

    $productRouter[] = new Route('produkt/<id>', array(
        'id' => array(
            Route::FILTER_IN => function ($id) use ($container){
                if(is_numeric($id)){
                    return $id;
                }else{
                    $page = $container->productFrontRepository->getProductDetailBySlug($id);
                    return $page->id;
                }
            },
            Route::FILTER_OUT => function ($id) use ($container){
                if(!is_numeric($id)){
                    return $id;
                }else{
                    $page = new FrontModule\productFrontRepository($id);
                    return $page->slug;
                }
            }
        ),
        'presenter' => 'Product',
        'action' => 'default'
    ));

Zkoušel jsem všemožné varianty ale žádná mi nefungovala.

Díky za pomoc.

Přesuň routy do routerFactory a repository si injectni konstruktorem a máš po problémech jak tam služby dostat.

Btw vyhneš se také používání containeru

services:
	routerFactory: App\RouterFactory
	router: @routerFactory::createRouter()
namespace App;

class RouterFactory
{
	/** @var MyRepository */
	private $repository;

	public function __construct(MyRepository $repository)
	{
		$this->repository = $repository;
	}

	/** @return IRouter */
	public function createRouter() {
		$router = new RouteList;
		// sem narves to co máš v bootstrapu
		return $router;
	}

Editoval Pavel Macháň (27. 2. 2016 19:01)

quiced
Člen | 85
+
0
-

Díky za odpovědi posunul jsem se dále ale né tak aby to fungovalo. V RouteFactory mám toto:

   private $productFrontRepository;

    public function __construct(ProductFrontRepository $productFrontRepository)
    {
        $this->productFrontRepository = $productFrontRepository;
    }
    /**
     * @return Nette\Application\IRouter
     */
    public static function createRouter()
    {
        $router = new RouteList('Front');
        $router[] = new Route('produkt/<id>', array(
            'id' => array(
                Route::FILTER_IN => function ($id){
                    if(is_numeric($id)){
                        return $id;
                    }else{
                        $page = $this->productFrontRepository->getProductDetailBySlug($id);
                        return $page->id;
                    }
                },
                Route::FILTER_OUT => function ($id){
                    if(!is_numeric($id)){
                        return $id;
                    }else{
                        $page = $this->productFrontRepository->getProductDetailBySlug($id);
                        var_dump($page);
                        exit;
                        return $page->slug;
                    }
                }
            ),
            'presenter' => 'Product',
            'action' => 'default'
        ));
        $router[] = new Route('<presenter>/<action>[/<id>]', 'Default:default');
        return $router;
    }

A laděnka mi hodí tuto chybu:

Using $this when not in object context search►

Vím, že je to pravděpodobně tím, že špatně přistupuju k productFrontRepository, ale nevím jak je to správně. Můžete mi s tím prosím pomoci?

Děkuji.

quiced
Člen | 85
+
0
-

A ještě doplňující věc nebude problém do jednoho routeFactory napsat celý route list pro oba moduly tedy pro Admin i Front? Můžu to tam napsat tak jak jsem to měl v boostrap.php?

Díky za odpověď.

Pavel Janda
Člen | 977
+
0
-

Nečetl jsem si celý příspěvek, ale tohle by tě taky mohlo trochu navést: https://forum.nette.org/…e-se-nahradi#….

Oli
Člen | 1215
+
+1
-

Problém je tady public static function createRouter(). Nemůžeš ve statické metodě přistupovat k instanci čehokoli. Statická metoda nemá instanci, takže nemůžeš ani použít $this.

Dej si do services

- App\RouterFactory
router: @App\RouterFactory::createRouter

A odstraň to slovo static. To by mělo pomoct…

quiced
Člen | 85
+
0
-

Díky moc všem už mi to funguje poslední rada od Oli byla přesně to co jsem potřeboval k úplné funkčnosti.

Ještě jednou díky za ochotu :-)