NOVINKA: Získej 40 hodin praktických dovedností s AI – ZDARMA ke každému akreditovanému kurzu!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze – Lekce 4 - Dokončení kalkulačky v Nette

Zpět

Upozorňujeme, že diskuze pod našimi online kurzy jsou nemoderované a primárně slouží k získávání zpětné vazby pro budoucí vylepšení kurzů. Pro studenty našich rekvalifikačních kurzů nabízíme možnost přímého kontaktu s lektory a studijním referentem pro osobní konzultace a podporu v rámci jejich studia. Toto je exkluzivní služba, která zajišťuje kvalitní a cílenou pomoc v případě jakýchkoli dotazů nebo projektů.

Komentáře
Avatar
Martin Konečný (pavelco1998):2.7.2015 13:10

Pokud si správně pamatuji, pak by se na konstruktor presenteru nemělo sahat.
Místo toho je pro inicializaci proměnných atp. metoda startup().

edit: případně použít inject metody

/** @var Nazev\Tridy */
public $nazevTridy;

/**
 * @param Nazev\Tridy
 */
public function injectNazevTridy(Nazev\Tridy $nz)
{
  $this->nazevTridy = $nz;
}

A nebo ještě by mělo jít auto inject pomocí anotace

/**
 * @var Nazev\Tridy
 * @inject
 */
public $nazevTridy;
Editováno 2.7.2015 13:12
Odpovědět
+1
2.7.2015 13:10
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Jindřich Máca
Tvůrce
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Jindřich Máca:2.7.2015 13:27

Bohužel si to pamatuješ asi špatně nebo pro hodně starou verzi, protože v dokumentaci - http://doc.nette.org/cs/2.3/di-usage#… na prvním místě stojí "Předávání konstruktorem". ;)

Ještě bych k tomu doplnil tuto citaci: "Tato deklarace závislostí je vhodná pro povinné závislosti, které třída nezbytně potřebuje ke své funkci, neboť bez ní nepůjde instanci vytvořit." A to je přesně náš případ, protože bez našeho modelu kalkulačka neumí nic spočítat a tudíž ho potřebuje ke své funkci. :)

Editováno 2.7.2015 13:30
 
Odpovědět
2.7.2015 13:27
Avatar
Odpovídá na Jindřich Máca
Martin Konečný (pavelco1998):2.7.2015 17:07

Hmm, pak se asi opět něco v novější verzi měnilo. Dřív k tomu byla metoda startup(), ve které sis mohl sáhnout pro jakoukoliv službu nebo parametr do DI containeru.

public function startup()
{
  parent::startup();
  $this->calculatorManager = $this->context->getService("calculatorManager");
  // $this->context je instancí DI containeru
}

Nicméně pokud je to presenter, pak sice potřebuje calculatorManager ke své funkci, ale nemusí ho nutně dostávat konstruktorem. Při injektování služeb se vytvoří instance automaticky až v případě, že daný objekt potřebuješ (tzn. když použiješ $this->calculatorMa­nager).

V tomhle je tak trochu nevýhoda FW. Uděláš na to pár návodů a za měsíc je můžeš zahodit, protože se způsob použití změní :D

Editováno 2.7.2015 17:08
Odpovědět
+1
2.7.2015 17:07
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Jindřich Máca
Tvůrce
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Jindřich Máca:2.7.2015 17:42

Jo, s tou nevýhodou FW máš naprostou pravdu a zrovna Nette prošlo už několikrát radikálními změnami. Ale zase Tě musím trochu poopravit, protože když si pozorně přečteš http://doc.nette.org/cs/2.3/di-usage#…, tak zjistíš 2 věci:

  1. Metody typu inject* a anotaci @inject je vhodné používat jen v určitý případech a za nejčistší řešení povinných závislostí je považováno právě předání konstruktorem. :)
  2. To co říkáš, o automatické instanci služeb v případě jejich potřeby, tak to platí i pro služby předávané přes konstruktor, protože je pořád předáváš pomocí DI. ;)
 
Odpovědět
2.7.2015 17:42
Avatar
Odpovídá na Jindřich Máca
Martin Konečný (pavelco1998):2.7.2015 18:58

Předávání konstruktorem také používám nejčastěji, ale ne u presenterů, tam jsem si zvyknul vytvářet instance pomocí startup() metody nebo pomocí inject* metod (protože to byl dříve naopak nedoporučovaný způsob).
Dneska bych kód svého projektu taky psal jinak, ale jelikož už tam toho je napsaný hodně, je pro mě výhodnější to dodělat takhle a případně pak udělat celkový refaktoring. Mezitim se ale Nette zase trochu změní :D

Odpovědět
+1
2.7.2015 18:58
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Jindřich Máca
Tvůrce
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Jindřich Máca:2.7.2015 19:43

Já to chápu a upřímně si myslím, že na tom zase tolik nezáleží, hlavně, že se to tam předá pomocí DI. :D Jenom nechci, aby si čtenáři mysleli, že je učím nějaké špatné návyky. :)

 
Odpovědět
2.7.2015 19:43
Avatar
Odpovídá na Jindřich Máca
Martin Konečný (pavelco1998):2.7.2015 20:31

Jo jo v pohodě, v Nette lze psát více způsoby, jen je někdy těžké si ze začátku určit, který z nich bude nejlepší.
Mým cílem samozřejmě neni tě nějak opravovat, ale když si něčím nejsem jistý, tak se radši poptám. Sice v Nette už nějakou chvíli dělám, ale poslední dobou jsem novinky nepročítal :)

Odpovědět
+1
2.7.2015 20:31
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
filipfr
Člen
Avatar
filipfr:29.8.2015 13:05

Ahoj,
mě asi uniká, kdy a kdo vytvoří dané instance modelu a presenteru. O to se nějak stará fw?
Díky

 
Odpovědět
+1
29.8.2015 13:05
Avatar
Jindřich Máca
Tvůrce
Avatar
Odpovídá na filipfr
Jindřich Máca:6.9.2015 14:47

Ano, o instance se stará Nette. ;-)

 
Odpovědět
6.9.2015 14:47
Avatar
Milan Gallas
Tvůrce
Avatar
Milan Gallas:29.9.2015 20:27

Projekt jsem si stáhnul a spustil. Vyhodilo mi to chybovou hlášku:

Parse Error

syntax error, unexpected '['    search►

Source file

File: ...\app\presenters\CalculatorPresenter.php:89

79:                ->addRule(Form::INTEGER, self::FORM_MSG_RULE);
80:            $form->addText('y', 'Druhé číslo:')
81:                ->setType('number')
82:                ->setDefaultValue(0)
83:                ->setRequired(self::FORM_MSG_REQUIRED)
84:                ->addRule(Form::INTEGER, self::FORM_MSG_RULE)
85:                // Ošetříme dělení nulou.
86:                ->addConditionOn($form['operation'], Form::EQUAL, CalculatorManager::DIVIDE)
87:                ->addRule(Form::PATTERN, 'Nelze dělit nulou.', '^[^0].*');
88:            $form->addSubmit('calculate', 'Spočítej výsledek');
89:            $form->onSuccess[] = [$this, 'calculatorFormSucceeded'];
90:            return $form;
91:        }
92:
93:        /**

Jak je to s tím řádkem

$form->onSuccess[] = [$this, 'calculatorFormSucceeded'];

????

 
Odpovědět
29.9.2015 20:27
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 67.