Nette 2.1dev připojení k více databázím → Nette\Database\Connection::table() is deprecated
- motorcb
- Člen | 552
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
V konstruktoru si prostě vyžádej Nette\Database\SelectionFactory a tu používej
- motorcb
- Člen | 552
@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
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
@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
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)
- vitkutny
- Člen | 73
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
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