připojení do dvou databází na dvou serverech.. (popř. tří..)

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

Dobrý den, mám problém..
možná se to tu už určitě řešilo..
koukla jsem na ty odpovědi ohledně toho, ale nepochápal jsem to..
Jedná se o připojení do db.. ale do dvou na dvou různých místech s různými ip.
v config.ini mám toto:

nette:
    database:
        default:
            dsn: "mysql:host=localhost;dbname=web"
            user: root
            password: heslíčko
        db2:
            dsn: "mysql:host=externaldbip;dbname=server"
            user: root
            password: heslíčko
services:
    - default(@nette.database.default)
    - Db2(@nette.database.db2)

ale když to chci hodit na ten web tak mi to hází chybu.. s modely neumím.. a tak bych potřeboval poradit.. Díky mnohokrát.
nemůže to být na jedné, protože daný server komunikuje s db a to musí mít na localhostu, tak aby se nelagoval server..

Vastlik
Člen | 58
+
0
-

Ahoj,
poslal by jsi tu chybu?
Díky

Altimit
Člen | 82
+
0
-

v exception.log je:

[2015-12-09 19-23-35] Nette\InvalidArgumentException: Table 'rules' does not exist. in /var/betamineworld/vendor/nette/database/src/Database/Structure.php:249  @  http://vps2.altimut.eu/www/rules/  @@  exception--2015-12-09--19-23--b533607250.html
[2015-12-09 19-23-45] Fatal Error: Call to a member function table() on a non-object in /var/betamineworld/app/presenters/ServerPresenter.php:15  @  http://vps2.altimut.eu/www/server/money  @@  exception--2015-12-09--19-23--333c21909b.html

a v načtení exceptionu s koncovkou .html je:

Call to a member function table() on a non-object

CZechBoY
Člen | 3608
+
+1
-

Potřebuješ tam dostat context :-)

nette:
    database:
        default:
            dsn: "mysql:host=localhost;dbname=web"
            user: root
            password: heslíčko
        db2:
            dsn: "mysql:host=externaldbip;dbname=server"
            user: root
            password: heslíčko
services:
    - default(@nette.database.default.context)
    - Db2(@nette.database.db2.context)
Altimit
Člen | 82
+
0
-

teď to pro změnu píše toto..:

[2015-12-09 19-23-46] Nette\DI\ServiceCreationException: Class db2 used in service '30_db2' not found or is not instantiable. in /var/betamineworld/vendor/nette/di/src/DI/ContainerBuilder.php:476  @  http://vps2.altimut.eu/www/  @@  exception--2015-12-09--19-23--3cb811b264.html

nevím kde se tam vzalo v erroru těch 30_

CZechBoY
Člen | 3608
+
+1
-

Ty děláš službu Db2, ale ta třída (služba vyuzivajici tu DB) se jmenuje asi jinak. Případně ti tam chybí namespace.

Altimit
Člen | 82
+
0
-

jenomže já ji tam definovanou mám..

services:
    - default(@nette.database.default.context)
    - db2(@nette.database.db2.context)

a odkázaní na nette.database.db2.context

CZechBoY
Člen | 3608
+
0
-

Ty máš třídu Db2 a default bez namespacu? Default snad ani nejde založit bez namespacu.
Pošli namespace těch tříd…

Altimit
Člen | 82
+
0
-

takže to budu muset celé předělat.. ale udělám to tedy přes modely (aspoň se je trochu naučím)
jak to tedy udělám aby určitý model volal určitou db (dejme tomu, že vše co je v presenteru ServerPresenter.php bude volat db s parametry, které jsou na herním serveru a ostatní Presentery budou volat druhou lokální db)??
koukal jsem teď na net a našel jsem toto:

services:
	authenticator: Authenticator
	- Model\Default(Nette\Database\Context(@database.default.context))
	- Model\Serverdata(Nette\Database\Context(@database.serverdb.context))
	- App\RouterFactory
	    router: @App\RouterFactory::createRouter

a config.local.neon

database:
	default:
			dsn: 'mysql:host=127.0.0.1;dbname=web'
			user: root
			password: **heslicko**
	serverdb:
			dsn: 'mysql:host=serverip;dbname=server'
			user root
			password: **heslicko**

a v Model\Serverdata.php bych tedy měl mít něco takového:

namespace Model;

use Nette\Database\Context;
use Nette;
use Nette\Utils\Validators;
use Nette\Utils\Strings;


class Serverdata extends Nette\Object {

    private $database_serverdb;
	public function __construct(Nette\Database\Context $database_serverdb {
     ....
    }
}

Mohlo by toto fungovat? přičemž bude v class serverdata volání do db a příkaz pro výpis z db (data)

Editoval Altimit (11. 12. 2015 10:56)

CZechBoY
Člen | 3608
+
+1
-

No jasne, vlastně úplně to stejný, co jsme do ted řešili.
Jen musíš dát ty tvoje modely do spravnyho namespacu.

Edit: Koukám, že v konfiguraku tam je navíc ještě uvedena cela třída Db Context. To nevím co dělá, ale držel bych se toho, že v parametru služby (modelu) budeš mít jen ten @database.default.context

Editoval CZechBoY (11. 12. 2015 11:38)

David Matějka
Moderator | 6445
+
+1
-
- Model\Serverdata(Nette\Database\Context(@database.serverdb.context))

je spatne, ma to byt jen

- Model\Serverdata(@database.serverdb.context)
Altimit
Člen | 82
+
0
-

Děkuji všechno funguje jak má :)