přístup k Session ve vlastní třídě
- Filip Procházka
- Moderator | 4668
Chápeš to špatně. app/bootstrap.php
je soubor, který pouze
nastaví configurátor, dá mu cesty ke konfiguračním souborům a eventuelně
zapne aplikaci. Vůbec žádná session ho nezajímá.
Session se nastavuje ideálně v configu a pracuješ s ní pak v modelech a presenterech pomocí Session objektu, který si necháš injectnout.
class MyFunnyModel extends Nette\Object
{
/** @var Nette\Http\SessionSection */
private $session;
public function __construct(Nette\Http\Session $session)
{
// vytáhnu si sekci a vložím do vlastnosti třídy
// zde jsem zvolil pojmenování sekce podle názvu třídy
$this->session = $session->getSection(get_class($this));
}
public function work()
{
// v jednotlivých metodách pak pracuješ se svou sekcí
$this->session->counter += 1;
}
}
S čím konkrétně máš problém?
- batko
- Člen | 219
mám tuto třídu
<?php
use Nette\Utils\Strings;
use Nette\Http\SessionSection;
class Basket extends Nette\Object {
/** @var Nette\Http\SessionSection */
private $session;
public function __construct(Nette\Http\Session $session) {
// vytáhnu si sekci a vložím do vlastnosti třídy
// zde jsem zvolil pojmenování sekce podle názvu třídy
$this->session = $session->getSection(get_class($this));
}
public function setUser($user = NULL) {
if ($user == NULL) {
$this->user = Strings::random(40);
} else {
$this->user = 1;
}
}
public function addItem($count = 1, $idItem) {
$this->session->counter += 1;
}
}
?>
a při vytvoření objektu (ten se vytváří v komponentě) to hodí
Argument 1 passed to Basket::__construct() must be an instance of Nette\Http\Session, none given, called in C:\xampp\htdocs\Shoplando\app\components\Form\FormToBasket.php on line 28 and defined
- batko
- Člen | 219
Komponenta je zde, nějak si sedím na vedení
<?php
namespace Todo;
use Nette;
use Nette\Application\UI\Form;
class FormToBasket extends Nette\Application\UI\Control {
public $selected;
public $id;
public $basket;
public function __construct($selected, $id) {
parent::__construct();
$this->selected = $selected;
$this->id = $id;
}
public function render() {
$this->template->product = $this->selected;
$this->template->setFile(__DIR__ . '/FormToBasket.latte');
$this->template->render();
}
public function insertToBasket(Form $form) {
$basket = new \Basket();
$this->presenter->flashMessage('Zboží bylo vloženo do košíku v počtu ' . $form->values->count . ' ks', 'success');
$this->presenter->redirect("this");
}
protected function createComponentBasketForm() {
$form = new Form();
$form->addText("count")
->setValue(1)
->addRule(Form::INTEGER, "Hodnota musí být celé číslo");
$form->addHidden('id')
->setValue($this->id);
$form->addSubmit("submit", "ok");
$form->onSuccess[] = $this->insertToBasket;
return $form;
}
}
?>
- ViPEr*CZ*
- Člen | 817
S prominutím si sedíte a pořádně.
Prvně bych property nedefinoval jako public (viz. public $basket;). Za
druhé
$basket = new \Basket();
A vy se divíte proč Vám tento konstruktor vyhodí vyjímku???? Vždyť
definice metody vypadá takto:
public function __construct(Nette\Http\Session $session)
A při vytváření objektu nic jako parametr nepošlete, dostanete jasnou
exception a stále netušíte???
Co takhle tam předat instanci na Nette\Http\Session ???
A jak ji dostanete do třídy FormToBasket??? No jednoduše si jí opět
předáte.