Přechod na verzi 2.1.0 a problém s připojením do více databází

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

Pokud jste přešli na verzi 2.1, v předchozí verzi jste používali připojení do více db a máte hlášku:

Nette\Database\Connection::table() is deprecated; use Nette\Database\Context::table() instead.

Opravuje výběr tabulky z jiné db ;)

Tak stačí jednoduše opravit.

z

public function getForumdb()
{
  $fconnection = new Connection('mysql:host=localhost;dbname=forum', 'username', 'password');
  return $fconnection->table("users");
}

na

public function getForumdb()
{
  $fconnection = new Connection('mysql:host=localhost;dbname=forum', 'username', 'password');
  $forumconnect = new Context($fconnection);
  return $forumconnect->table("users");
}

Nevím jestli má vliv, ale prosjistotu jsem přidal:

use Nette\Database\Context;

+připojení do klasických db je napsané v dokumentaci → https://doc.nette.org/…tions/to-2-1#…

enumag
Člen | 2118
+
0
-

Tohle asi nebude moc efektivní, chybí ti tam cache. Projdi si API té třídy Context, jako třetí patametr jí můžeš předat cachestorage.

Eda
Backer | 220
+
0
-

Jen upozorním, že tohle rozhodně není best practise :-)

Připojení k databázi by měl vytvářet výhradně DI container a ne třída sama. A pokud potřebujete druhé připojení, není problém si ho nakonfigurovat v config.neon a pak vstříknout do služby, kde ho potřebujete…

Zuben45
Člen | 268
+
0
-

Eda napsal(a):

Jen upozorním, že tohle rozhodně není best practise :-)

Připojení k databázi by měl vytvářet výhradně DI container a ne třída sama. A pokud potřebujete druhé připojení, není problém si ho nakonfigurovat v config.neon a pak vstříknout do služby, kde ho potřebujete…

jenomže já se v té třídě potřebuji dostat do dalších dvou databází ;)

Eda
Backer | 220
+
0
-

V konfigu můžeš mít teoreticky kolik chceš databází :-)

Návod, jak přesně na to, najdeš třeba zde:
https://forum.nette.org/…uhe-databazi#…

mildhouse
Člen | 27
+
0
-

Eda napsal(a):

V konfigu můžeš mít teoreticky kolik chceš databází :-)

Návod, jak přesně na to, najdeš třeba zde:
https://forum.nette.org/…uhe-databazi#…

OK, jenže v configu konfiguruju Nette\Database\Connection

nette:
	database:
		default:
			dsn: ...
			user: ...
			password: ...
			options: ...

		forum:
			dsn: ...
			user: ...
			password: ...
			options: ...

services:
	forumRepository: Model\ForumRepository(@nette.database.forum)

Ale potřebuju Nette\Database\Context, takže :

namespace Model;

abstract class ForumRepository extends \Nette\Object
{
	/** @var Nette\Database\Context */
	public $context;


	public function __construct(\Nette\Database\Connection $conn)
	{
		$this->context = new \Nette\Database\Context($conn);
	}

}

a jsme tam kde jsme byli, nemáme cachestorage. Jak to udělat správně pomocí DI containeru? Tohle nefunguje :

public function __construct(\Nette\Database\Connection $conn, \Nette\Database\Reflection $ref, \Nette\Caching\Storage $cache)
{
	$this->context = new \Nette\Database\Context($conn, $ref, $cache);
}