Využítí modelu pro session
- Draffix
- Člen | 146
Zdravím, řeším teď nákupní košík a narazil jsem na řešení od Jana Fábíka na gitu, které bych chtěl použít. Doposud jsem to řešil pouze přes databázi a myslím, že je lepší to řešit (alespoň částečně) přes session. Jenže nevím, jak to aplikovat, resp. to předělat. Mám model Basket:
<?php
class BasketModel extends Table {
/** @var string */
protected $tableName = 'basket';
/**
* Ukládá vložený produkt do tabulky 'basket'
* @param type $items
*/
public function saveItemIntoBasket($items) {
$this->connection->table($this->tableName)->insert($items);
}
...
?>
který dědí připojení z modelu Table. V prezenteru jsem to řešil takhle:
<?php
...
/** @var MatyIsland\BasketModel */
protected $basket;
...
$this->basket = $this->context->basket;
?>
A pak využíval jeho metody, do kterých jsem předával data. Jak to ale předělat, abych mohl mít Fábíkovou metodu addProduct v modelu a v prezenteru ji pak jednoduše zavolat např. při zavolání handleru?
- murdej
- Člen | 26
Tímto způsobem jsem si upravil třídu Table abych si zpřístupnil context, stačí přidat Nette\DI\Container $context do parametrů konstruktoru a anotace, DI se postará o zbytek.
Pokud chceš předat jen session bude to podobné mělo by stačit změnit typ parametru ale to jsem nezkoušel.
<?php
abstract class Table extends Nette\Object
{
/**
* @var Nette\DI\Container
*/
protected $context;
...
/**
* @param Nette\Database\Connection $db
* @param Nette\DI\Container $context
* @throws \Nette\InvalidStateException
*/
public function __construct(Nette\Database\Connection $db, Nette\DI\Container $context)
{
$this->connection = $db;
$this->context = $context;
?>
- ViPEr*CZ*
- Člen | 814
public function __construct(Nette\Database\Connection $db, Nette\DI\Container $context)
Předávat context je taková krása… Je to jednoduché a hned mám všechny služby po ruce. Stačí si jen vybrat co si z kontextu vyberu. Když jde o menší projekt a dělá na tom jeden člověk… a má to tak nějak furt v hlavě… tak to pro lenost je asi paráda. Ale… nepoužívejte to!
- Draffix
- Člen | 146
murdej napsal(a):
Ve složitějších projektech by mohlo předávání celého contextu dělat binec, v takovém případě bude lepší ta druhá možnost – předat jen session:
<?php public function __construct(Nette\Database\Connection $db, Nette\Http\Session $session) ?>
Dobře, mám v modelu Table tento konstruktor, a co dále? Jak ho mohu využít pro jiný model a jak ho zavolat v presenteru?
- ViPEr*CZ*
- Člen | 814
Jak využít tento konstruktor v jiném modelu? No to snad ne? Co to má
společného s Nette?
Jak volat konstruktor v presenteru. No to opět snad ne? Tady to ale rozvedu…
klasicky by byla odpověď vytvořit si instanci toho modelu přes operátor
new, ale v nette se dá použít config. Mrkněte do dokumentace.