Short forward v rámci presenteru

David Grudl
Nette Core | 8218
+
+5
-

Chtěl bych do presenterů přidat možnost rychlého předání řízení jiné action/render metodě:

class MyPresenter extends Presenter
{
	function renderDefault()
	{
		if (!$cond) {
			$this->forward('another');
		}
		...
	}

	function renderAnother()
	{
	}
}

V současnosti forward() funguje tak, že vytvoří úplně novou instanci presenteru a spustí jej od začátku s novým action/view. Já bych ale chtěl mít způsob, který bude fungovat okamžitě v rámci jednoho presenteru. Tj. pokud se při běhu renderDefault() zavolá forward(), ukončí jen tuto metodu a ihned zavolá metodu renderAnother(). Stejným způsobem by to fungovalo i pro metody action*().

Vlastně jde o náhradu za následující kód, kde obzvlášť užitečné je právě ono předání parametrů do renderAnother() a také kontrola požadavků:

	function renderDefault()
	{
		if (!$cond) {
			$this->setView('another');
			$this->renderAnother(/* parametry */);
			return;
		}
		...
	}

Přemýšlím, jak takovou metodu nazvat. Samotné forward() už je obsazeno pro long circuit přesměrování. Otázka je, jestli by nemohlo při přechodu na jiné action/view udělat short circuit, tedy zda změnit chování metody. Byl by to BC break? Já tedy nikdy v kódu forward() v rámci stejného presenteru nepoužil, právě protože že mi dlouhý okruh nevyhovuje.

A nebo vytvořit novou metodu. Napadlo mě fastForward(), ale to má význam přetáčení, což asi není ok. Co třeba jump()?

Kamil Valenta
Člen | 815
+
0
-

Mně fastForward() evokuje, že to bude rychlé, což nemusí být pravda.
Co shortForward()?

EDIT: aha, teď se dívám, že se tak jmenuje i samotné vlákno :) Takže – proč ne?
Z jump() zase není patrno, že neumí skočit tak daleko, jako klasické forward.

Editoval Kamil Valenta (17. 4. 16:52)

Šaman
Člen | 2658
+
+4
-

goto()
:D

Marek Bartoš
Nette Blogger | 1260
+
0
-

shortForward a longForward jsou fajn názvy :)

Změnit long na short automaticky by byl BC break. Presenter může mít read-only (write-once) properties, které se inicializují při více akcích a takto by se inicializovaly znova a spadlo by to. Stejně tak se musí resetovat instance $this->template. Ze stejného důvodu a navíc může být pro akci využitá instance jiné template třídy.

Osobně pro jednoduchost zůstanu v těch pár situacích kdy jsem to potřeboval u long forward, právě kvůli resetování stavu.

Infanticide0
Člen | 103
+
+3
-

$this->continueWith("action");

Marek Bartoš
Nette Blogger | 1260
+
0
-

Případně forwardToAction? Ať je podobný název a je jasné, že je to pouze pro akci aktuálního presenteru

mystik
Člen | 308
+
0
-

A co continueWithAction() nebo tak neco?

David Grudl
Nette Core | 8218
+
0
-

Action by v názvu být nemělo, protože je to i pro render metody.

Pepino
Člen | 256
+
+4
-

continueTo ?

Gappa
Nette Blogger | 207
+
0
-

Nápady :)

  • $this->proxy('another')
  • $this->delegate('another') / $this->delegateTo('another')
  • $this->pass('another') / $this->passTo('another')
  • $this->passThrough('another')
  • $this->handOver('another') / $this->handOverTo('another')
  • $this->reroute('another') / $this->rerouteTo('another')
  • $this->bridge('another') / $this->bridgeTo('another')
  • $this->shortCircuit('another')
mystik
Člen | 308
+
+1
-

@DavidGrudl pak jen continue(), continueTo() nebo continueWith()

Pepino
Člen | 256
+
0
-

switchTo
forceTo

m.brecher
Generous Backer | 863
+
0
-

Ahoj,

název by ideálně měl splňovat toto:

  • obsahovat slovo forward, protože už v presenteru forward metodu máme
  • být co nejkratší

nabízí se i tato možnost:

$this->forwardTo('another')
mystik
Člen | 308
+
0
-

Hele a co jednoduse action('another') pro predani na jinou akci a render('another') pro jiny render?

Marek Bartoš
Nette Blogger | 1260
+
0
-

Jen action by mi rozbilo všechny aplikace 😆
Jak používám jednoakční presentery, tak jsem z názvu akcí smazal default

David Grudl
Nette Core | 8218
+
+5
-

Dal jsem to do v3.2.x-dev pod pracovním názvem fastForward(), tak to můžete vyzkoušet.

Ages
Člen | 128
+
0
-

Napadlo mě ještě: skipTo()

David Grudl
Nette Core | 8218
+
0
-

skip() a switch() asi nejlépe odpovídají tomu, co to dělá. Koncovku To použít nechci, protože to není ani už žádné jiné metody. Ale protože skip() může být chápáno také ve smyslu „přeskočit“, zvolím asi switch().

mskocik
Člen | 61
+
0
-

Absolutne off-topic (ale ciastocne suvisi s danou oblastou), ale navrh na feature:

V ramci forwardu targetovat priamo komponentu presenteru a byt tiez schopny zavolat na nej redrawControl.

Da sa to riesit, ale musel som dany kod presunut do specifickeho presenteru a musel som urcity kod presunut do trait. A na prvy pohlad to nevyzera uplne elegantne.