Chyba při odesílání formuláře

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

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?

Casper
Člen | 253
+
0
-

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.

Šaman
Člen | 2666
+
0
-

Jak injectuješ to $taskRepository do presenteru?

  1. Teď to máš napsané tak, že mu odpovídá ta anotace od formuláře.
  2. 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
+
0
-

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

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)