Nette 2.1dev připojení k více databázím → Nette\Database\Connection::table() is deprecated

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

Zdravim,

připojuji se k vice sqlite databazim:

nette:
    database:
        default:
            dsn: 'sqlite:./temp.db'
        WS:
            dsn: 'sqlite:./WS1090.db'

Model:

<?php

namespace Repository;

use Nette;

class WSTemp
{

    private $database;
    private $tableName = "temp";

    function __construct( Nette\Database\Connection $database )
    {
        $this->database = $database;
    }

    public function getTable()
    {
        return $this->database->table( $this->tableName );
    }

    public function insert( $aValues )
    {
        return $this->getTable()->insert( $aValues );
    }

presenter:

    /** @var Repository\WSTemp @inject */
    public $WSTemp;

action:
        $array = array("date" => "20.9.2013 17:02:00", "temp_in" => "17.03");
        $this->WSTemp->insert($array);

Kde koncim na chybe: Nette\Database\Connection::table() is deprecated; use SelectionFactory::table() instead.
Ale jak z Nette\Database\Connection ziskam SelectionFactory??

Děkuji za rady

PavelJurasek
Člen | 39
+
0
-

V konstruktoru si prostě vyžádej Nette\Database\SelectionFactory a tu používej

motorcb
Člen | 552
+
0
-

@PavelJurasek:

tim to asi nebude :-(

Model:

<?php

namespace Repository;

use Nette;

class WSTemp
{

    private $database;
    private $tableName = "temp";

    function __construct( Nette\Database\SelectionFactory $database )
    {
        $this->database = $database;
    }

    public function getTable()
    {
        return $this->database->table( $this->tableName );
    }

    public function insert( $aValues )
    {
        return $this->getTable()->insert( $aValues );
    }

vraci chybu: Argument 1 passed to Repository\WSTemp::__construct() must be an instance of Nette\Database\SelectionFactory, instance of Nette\Database\Connection given

PavelJurasek
Člen | 39
+
0
-

Ukaž config.neon

Máš tam asi něco jako

services:
	...
	WSTemp: Repository\WSTemp(@nette.database.default)
	...

nebo něco podobného, prostě té službě explicitně nastavuješ parametry. Když ty parametry odebereš, Nette se o předání správné služby Nette\Database\SelectionFactory postará samo.

Editoval PavelJurasek (20. 9. 2013 19:53)

motorcb
Člen | 552
+
0
-

@PavelJurasek:
Ano, toto v configu mám:

parameters:

php:
    date.timezone: Europe/Prague
    # zlib.output_compression: yes

nette:
    database:
        default:
            dsn: 'sqlite:./temp.db'
        WS:
            dsn: 'sqlite:./WS1090.db'

    application:
        errorPresenter: Error
        mapping:
            *: App\*Module\*Presenter

    session:
        expiration: 1 days


services:
    - App\RouterFactory
    router: @App\RouterFactory::createRouter
    - Repository\Temp
    - Repository\WSTemp(@nette.database.WS)

Ale Nette do modelu stále předává Nette\Database\Connection

Model:

<?php

namespace Repository;

use Nette;

class WSTemp
{

    private $database;
    private $tableName = "temp";

    function __construct( Nette\Database\SelectionFactory $database )
    {
        $this->database = $database;
    }

    public function getTable()
    {
        return $this->database->table( $this->tableName );
    }

    public function insert( $aValues )
    {
        return $this->getTable()->insert( $aValues );
    }

Chyba: Argument 1 passed to Repository\WSTemp::__construct() must be an instance of Nette\Database\SelectionFactory, instance of Nette\Database\Connection given
Přes composer instaluju poslední dev verzi Nette. Cache smazána

Editoval motorcb (20. 9. 2013 20:12)

vitkutny
Člen | 73
+
0
-

právě že to tam nemáš mít [Repository\WSTemp(@nette.database.WS)]

services:
    - App\RouterFactory
    router: @App\RouterFactory::createRouter
    - Repository\Temp
    - Repository\WSTemp

zkus jen toto a do constructoru se ti dostane třída uvedená v type hintu, tedy SelectionFactory

Editoval vitkutny (20. 9. 2013 20:18)

motorcb
Člen | 552
+
0
-

@vitkutny: ovšem to mne připojí k defaultní databázi.

Já se chci připojit k db WS.

        WS:
            dsn: 'sqlite:./WS1090.db'

Takže bych to tam měl mít,ne?

vitkutny
Člen | 73
+
0
-

SelectionFactory příjmá jako první parametr connection. Možná by mohlo by jít vytvořit třídu WsSelectionFactory rozšiřující SelectionFactory a té předat v configu wsconnection a tuhle třídu vyžadovat v constructoru repositáře.

Se dvěma databázema jsem ještě nic nedělal. Je to jen nápad, tak snad někdo ještě napíše, kdyby tohle nefungovalo.

Edit: ze zajímavosti jsem vyzkoušel a funguje bez problémů, řešení pode mnou je ale podle mně lepší :-)

Editoval vitkutny (20. 9. 2013 21:13)

Milo
Nette Core | 1283
+
0
-

Když parametr neuvedeš, nadrátuje se tam objekt, který už v kontejneru existuje. Ve tvém případě to asi bude SelectionFactory vytvořená nad nette.default.database. Musíš si ji vytvořit ručně:

services:
	- Repository\WSTemp(
		Nette\Database\SelectionFactory(@nette.database.WS)
	)

a nebo s discovered reflexí:

services:
	- Repository\WSTemp(
		Nette\Database\SelectionFactory(
			@nette.database.WS,
			Nette\Database\Reflection\DiscoveredReflection(@nette.database.WS)
		)
	)

viz. také API

knedle
Člen | 34
+
0
-

oprava, vzhledem k tomu, že Nette\Database\SelectionFactory v 2.1 neexistuje…

v config ini nastavit:

services:
    - Repository\WSTemp(
        Nette\Database\Context(@nette.database.WS)
    )