Přístip k databázi v routeru
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
- vibko
- Člen | 43
Dobrý den, potřeboval bych prosím poradit, jak udělat přístup k databázi v routefactory a ještě k tomu ve funkci u FILTER_IN. Poradili byste mi prosím? Děkji
<?php
namespace App;
use Nette\Application\Routers\Route;
use Nette\Application\Routers\RouteList;
use Nette\Database\Context;
class RouterFactory
{
private $database;
function __construct(\Nette\Database\Context $database)
{
$this->database= $database;
}
public static function createRouter()
{
$router = new RouteList();
$router[] = new Route('zbozi/[<url>]', $database, array(
'presenter' => 'Eshop:Product',
'action' => [
Route::FILTER_IN => function($url){
if ($database->query('SELECT * FROM category WHERE link=?', $url))
return 'default';
else
return 'detail';
}
]
));
return $router;
}
}
- Barvoj
- Člen | 60
vibko napsal(a):
Děkuji za radu, ale právě mi to hází chybu: Using $this when not in object context. Nevíte, kde by mohla být chyba?
Píšu z hlavy.. ale podle mě by mělo jít v konfigu normálně router zaregistrovat jako službu.. tzn:
config.neon:
services:
routerFactory: App\RouterFactory
router: @routerFactory::create
RouterFactory.php:
class RouterFactory
{
private $database;
function __construct(\Nette\Database\Context $database)
{
$this->database= $database;
}
public function createRouter() // TOTO NENI STATICKA METODA
{
$router = new RouteList();
$router[] = new Route('zbozi/[<url>]', array(
'presenter' => 'Eshop:Product',
'action' => [
Route::FILTER_IN => function($url) {
// tady se pristupuje k $this->database
if ($this->database->query('SELECT * FROM category WHERE link=?', $url)) {
return 'default';
} else {
return 'detail';
}
}
]
));
return $router;
}
}
Editoval Barvoj (5. 8. 2016 10:51)
- Michal Hlávka
- Člen | 190
Jak píše @Barvoj, použij vlastní router, který nastavíš
v configu, předhoď mu do constructoru
\Nette\Database\Context $database
nebo ho injectni a pak už jen
něco na způsob
<?php
namespace App;
use Nette\Application\Routers\Route;
use Nette\Application\Routers\RouteList;
use Nette\Database\Context;
class RouterFactory
{
private $database;
function __construct(\Nette\Database\Context $database)
{
$this->database = $database;
}
public function createRouter()
{
$router = new RouteList();
$router[] = new Route('zbozi/[<url>]', $database, array(
'presenter' => 'Eshop:Product',
'action' => [
Route::FILTER_IN => function($url) use ($this->database){
if ($this->database->query('SELECT * FROM category WHERE link=?', $url))
return 'default';
else
return 'detail';
}
]
));
return $router;
}
}
- David Matějka
- Moderator | 6445
alternativou je nechat si předat connection primo do te staticke metody:
namespace App;
use Nette\Application\Routers\Route;
use Nette\Application\Routers\RouteList;
use Nette\Database\Context;
class RouterFactory
{
public static function createRouter(Context $database)
{
$router = new RouteList();
$router[] = new Route('zbozi/[<url>]', $database, array(
'presenter' => 'Eshop:Product',
'action' => [
Route::FILTER_IN => function($url) use ($database) {
if ($database->query('SELECT * FROM category WHERE link=?', $url))
return 'default';
else
return 'detail';
}
]
));
return $router;
}
}