RestoreRequest chyba při logovaní s backlinkem

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

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. :)

johnygemityg
Člen | 30
+
0
-

žádný nápad ?

petr.pavel
Člen | 535
+
0
-

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

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
+
0
-
  1. 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ý.

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

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

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.