Špatná výjimka pokud továrnička nevrací IComponent

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

Ahoj, narazil jsem na drobnou potíž. Zapomněl jsem do továrničky napsat řádek return s tou nově vytvořenou komponentou. Laděnka zaječela „Component with name ‚$name‘ does not exist.“ takže jsem zkoušel hledat chyby jako špatně pojmenovaná továrnička a podobné, protože jsem myslel, že se továrnička vůbec nespustí. Chtělo by to zvláštní chybu pro případ, kdy továrnička sice existuje, ale nevrací to, co by vracet měla.

Ondřej Mirtes
Člen | 1536
+
0
-

Souhlasím, tady jsem taky strávil mnoho chvil :)

Ondřej Brejla
Člen | 746
+
0
-

S tím jsem zrovna problém nikdy neměl. „Komponenta neexistuje? Tak to jsem se asi přepsal, nebo ji nepřipojil…“. Ale tak special chyba by asi přispěla k větší přehlednosti…

Filip Procházka
Moderator | 4668
+
0
-

Tak někdo pošlete pull :)

Ondřej Brejla
Člen | 746
+
0
-

Zas tak mě to teda netrápí :-D

mkoubik
Člen | 728
+
0
-

„Component with name ‚$name‘ does not exist.“ pro mě spíš než „zapomněl jsem na return“ znamená „zapomněl jsem komponentě strčit předka do konstruktoru“. Když se to returnování v továrničkách odnaučíš, tak ta hláška začne dávat smysl.

Mimochodem má

protected function createComponentFoo() {
	return new Foo;
}

nějakou výhodu oproti

protected function createComponentFoo($name) {
	$foo = new Foo($this, $name);
}

?

Ondřej Mirtes
Člen | 1536
+
0
-

Ano, je to hezčí a přirozenější.

Jan Tvrdík
Nette guru | 2595
+
0
-

Jakou hlášku byste si představovali?

Patrik Votoček
Člen | 2221
+
0
-

mkoubik napsal(a):

Mimochodem má

nějakou výhodu oproti

?

viz.: https://forum.nette.org/…e-vs-appform

jtousek
Člen | 951
+
0
-

Aha už to chápu. Továrnička nemusí komponentu vracet, protože ji může sama připojit, takže takováhle hláška by byla naopak špatně.

Na druhou stranu se mi moc nelíbí, že existují dva způsoby a není mezi nimi prakticky žádný rozdíl a nikdo neříká, který by se měl používat. Mám raději když je prostě jeden způsob než takovýhle WTF.

Btw. k čemu vlastně je ten argument $name? Komponenta už přeci jméno má (z názvu továrničky).

bojovyletoun
Člen | 667
+
0
-

myslím že jde o syntaktický cukr. Protože jinak bys jméno předával nějak takto(edit: pro variantu s returnem):

function createComponentFormatDisk(){
$c=new AppForm($this,substr(__METHOD__,strlen('createComponent');
$c->addDynamicContainer();
}

Jinak za sebe používám možnost s return.

Editoval bojovyletoun (9. 2. 2011 22:03)

jtousek
Člen | 951
+
0
-

@bojovyletoun: To je blbost když to funguje i takhle:

<?php
public function createComponentForm() {
	return new AppForm;
}
?>

Editoval jtousek (9. 2. 2011 22:06)

Ondřej Mirtes
Člen | 1536
+
0
-

Je to syntaktický sugar, abys nemusel psát tohle:

protected function createComponentSomeForm()
{
	$form = new AppForm($this, 'someForm');
}
jtousek
Člen | 951
+
0
-

Promiň ale stále nevidím rozdíl v těchto dvou zápisech. Respektive mi uniká smysl druhého z nich, který je zbytečně delší, méně srozumitelný a v některých případech (setMethod u AppForm) i nepraktický. Proč tedy ten druhý někteří preferují?

protected function createComponentFoo() {
	return new Foo;
}

protected function createComponentFoo($name) {
	$foo = new Foo($this, $name);
}

EDIT: Asi se v tom až příliš šťourám, jako ve všem, tak mě pls omluvte…

Editoval jtousek (9. 2. 2011 23:32)

jtousek
Člen | 951
+
0
-

Ano, tohle téma jsem četl – a tam je právě vidět, že druhý způsob (žádný return a předání $this v konstruktoru) někdy přináší problémy. Proto se ptám zda přináší i nějakou výhodu.

Editoval jtousek (10. 2. 2011 9:57)

David Grudl
Nette Core | 8145
+
0
-

Fixed