Nefunkční abstract BaseModel

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

Zdravím,

zkouším nové nette 2.0.8 a nemohu se dohodnout s konfigurací.

Nette mě hlásí tohle:

Nette\InvalidStateException

Class BaseModel used in service ‚baseModel‘ has not been found or is not instantiable

BaseModel.php

<?php

use Nette\Caching\Cache, Nette\Utils\Paginator, Nette\Utils\Strings;

abstract class BaseModel extends Nette\Object
{

	/** @var Nette\Database\Connection */
	private $database;


	public function __construct(Nette\Database\Connection $database)
	{
		$this->database = $database;
	}

}

Netuším proč tomu vadí abstract class. Prosím o pomoc. Děkuji

vvoody
Člen | 910
+
0
-

Veď už z podstaty toho slova je jasné že sa nedá inštancovať niečo abstraktné.

Tom_as
Člen | 28
+
0
-

To jsem si taky dokazal prelozit. Ale proc ve version 2.0.3 to mohu takto delat a najednou v 2.0.8 uz ne? Nette je skvely nastroj ale krade me moc casu abych zjistoval co je noveho v novych verzich.

Mohl bys me prosim te pomoci jak tohle popripade vyresit a zachovat DI?

Filip Procházka
Moderator | 4668
+
0
-

Ty zjevně očekáváš, že si do DIC zaregistruješ službu „basemodel“, která bude mít třídu abstract BaseModel a každá třída která by od ní dědila by magicky získala Connection.

Takhle to ale nefunguje.

Musíš zaregistrovat konkrétní třídu (která nemusí dědit od BaseModel – docela zbytečné na těch 10 řádků dělat samostatnou třídu, ne?) do DIC, každou a jednotlivě.

services:
	- MyApp\ArticlesModel
	- MyApp\CommentsModel
	- MyApp\UsersModel
	- MyApp\VotesModel

A potom si je necháš hezky injectnout do presenteru

Ještě bych na závěr dodal, že nic takového v Nette nikdy nefungovalo a fungovat nebude.

Tom_as
Člen | 28
+
0
-

Ne Filipe tohle ja neocekavam!

Tohle mam ve starem projektu.

abstract class BaseModel extends Nette\Object
{
    /** @var Nette\Database\Connection */
    protected $database;

    /**
     * @param Nette\Database\Connection $database
     */
    public function __construct(Nette\Database\Connection $database)
    {
        $this->database = $database;
    }

Config

services:
		database: @Nette\Database\Connection
		authenticator: Authenticator
		BaseModel: BaseModel(@database)
		ManagerModel: ManagerModel(@database)

Byl jsem naprosto spokojeny uzivatel a takto to ve verzi 2.0.3 funguje ale v 2.0.8 uz ne :(

Filip Procházka
Moderator | 4668
+
0
-

Můžeš mi vysvětlit, proč registruješ BaseModel jako službu? Když to zjevně žádná služba není, ale jen pomocná třída? Nestačí prostě zaregistrovat pouze tvůj „ManagerModel“ ?

Pokud tohle v 2.0.3 funguje, tak je to zjevně špatně.

Tom_as
Člen | 28
+
0
-

Registruju jí jako službu abych do ní dostal spojeni do databáze.

Filip Procházka
Moderator | 4668
+
0
-

A používáš ji někde, že v ní potřebuješ připojení do databáze?

Tom_as
Člen | 28
+
0
-

Ano, mam vní věci, které se opakují v celém projektu. Language, currency atd.

Filip Procházka
Moderator | 4668
+
0
-

Hele zkrátíme to – prostě ten řádek z configu vyhoď a začne to fungovat ;)

Pokud máš potřebu chatovat si, skoč raději za námi na jabber chat nette@conf.netlab.cz

hAssassin
Člen | 293
+
0
-

To ale neni problem nette ale samotnyho PHP, ze abstraktni tridu nelze instanciovat, ne? Cili to co mas v konfigu je spatne a baseModel nemuze byt sluzba. Proc to v 2.0.3 funguje a ve 2.0.8 uz ne je otazka. Ale neni to nahodou tim, ze ty tu sluzbu baseMode vlastne nikde nepouzivas a ona se v 2.0.3 vytvari lazy cili se vlastne nikdy nevytvori ale ve 2.0.8 uz se lazy nevytvari ale vytvori se automaticky v kontejneru pri jeho inicializaci. Nebyla tam takova zmena okolo verze 2.0.5 a injektovani sluzeb?

Filip Procházka
Moderator | 4668
+
0
-

@hAssassin: spíše bych řekl, že novější verze je striktnější a více kontroluje jednotlivé služby už při kompilaci (což je dobře!!).

Tom_as
Člen | 28
+
0
-

Děkuji všem za pomoc, zařídím se podle toho. A děkuji za pozvání na jabber :)

vvoody
Člen | 910
+
0
-

hAssassin napsal(a):

To ale neni problem nette ale samotnyho PHP

To je problém s pochopením objektového jazyka. Jazyk samotný je v tomto ohľade v poriadku.

hAssassin
Člen | 293
+
0
-

vvoody > ano ja to nemyslim jako chybu. to rozhodne ne, ba naopak abstract/final jsou super veci, ktery v OOP maji svoje misto. Ale myslel jsem to tak, ze to neni primo vec nette ze to nepovoli ale primo veci php (slovo „problem“ asi nebyl uplne nejlepsi). Reagoval jsem tim na toto:

Nette je skvely nastroj ale krade me moc casu abych zjistoval co je noveho v novych verzich.