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
+
0
-

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;
	}
}
mkoubik
Člen | 728
+
+1
-

V té anonymní funkci normálně použij $this->database->query(...).

vibko
Člen | 43
+
0
-

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?

MW
Člen | 615
+
+1
-

Ve statické metodě nejde použít $this.

Barvoj
Člen | 60
+
+3
-

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
+
0
-

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
+
+5
-

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;
    }
}