Nettrine vraci Incomplete class

user321
Člen | 5
+
0
-

Ahoj vsichni narazil jsem na tento problem.

V trochu zapomenutem projektu jsem vymenil kdyby/doctrine za nettrine, ale kdyz z entity zkusim ziskat data $entity->getSurname() dostanu err The script tried to call a method on an incomplete object. Please ensure that the class definition "App\Model\Proxy\__CG__\App\Model\User\UserEntity" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide an autoloader to load the class definition.

V konfiguraci nebylo nic nadstandardniho a tak to zustolo i pripade nettrine – vicemene minimalni konfigurace. Pri checku pres orm:info je vsechny entity oznaceny stavem OK. Zkusim-li overit existency proxy trid, tak uvedenou vygenerovanou tridu vidim. Ciste na pohled nic nenaznacuje ze by trida nemela byt vygenerova cela. Pri pouziti se vse tvari v poradku; tracy zaloguje selecty; entita je vracena a obsahuje validni data; az na to ze je trida oznacena jako App\...\__CG__\...\UserEntity (Incomplete class).

Jeste pridavam verze orm:0.8.4 dbal:0.8.2 zbytek je na zaklade techto dvou balicku + v projektu nebylo potreba balicku migration a fixtures (tak doufam ze jejich nepritomnost nezpusobuje onu chybu)

Nenapada nekoho cim by to mohlo byt nebo lepe zda jste se nekdo nesetkal se stejnym problemem.

Prede dekuji za napady a rady ;)

Editoval user321 (26. 8. 15:50)

MajklNajt
Člen | 493
+
0
-

Deje sa ti to v prípade 2nd level cache resp. keď ukladáš entity do cache a následne chceš z nej čítať?

user321
Člen | 5
+
0
-

Ahoj,
trochu jsem si stim jeste hral a overoval co se kde vraci. Overil jsem ze z repositaru i service, ktere s repositarem pracuji se vraci proxy entity $e = $rep->find(XX); dd($e::class); >>> App\...\__CG__\...\...Entity. Omlouvam se se tedy za mistifikaci, ze se jedna o problem s doctrinou.
Ale problem jsem lokalizoval na prihlaseni uzivatele, kdy puvodni autori si Nette\Security\User rozsirili o UserEntitu, kam si predavaji entitu z db.

Prosel jsem akci pri prihlaseni uzivatele a:

// loginForm - success
$this->getUser()->login($identity); // tu je v identity userEntita (App\...\__CG__\...\UserEntity)
// nasleduje redirect

// zpracovani cile redirectu (presenter action default)
$user = $this->getUser()->getIdentity()->getUserEntity(); //tu uz je App\...\__CG__\...\UserEntity (incomplete class)

Takze to asi budu muset predelat, pokud tedy neexistuje nejaka moznost jak vracet complete class

MajklNajt
Člen | 493
+
0
-

Takže problém je s tým, že sa entita ukladá do sessions, preto som sa pýtal na cache, pretože ja som sa s týmto stretol ako pri cache, tak sessions

Najlepšie by bolo sa toho zbaviť, pozri https://doc.nette.org/…thentication#… na metódu wakeupIdentity, to by mohla byť cesta…

user321
Člen | 5
+
0
-

DIky moc za pomoc.
Ta wakeupIdentity vypada dobre, mrknu zda bych to nemohl pouzit aj tu ;)) ja to zatim vyresil, ze v mistech kde jsem potreboval onu enitu jsem si ji vytahl na zaklade id ulozenem v Nette\Security\User… nastesti jen 3* pridany repositar a 4 zmenene volani :DD

Jeste jednou diky

Marek Bartoš
Nette Blogger | 1260
+
+1
-

Lepší je vůbec se nepokoušet entitu ukládat do identity. Stačí si přetížit třídu User, přidat do ní metodu pro získání entity a používat tu.

Editoval Marek Bartoš (27. 8. 13:01)