Nová route – Načtení pěkné URL adresy
- quiced
- Člen | 85
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.
- Pavel Macháň
- Člen | 282
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
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.
- Pavel Janda
- Člen | 977
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
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…