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

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
+
0
-
  1. 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.
  2. Jestliže se metoda jmenuje findAll(), měla by vracet skutečně všechny záznamy. Tu tvoji metodu bych pojmenoval findByUser($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'), nebo findByUser('events', $this->user). Tu první použiješ třeba při tvorbě nějakého administrátorského přehledu, tu druhou na frontendu.
  3. 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řeba EventRepository, UserRepository, apod… Nebudeš pak potřebovat ten if 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);

?>
zdrhal
Člen | 42
+
0
-

Děkuji