Získávání paramentrů v komponentě

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

Ahoj,
chci si ověřit jestli postupuji správně. Mám komponentu, kterou si vytvářím jako továrničku.

<?php
-
        implement: Components\VotesFactory
        class: Components\Votes
        arguments: [%key%, %user%, %http%]
        parameters: [key, user, http]
?>

V teto komponentě potřebuji info o uživateli a IP adrese, tedy to co ziskam v prezenteru takto

<?php
	$this->getUser();
	$this->getHttpRequest();
?>

Postupuji správně když v presenteru předávám komponentě objekty uživatele a http

<?php
function createComponentVotes(){
        $votes = $this->votesFactory->create($this->article->id, $this->getUser(), $this->getHttpRequest());
	return $votes;
}
?>

a v komponentě takto přijímám

<?php
public function __construct($id, $user, $http, \Nette\Database\Context $db, \Nette\Http\Session $session){
        $this->db = $db;
        $this->id = $id;
        $this->user = $user;
        $this->http = $http;
        $this->sessionVotes = $session->getSection("votes");
    }
?>

Nebo je nějaká lepší cesta? Stejně tak s tou session. Je to tak OK?
Díky za odpověď
Lukáš

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

Lepší cesta existuje, ale jinak to máš dobře, ta lepší cesta je jen zkratkou :)

Registrace v services:

-
	implement: Components\VotesFactory
	create: Components\Votes(%key%)
	parameters: [key]

Podoba konstruktoru:

public function __construct($id, \Nette\Security\User $user, \Nette\Http\Request $httpRequest, \Nette\Database\Context $db, \Nette\Http\Session $session)
{
	$this->id = $id;
	$this->user = $user;
	$this->httpRequest = $httpRequest;
	$this->db = $db;
	$this->sessionVotes = $session->getSection("votes");
}

Továrnička v presenteru:

function createComponentVotes(
{
	return $this->votesFactory->create($this->article->id);
}

Pointa je v tom, že všechny ty 4 závislosti jsou standardně registrované jako služby, a tedy když uvedeš v konstruktoru typehinty, samo se ti to poskládá dohromady. V tom interfacu VotesFactory pak stačí uvést onen parametr $key a žádný další.

Ad session: to je zcela v pořádku.

Editoval vojtech.dobes (24. 1. 2014 14:04)

David Matějka
Moderator | 6445
+
0
-

se session postupujes spravne, stejne tak s db, je ale zbytecne posilat takhle http request, ten si muzes vyzadat stejnym zpusobem jako ostatni sluzby (typehint \Nette\Http\IRequest) a vlastne i usera si muzes vyzadat pomoci typehintu \Nette\Security\User, takze do create posilej jen id (nebo zvaz, jestli neni lepsi posilat cely article a ne jen jeho id)

//pozde

Editoval matej21 (24. 1. 2014 14:07)

konva
Člen | 88
+
0
-

Takhle jsem to zkousel nejdrive a nefungovalo mi to … ale ted vidim, ze sem tam napsal jen „\Nette\Security $user, \Nette\Http $httpRequest“, takže to nemohlo fungovat.
Supr, ted se mi to libi :)
Diky