Dva modely a dvě databáze
- Liborsaf
- Člen | 6
Dobrý den,
Potřeboval bych mít v config.local definovaný dvě databáze, každou
předávat jinému modelu, jenže když tak udělám, vrátí se mi od Tracy
hláška:
Service '32_App_Model_HomeManager' (type of App\Model\HomeManager): Multiple services of type Nette\Database\Context found: database.default.context, database.library.context (needed by $default in App\Model\BaseManager::__construct())
Config.neon:
services:
router: App\RouterFactory::createRouter
- App\Presenters\BasePresenter
- App\Model\BaseManager (@database.default.context)
- App\Model\UserManager (@database.library.context)
- App\Model\HomeManager
Config.local.neon:
parameters:
library: "W-Library"
default: "W-Web"
database:
default:
debugger: true
dsn: "mysql:host=127.0.0.1;dbname=%default%"
user: "xxxxx"
password: "xxxxx"
options:
lazy: yes
library:
debugger: true
dsn: "mysql:host=127.0.0.1;dbname=%library%"
user: "xxxxx"
password: "xxxxx"
autowired: true
options:
lazy: yes
HomePresenter.php:
<?php
namespace App\Presenters;
use Nette;
use Nette\Application\UI\Form;
use App\Model\HomeManager;
class HomePresenter extends BasePresenter {
/** @var HomeManager */
private $homeManager;
public function beforeRender() {
parent::beforeRender();
$this->template->news = $this->homeManager->getNews();
}
public function __construct(HomeManager $homeManager) {
$this->homeManager = $homeManager;
}
}
BaseManager.php:
<?php
namespace App\Model;
use Nette;
use Nette\Database\Context;
use Nette\SmartObject;
class BaseManager {
use SmartObject;
/** @var Context */
protected $database;
public function __construct(Context $default) {
$this->database = $default;
}
}
HomeManager.php:
<?php
namespace App\Model;
use Nette;
use Nette\SmartObject;
use App\Model\BaseManager;
class HomeManager extends BaseManager {
use SmartObject;
public function getNews() {
return $this->database->table("News")->limit(5);
}
}
UserManager.php:
<?php
namespace App\Model;
use Nette;
use Nette\SmartObject;
use App\Model\BaseManager;
class UserManager extends BaseManager {
use SmartObject;
/** @var Context */
protected $library;
public function __construct(Context $library) {
$this->library = $library;
}
}
Popřípadě za každé připomínky budu rád! :)
- CZechBoY
- Člen | 3608
Je potřeba u každé služby říct kterou databázi tam chceš a u obou
bych vypnul autowiring.
Jo a ten BaseManager asi nedávej do konfigurace a označ ho jako abstract –
samotný ho asi nechceš používat…
Několikrát jsem si pohrával s myšlenkou 2× podědit Context, upravit DI extension pro databázi, potom v modelech používat ty 2 dané finální poděděné contexty. Nemusel bys potom ručně psát v konfiguraci kterou databázi checš kam vložit.
Editoval CZechBoY (6. 12. 2018 12:14)
- Liborsaf
- Člen | 6
CZechBoY napsal(a):
Je potřeba u každé služby říct kterou databázi tam chceš a u obou bych vypnul autowiring.
Jo a ten BaseManager asi nedávej do konfigurace a označ ho jako abstract – samotný ho asi nechceš používat…Několikrát jsem si pohrával s myšlenkou 2× podědit Context, upravit DI extension pro databázi, potom v modelech používat ty 2 dané finální poděděné contexty. Nemusel bys potom ručně psát v konfiguraci kterou databázi checš kam vložit.
U databází jsem oddělal autowiring a na BaseManager jsem dal abstract, a nette začala vypisovat chybu:
Service '34_App_Model_BaseManager' (type of App\Model\BaseManager): Class App\Model\BaseManager is abstract.
- Liborsaf
- Člen | 6
CZechBoY napsal(a):
Ještě odeber BaseManager ze služeb.
Ano, to funguje :D
Jen mám ještě jeden takový problém, když do HomePresenteru připíšu
UserManager viz.
/** @var HomeManager */
private $homeManager;
/** @var UserManager */
private $userManager;
public function beforeRender() {
parent::beforeRender();
$this->template->news = $this->homeManager->getNews();
}
public function __construct(HomeManager $homeManager, UserManager $userManager) {
$this->homeManager = $homeManager;
$this->userManager = $userManager;
}
Stránka mi začne házet chybu 500.
- Liborsaf
- Člen | 6
CZechBoY napsal(a):
A přidal si všude tu databázi jak jsem psal?
services: router: App\RouterFactory::createRouter - App\Presenters\BasePresenter - App\Model\UserManager (@database.library.context) - App\Model\HomeManager (@database.default.context)
Aktuálně to mám takto:
services:
router: App\RouterFactory::createRouter
- App\Presenters\BasePresenter
- App\Model\UserManager (@database.library.context)
- App\Model\HomeManager
Ale i pozměně na toto:
router: App\RouterFactory::createRouter
- App\Presenters\BasePresenter
- App\Model\UserManager (@database.library.context)
- App\Model\HomeManager (@database.default.context)
Stále chyba 500.
- Liborsaf
- Člen | 6
Milo napsal(a):
Liborsaf napsal(a):
Stále chyba 500.Jestli na produkci, tak promaž cache.
Bohužel, stále chyba 500.
Ale jen pouze když přidám daný UserManager viz.
/** @var HomeManager */
private $homeManager;
/** @var UserManager */
private $userManager;
public function beforeRender() {
parent::beforeRender();
$this->template->news = $this->homeManager->getNews();
}
public function __construct(HomeManager $homeManager, UserManager $userManager) {
$this->homeManager = $homeManager;
$this->userManager = $userManager;
}
Takto žádná chyba:
/** @var HomeManager */
private $homeManager;
public function beforeRender() {
parent::beforeRender();
$this->template->news = $this->homeManager->getNews();
}
public function __construct(HomeManager $homeManager) {
$this->homeManager = $homeManager;
}