RestoreRequest chyba při logovaní s backlinkem
- johnygemityg
- Člen | 30
Ahoj, narazil jsem na dost zvláštní problém. Při přihlášení uživatele. Model vyhodí chybu.
Trying to get property of non-object
$def = array('user_id'=> $this->user->id,'status'=>'pending');
Jde nejspíš o to, že $this->user v jisté situaci není pro něj
objekt.
Po refreshi (F5) vše již naběhne.
Také jsem zaznamenal, že se to děje jenom pokud je backlink, čili se neprovede se redirect, ale RestoreRequest.
$this->restoreRequest($this->backlink);
$this->redirect('HomepageIn:');
Další informace:
PHP 5.4.19
Apache
Nette Framework 2.1.0 (revision released on 2013–12–31)
Chyba se stáva v modelu který dědí od obecného modelu
use Nette\Security\User;
class Student extends Model {
public function __construct(Nette\Database\Context $database, User $user)
{
parent::__construct($database, $user);
}
}
Děkuji za jakýkoliv nápad. :)
- petr.pavel
- Člen | 535
Předem se omlouvám, nemám tušení, v čem by mohl být problém. Píšu,
abys neměl dojem, že tohle nikdo nečte :-)
Chyba bude nejspíš v něčem, co's nám neřekl – protože sám
netušíš, že by to mohlo být důležité.
Mohl by sis zkusit logovat $user v constructoru pomocí
Debugger::log()
, abys zjistil, co je $user. Jestli není objekt,
tak Studenta instancuješ i jinak než přes kontejner a v tom máš chybu.
User je podle mě k dispozici vždy, i pro nepřihlášeného uživatele.
Obecně ti můžu vřele doporučit debugování v nějakém IDE. Já používám Eclipse/PDT a debuguju přes XDebug. Na začátku ti asi chvíli zabere, než to rozjedeš, ale na „nevysvětlitelné záhady“ je to bomba. Prostě si někam nastavíš „pauzu“/breakpoint a pak krok po kroku projdeš zbytek aplikace a díváš se při tom, jaké proměnné jsou k dispozici a co v nich je.
- johnygemityg
- Člen | 30
Děkuji za typy. Dodám další info. Při dumpu v kritické situaci je
výstupem NULL.
Chyba se děje jenom pokud se přihlásím po dlouhé době nebo z anonymního
okna. A když se přihlásím odhlásím, tak při dalším přihlášení už
vše funguje. Musím obnovit anonymní okno, aby chyba nastala znova. Neukazuje
to na chyby se sessions ?
Bohužel nevím, jak některé věci v Nette řešit správně takže
možná pracuji s tím modelem exoticky.
Model do prezenteru zavádím takhle.
Base prezenter:
public function startup(){
parent::startup();
$this->model = new stdClass();
$this->model->class = $this->getContext()->getService('class');
$this->model->event = $this->getContext()->getService('event');
$this->model->file = $this->getContext()->getService('file');
$this->model->schedule = $this->getContext()->getService('schedule');
$this->model->school = $this->getContext()->getService('school');
$this->model->student = $this->getContext()->getService('student');
$this->model->teacher = $this->getContext()->getService('teacher');
// další kód //
}
Zakládám si objekt model a do něho zavádím různé klasy (servisi), které vychází vždy z jednoho společného modelu.
Ještě jednou díky za snahu.
- Etch
- Člen | 403
- tohle má sloužit k čemu??
public function __construct(Nette\Database\Context $database, User $user)
{
parent::__construct($database, $user);
}
Celej ten konstruktor můžeš klidně vyhodit, protože pokud je v něm pouze tento kód, tak je zcela zbytečný.
- Proč si předáváš ty závislosti tímto způsobem?? Nebylo by jednodušší udělat prostě:
class FooPresenter extends Presenter {
/** @var \Student @inject */
$studentModel;
/** @var \Event @inject */
$eventModel;
...
...
...
...
}
- johnygemityg
- Člen | 30
Vyhodil jsem ten konstruktor, ale beze změny.
Jednodušší by to asi bylo, ale teď to předělávat už ne.
- johnygemityg
- Člen | 30
Tak jsem to asi vyřešil. Měl si pravdu, že jsem vám neřekl něco podstatného. Já si do $this->user neukládal usera, ale rovnou $user->getIndentity() (přišlo mi to jako super nápad), čili jenom identitu ta u nepřihlášeného uživatele je null a při restore request se nejspíš nepřenačitá. Nevím zda je to ten problém ale zdá se to zatím ok.