IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

Diskusia – 4. diel - Dokončenie kalkulačky v Nette

Späť

Upozorňujeme, že diskusie pod našimi online kurzami sú nemoderované a primárne slúžia na získavanie spätnej väzby pre budúce vylepšenie kurzov. Pre študentov našich rekvalifikačných kurzov ponúkame možnosť priameho kontaktu s lektormi a študijným referentom pre osobné konzultácie a podporu v rámci ich štúdia. Toto je exkluzívna služba, ktorá zaisťuje kvalitnú a cielenú pomoc v prípade akýchkoľvek otázok alebo projektov.

Komentáre
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;
Editované 2.7.2015 13:12
Odpovedať
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
Odpovedá 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. :)

Editované 2.7.2015 13:30
 
Odpovedať
2.7.2015 13:27
Avatar
Odpovedá 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

Editované 2.7.2015 17:08
Odpovedať
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
Odpovedá 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. ;)
 
Odpovedať
2.7.2015 17:42
Avatar
Odpovedá 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

Odpovedať
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
Odpovedá 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. :)

 
Odpovedať
2.7.2015 19:43
Avatar
Odpovedá 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 :)

Odpovedať
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

 
Odpovedať
29.8.2015 13:05
Avatar
Jindřich Máca
Tvůrce
Avatar
Odpovedá na filipfr
Jindřich Máca:6.9.2015 14:47

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

 
Odpovedať
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'];

????

 
Odpovedať
29.9.2015 20:27
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zatiaľ nikto nevložil komentár - buď prvý!