Chyba při odesílání formuláře
- TomasHuttner
- Člen | 66
Zkouším si vytvářet podle návodu v dokumetaci. A najednou při odesláni formuláře chyba Fatal Error Call to a member function createTask() on a non-object
Laděnka:
49: /**
50: * @param Nette\Application\UI\Form $form
51: */
52: private $taskRepository;
53: public function taskFormSubmitted(Form $form)
54: {
55: $this->taskRepository->createTask($this->list->id, $form->values->text, $form->values->userId);
56: $this->flashMessage('Úkol přidán.', 'success');
57: $this->redirect('this');
58: }
55. řádek je červený. Nevíte někco co stím?
- Šaman
- Člen | 2666
Jak injectuješ to $taskRepository do presenteru?
- Teď to máš napsané tak, že mu odpovídá ta anotace od formuláře.
- Buď musí být public s anotací inject (jen v Nette 2.1), nebo potřebuje samostatný injector (Nette 2.x)
<?php
/**
* @var Name\Space\TaskRepository
* @inject
*/
public $taskRepository;
/**
* @param Nette\Application\UI\Form $form
*/
public function taskFormSubmitted(Form $form)
{
$this->taskRepository->createTask($this->list->id, $form->values->text, $form->values->userId);
$this->flashMessage('Úkol přidán.', 'success');
$this->redirect('this');
}
?>
Editoval Šaman (17. 11. 2013 20:06)
- TomasHuttner
- Člen | 66
Casper napsal(a):
Ta chyba ti to říká poměrně jasně, instanční proměnná
$taskRepository
je prázdná. Asi jsi do ní zapomněl přiřadit potřebný objekt.
Asi je to blbý ale jak tam ten objekt mám přidat?
- frosty22
- Člen | 373
Přesně tak, jak ti napsal šaman ..
pro starší verzi nette (2.0.X):
<?php
/**
* @var Name\Space\TaskRepository
*/
public $taskRepository;
public function injectTaskRepository(Name\Space\TaskRepository $taskRepository)
{
$this->taskRepository = $taskRepository;
}
?>
-- Nette samo při vytváření instance presenteru najde všechny metody začínající inject a přes type-hinting jim předá závislosti z kontajneru, a ty si je tam můžeš uložit
pro verzi 2.1 (nebo při použití komponenty Kdyby\Autowired:
<?php
/**
* @var Name\Space\TaskRepository
* @inject
*/
public $taskRepository;
?>
-- zde je zkratka, stačí vytvořit property „public“ a při vytváření instance presenteru, to již i kontroluje všechny public proměnné, zda-li nemají anotaci @inject a když ano, tak to do ní předá závislost z kontajneru
Editoval frosty22 (18. 11. 2013 0:00)