Argument 1 passed to App\Model\BaseModel::__construct() must be an instance of Nette\Database\Connection
- Mooore
- Člen | 13
Ahoj, otázek, odpovědí, návodů již bylo hodně. Naneštěstí všude píšou něco jiného a já v tom mám asi příliš zmatek abych z těch všech zdrojů dokázal zkompletovat funkční verzi. Prosím buďte shovívaví a zkuste mi nepředhazovat „stačí si to přeložit“ …
Mám BaseModel.php
<?php
namespace App\Model;
use Nette,
App\Presenters,
Nette\Database\Connection;
class BaseModel extends Nette\Object
{
protected $db;
public function __construct(Nette\Database\Connection $database)
{
$this->db = $database;
}
}
?>
Od něho chci dědit v ApplicationModelu:
<?php
namespace App\Model;
use Nette,
App\Presenters,
Nette\Database\Context;
class ApplicationModel extends BaseModel
{
public function loadUser(){
$db = $this->db;
...
}
}
?>
A nakonec část configu:
services:
- App\Model\UserManager
- App\Forms\SignFormFactory
router: App\RouterFactory::createRouter
database:
class: Nette\Database\Connection
arguments: ["mysql:host=localhost;dbname=database", "user", "passwd"]
baseModel:
class: App\Model\BaseModel
arguments: ["@database"]
applicationModel:
class: App\Model\ApplicationModel(@database)
Prosím poraďte, kde a co dělám špatně, že mi pořád vyskakuje chyba:
Argument 1 passed to App\Model\BaseModel::__construct() must be an instance of Nette\Database\Connection, none given
- Myiyk
- Člen | 321
Musíš si nastavit ApplicationModel
v configu.
services:
-
class: App\Model\ApplicationModel
arguments: ["@database"]
Konfigurace pro BaseModel
se na ApplicationModel
nevztahuje. Dokud ty třídy nepoužívají statické nebo globální
proměnné, tak mezi sebou nic nesdílí. Stejně jako většina tříd v Nette
je potomkem Nette\Object, ale vždy to je jiná instance.
Editoval Myiyk (2. 5. 2015 1:06)
- Šaman
- Člen | 2666
Děláš to zbytečně složitě a asi se tomu nelíbí použitá syntaxe
u BaseModelu. Ten ale nemusíš vůbec vytvářet. (Aspoň předpokládám, že
instanci BaseModelu v aplikaci nepoužíváš, že slouží jen jako
abstraktní předek?)
A jestli nepoužíváš vytahováni služeb z DI kontejneru pomocí jejich
názvu (což se stejně nedoporučuje, pokud k tomu nemáš důvod), tak ti
stačí tohle?
services:
database:
// ... tak, jak to máš. Mimochodem máš důvod ji vytvářet ručně?
- App\Model\ApplicationModel(@database)
Případně jestli chceš dostat databázi do všech potomků BaseModelu, tak
hledáš nový decorator
? Viz. diskuze
v sousedním vláknu
Editoval Šaman (2. 5. 2015 1:41)