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 :-)