Chyba Call to a member function getUrl() on null

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

Zdravíčko. Omlouvám se předem za další téma vůči problému ale nevím co s tím. Stáhl jsem nové nette rozjel ho na localhostu. Když jsem přidal do HomepagePresenteru User class s tím jestli je uživatel nepřihlášen tak ho to hodí na jiný presenter tak nastala chyba:

Call to a member function getUrl() on null

Chyba se náléza zde:

Soubor: File: …\nette\application\src\Application\UI\Presenter.php:977

975:            static $refUrl;
976:            if ($refUrl === NULL) {
977:                $refUrl = new Http\Url($this->httpRequest->getUrl());
978:                $refUrl->setPath($this->httpRequest->getUrl()->getScriptPath());
979:            }

HomepagePresenter:

namespace App\Presenters;

use Nette;
use App\Model;
use Nette\Security\User;


class HomepagePresenter extends BasePresenter
{
	private $user;

	public function __construct(User $user)
	{
		$this->user = $user;
		if(!$this->user->isLoggedIn())
		{
			$this->redirect("Login");
		}
	}

	public function renderDefault()
	{

	}

}
David Matějka
Moderator | 6445
+
0
-

kontrolu, zda je uzivatel prihlasen, provadej az v metode startup. V konstruktoru pouze zpracuj zavislosti. A User si ani predavat nemusis, ten je dostupny pres getUser()

Isigarek
Člen | 74
+
0
-

Dobře takto jsem to upravil:

private $user;

	public function __construct()
	{
		$this->user = $this->getUser();
	}

	public function startup()
	{
		if(!$this->user->isLoggedIn())
		{
			$this->redirect("Login");
		}
	}

Chyba:

Service User has not been set
David Matějka
Moderator | 6445
+
+1
-

smaz ten konstruktor a private $user, tu metodu getUser volej ve startup. a nezapomen tam zavolat parent::startup(), jinak to bude rvat..

Isigarek
Člen | 74
+
0
-

Perfektní fakčí to, díky moc! :)
Ještě jedna otázka rád věci chápu úplně abych měl ten smysl tak proč se používá funkce

startup
__construct()

A popřípadě co volá

parent::startup předpokládám basePresenter

?

David Matějka
Moderator | 6445
+
+1
-

viz zivotni cyklus presenteru, nette vola startup, kdyz uz je presenter spravne inicializovany a jsou tedy k dispozici vsechny zavislosti atd.

Ondris
Člen | 37
+
+1
-

Ty jednotlivý metody presenteru jsou celkem dobře vysvětleny tady: https://doc.nette.org/…n/presenters#… . Přímo u metody startup je uvedeno, že slouží pro ověření uživatelského oprávnění. Je dobrý se toho držet.
Metoda parent::fcName volá fcName z předka, takže ano, pokud dědíš od basePresenteru, tak volá ten.
Edit: pozdě.

Editoval Ondris (2. 11. 2015 17:15)

CZechBoY
Člen | 3608
+
0
-

A proč se v UI\Presenter::checkRequirements autorizuje uživatel pomoci anotace @logged? Když se to má dělat až ve startup?

David Matějka
Moderator | 6445
+
0
-

@CZechBoY trochu jsem to zjednodusil, checkRequirements je uz taky ok :)