Jak na persistenci?
- ViliamKopecky
- Nette hipster | 230
- By mě zajímalo zhruba jak funguje, kam se ukládají hodnoty?
- Není mi přesně zřejmý účel, něco jako session?
- Pokud to tedy nějak tak chápu správně a bral bych to tedy jako session tak…
class Neco extends Control {
/ *
* @persistent
*/
public $cislo;
function __construct() {
if(!isset($this->cislo)) $this->cislo = 0;
echo ++$this->cislo;
}
}
…by tohle mělo po refreshi vyhodit vyšší hodnotu? Ale nedělá mi to… Takže v čem je problém?
Ale počítám s tím, že moje představa je zcela mylná… :)
- David Grudl
- Nette Core | 8218
Ukládá se to od URL – teda vlastně URI ;) – takže refresh ti nepomůže, je potřeba vytvořit odkaz. Například:
class Neco extends Presenter {
/ *
* @persistent
*/
public $cislo = 0;
function startup() {
++$this->cislo;
}
function renderDefault() {
echo '<a href="', $this->backlink(), '">click here</a>';
}
}
- ViliamKopecky
- Nette hipster | 230
Díky
A ještě jak to zabudovat do Control, když na sebe nemá backlink (nebo má?)? Jestli to teda u controlu má využití, ale asi jo…
Editoval enoice (28. 4. 2008 22:50)
- ViliamKopecky
- Nette hipster | 230
Dr.Diesel napsal(a):
Moc se mi na ty perzistenci nelibi, ze se skript bez komentaru pak chova jinak, jestli tomu dobre rozumim.
to jo, ale jestli se ti do toho chce, tak neni až tak těžký si to nastavit jinak… Ale nezkoušel jsem
- David Grudl
- Nette Core | 8218
Dr.Diesel napsal(a):
Moc se mi na ty perzistenci nelibi, ze se skript bez komentaru pak chova jinak, jestli tomu dobre rozumim.
To není ani tak věc perzistence, jako spíš zápisu.
Odbočím: ačkoliv Nette jsem několikrát od základu přepsal, jeho
logika a návrh je od první verze stejná. Liší se jen provedení. Začínal
jsem na PHP 4 a třeba ReflectionProperty::getDocComment(), pomocí které se
dají analyzovat komentáře zdrojového kódu, přišlo až v PHP
5.1. Tudíž jsem i několikrát změnil způsob, jak označovat perzistentní
proměnné (prefixy $p_var
, výčty, anotace, modifikátory
přístupu atd). Anotace v komentářích se mi zdají asi nejlepší; snad
i proto, že podobné techniky používá Java, Python, C# a další jazyky.
Z hlediska implementace je podstatný interface
IStatePersistent
a jeho dvě metody
loadState(array $params)
a
saveState(array & $params)
. První z nich se na začátku
životního cyklu předá pole perzistetních proměnných, druhá z nich je po
dokončení akcí zase vrátí. Implementace tedy čistě závisí na
programátorovi.
V souboru PresenterComponent.php
najdete předpřipravenou
implementaci, která využívá anotace v komentářích. Ve vlastních
presenterech nebo komponentách je možné tyto metody přepsat.
- A.
- Člen | 87
Kdyz uz jste to tu nakousli, tak oznaceni perzistentnich promennych pomoci komentare u promenne se mi moc nelibi. Tak trochu to meni semantiku php.
Uvazoval jsi napr. nad tim, ze vsechny public promenne presenteru by byly perzistentni? Ostatni by holt musely byt private s patricnymi set/getery.
- David Grudl
- Nette Core | 8218
Viz předchozí komentář…
Zkoušel jsem i variantu public = perzistent (tj. označování pomocí modifikátoru přístupu), ale neosvědčilo se mi to (velká náchylnost k chybám). Můžeš si chování Nette ale snadno pozměnit.