Využítí modelu pro session

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

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

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

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!

murdej
Člen | 26
+
0
-

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)
?>
Draffix
Člen | 146
+
0
-

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

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.

murdej
Člen | 26
+
0
-
  1. Ten konstruktor můžeš dát do BasketModel.
  2. Session dostaneš do modelu stejně jako $db
  3. V presenteru si model vytváříš stejně – přes context
Draffix
Člen | 146
+
0
-

murdej napsal(a):

3. V presenteru si model vytváříš stejně – přes context

Mě šlo právě o to, jestli se to v prezenteru volá jedině přes ten context nebo to lze i jinak. Každopádně děkuju za pomoc