nette > model > Práce s i dentitou == OK || KO?
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
- zdrhal
- Člen | 42
Ahoj,
mám v modelu třídu Database:
// vyber tabulky z db
/** @return Nette\Database\Table\Selection */
public function findAll($what)
{
if ($what == 'events')
{
// vytahnuti dat z db pro konkretniho uzivatele
$user = Nette\Environment::getUser();
return $this->database->table('events')->where('id_user', $user->getIdentity()->getId());
}
else
return $this->database->table($what);
}
Jednak je údajně tato metoda získání přihlášeného uživatele zastaralá? Navíc by mě zajímalo zda to neva že si v modelu tabulku už „okleštím“ zda to není práce presenteru? V presenteru se pak přistoupí k přihlášenému userovi bez problémů, ale v modelu jsem našel jen toto. Není chyba v mém pojetí?
Editoval zdrhal (2. 4. 2014 15:33)
- Šaman
- Člen | 2668
- Používání statického Nette\Environment je skutečně už přežitek. Jestli model potřebuje k práci proměnnou $user, nebo spíš $identity, tak si o ní má říct.
- Jestliže se metoda jmenuje
findAll()
, měla by vracet skutečně všechny záznamy. Tu tvoji metodu bych pojmenovalfindByUser($what, $user)
. Selekci dat tedy nedělá presenter, ale model, nicméně presenter si o ni musí řict. Bude pak rozdíl, jestli zavolášfindAll('events')
, nebofindByUser('events', $this->user)
. Tu první použiješ třeba při tvorbě nějakého administrátorského přehledu, tu druhou na frontendu. - Většinou se tvoří DAO/repoziráře, které odpovídají jedné tabulce
(resp. jedné entitě v ER diagramu). Nemáš pak třídu
Database
, ale třebaEventRepository
,UserRepository
, apod… Nebudeš pak potřebovat tenif
a v presenteru bude daleko jasnější zápis, třeba
<?php
/** @var Namespace\EventRepository @inject */
public $events;
# a pak někde v kódu
$events = $this->events->findByUser($this->user);
?>