Short forward v rámci presenteru
- David Grudl
- Nette Core | 8218
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
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)
- Marek Bartoš
- Nette Blogger | 1260
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.
- Marek Bartoš
- Nette Blogger | 1260
Případně forwardToAction? Ať je podobný název a je jasné, že je to pouze pro akci aktuálního presenteru
- Gappa
- Nette Blogger | 207
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')
- Marek Bartoš
- Nette Blogger | 1260
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
Dal jsem to do v3.2.x-dev pod pracovním názvem fastForward()
,
tak to můžete vyzkoušet.
- David Grudl
- Nette Core | 8218
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
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.