Jak použít httpRequest (zjištění IP adresy)

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

Zdravím, tak jsem se z předchozího problému dostal o kus dál a řeším teď další věc.
Chci při ukládání do databáze uložit také IP adresu uživatele.
V dokumentaci jsem si našel že se to dělá pomocí $httpRequest->getRemoteAddress();

Ovšem samozřejmě už mi nějak nedochází tohle:
Aktuální HTTP požadavek, objekt Nette\Http\Request, získáme jako službu httpRequest ze systémového DI kontejneru:

// $container je systémový kontejner, např. $presenter->context
$httpRequest = $container->getService('httpRequest');

Jak to mám konkrétně použít? Tyhle konfigurace mi zatím dělají v Nette velký problémy, protože se v tom neumím pořádně orientovat.

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Zmíněný $container je v presenteru dostupný jako $this->context. Takže v presenteru zkrácenou variantou:

$this->context->httpRequest->getRemoteAddress();
Hubi
Člen | 9
+
0
-

vojtech.dobes napsal(a):

Zmíněný $container je v presenteru dostupný jako $this->context. Takže v presenteru zkrácenou variantou:

$this->context->httpRequest->getRemoteAddress();

když zadám v presenteru

$this->context->httpRequest->getRemoteAddress(),

tak mi to nahlásí, že používám nedefinovanou proměnnou context. Zkoušel jsem také pro získání ip použít příkaz:

Nette\Environment::getHttpRequest()->getRemoteAddress()

a ten mi vždy i na ostrém serveru vrátí hodnotu 127.0.0.1. Nevíte prosím někdo co s tím? V nette jsem začátečník, takže se v tom ještě moc nevyznám, jak to funguje.

vvoody
Člen | 910
+
0
-

Hubi: nezabudol si zavolat konstruktor rodicovskeho presenteru?

fr
Člen | 8
+
0
-

httpResponse, který se taky volá z containeru, volám z presenteru takhle:

	    $httpResponse = $this->presenter->context->httpResponse;

Následující už je asi mimo téma, ale IP adresu zjišťuju pomocí php funkce:

	getenv('REMOTE_ADDR');
Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Ideální způsob na aktuální 2.0.5 je využít inject metody, takže takto:

private $httpRequest;

public function injectHttpRequest(Nette\Http\IRequest $httpRequest)
{
	$this->httpRequest = $httpRequest;
}

public function actionSomething()
{
	$this->httpRequest->getRemoteAddress();
}

@fr To je trochu odstrašující případ :) – v presenteru není třeba používat $this->presenter a samozřejmě při poctivém předávání si závislostí je dobré vyhnout se i $this->context.

fr
Člen | 8
+
0
-

vojtech.dobes napsal(a):
@fr To je trochu odstrašující případ :) – v presenteru není třeba používat $this->presenter a samozřejmě při poctivém předávání si závislostí je dobré vyhnout se i $this->context.

dík, učím se :)

$this->presenter proto, protože standardní zápis nefungoval.

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

@fr Rozumím, nicméně v presenteru je $this a $this->presenter zcela totožnou instancí, úplně tím samým. Jakékoliv potíže (tedy že tohleto neplatilo) musely být vyvolané něčím jiným (zajímalo by mě, čím :) ).

fr
Člen | 8
+
0
-

vojtech.dobes napsal(a):

@fr Rozumím, nicméně v presenteru je $this a $this->presenter zcela totožnou instancí, úplně tím samým. Jakékoliv potíže (tedy že tohleto neplatilo) musely být vyvolané něčím jiným (zajímalo by mě, čím :) ).

Domníval jsem se, že to jsou zcela totožné instance, takže dík za definitivní potvrzení.