Vlastní mezivrstva u modelů
- exquis
- Člen | 83
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
- použít $this->parametr z rodičovské vrstvy (původně Website)
nebo
- 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
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()
}