Argument 1 passed to App\Model\BaseModel::__construct() must be an instance of Nette\Database\Connection

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

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

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

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)