Dva modely a dvě databáze

Liborsaf
Člen | 6
+
0
-

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
+
0
-

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
+
0
-

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.

CZechBoY
Člen | 3608
+
0
-

Ještě odeber BaseManager ze služeb.

Liborsaf
Člen | 6
+
0
-

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.

CZechBoY
Člen | 3608
+
0
-

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)
Liborsaf
Člen | 6
+
0
-

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.

Milo
Nette Core | 1283
+
0
-

Liborsaf napsal(a):
Stále chyba 500.

Jestli na produkci, tak promaž cache.

Liborsaf
Člen | 6
+
0
-

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;
}
Ondřej Kubíček
Člen | 494
+
+1
-

tak se podívej do logu co za 500 ti to háže

Liborsaf
Člen | 6
+
0
-

Ondřej Kubíček napsal(a):

tak se podívej do logu co za 500 ti to háže

Dobrý nápad, taky že mi to ten problém vyřešilo :D

Stačilo do UserManageru dopsat viz.

use Nette;
use Nette\SmartObject;
use Nette\Database\Context; <----

Všem vám děkuji za pomoc! :)

CZechBoY
Člen | 3608
+
+1
-

Zapni si debug rezim a nemusis hledat logy…