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;
    }

