Vlastní mezivrstva u modelů

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

Ahoj,

zkouším přejít z čistého PHP na Nette a narazil jsem na jeden problém – dříve jsem míval vytvořenou za pomoci dědičnosti vrstvy:

Database – připojení k DB
Website – načítala detaily o webu – různá ID z databáze, struktury a obecná data, která jsem si z potomků website mohl používat

nyní ale nemohu přijít na to, jak si podobnou mezivrstvu udělat v Nette. Přijde mi nesmysl, aby to musel každý model zjišťovat zvlášť, když by stačila jedna vrstva, ve které by se to odehrávalo.

Našel jsem útržky ohledně registrování služeb atd. ale furt jsem se nerozkoukal natolik, abych pochopil kde co jak mám vytvářet / registrovat / pojmenovávat, abych v modelu mohl

  1. použít $this->parametr z rodičovské vrstvy (původně Website)

nebo

  1. mohl udělat něco new Website($connection) a vytvořil jsem si novou instanci třídy Website, které bych jen předal Nette\Database a on mi díky tomu zpřístupnil data, která obecně potřebuji.

Díky za rady a tipy

kleinpetr
Člen | 480
+
+2
-

Ahoj, nevím zda jsem tě správně pochopil, ale co se týče modelů a připojení k databázi tak mám jednu abstraktní třídu Table.php a v týhle třídě si předávám v konstruktoru pomocí DI kontejneru připojení k db asi takhle:

abstract class Table extends Nette\Object {

    /** @var Nette\Database\Connection */
    protected $db;

    public function __construct(Nette\Database\Context $db) {
        $this->db = $db;
    }
	.
	.
	.

a v téhle třídě mám obecné metody jako findOne() findAll() findOneBy() atd..

/**
 * @return \Nette\Database\Table\Selection
 */
protected function getTable() {
    return $this->db->table($this->tableName);
}

/**
 * @return \Nette\Database\Table\Selection
 */
public function findAll() {
    return $this->getTable();
}

/**
 * @param  array
 * @return \Nette\Database\Table\Selection
 */
public function findBy(array $by) {
    return $this->getTable()->where($by);
}

/**
 * @param  array
 * @return \Nette\Database\Table\ActiveRow|FALSE
 */
public function findOneBy(array $by) {
    return $this->findBy($by)->limit(1)->fetch();
}
	.
	.
	.

No a pak když chci třeba pracovat se články, tak zdědím od téhle třídy např:

class Articles extends Table
{
protected $tableName = 'articles';
}

Poté už si jen v config.neon zaregistruju službu:
- App\Model\Tables\Articles

a ve finále si v presenteru injectnu potřebný model:

/** @var App\Model\Tables\Articles @inject */
public $articles;

a pak už s tím pracuješ kde potřebuješ třeba:

public function renderDefault(){
$this->template->articles = $this->articles->findAll()
}
Mysteria
Člen | 797
+
0
-

Používám stejnou architekturu právě proto, že stačí přidat definici jedný třídy, jeden řádek do configu a mám hotovo. :)