Nefunkční abstract BaseModel
- Tom_as
- Člen | 28
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
- Filip Procházka
- Moderator | 4668
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
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
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ě.
- Filip Procházka
- Moderator | 4668
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
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
@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!!).
- hAssassin
- Člen | 293
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.