Jak na persistenci?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
ViliamKopecky
Nette hipster | 230
+
0
-
  1. By mě zajímalo zhruba jak funguje, kam se ukládají hodnoty?
  2. Není mi přesně zřejmý účel, něco jako session?
  3. 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
+
0
-

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
+
0
-

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)

Dr.Diesel
Člen | 53
+
0
-

Moc se mi na ty perzistenci nelibi, ze se skript bez komentaru pak chova jinak, jestli tomu dobre rozumim.

Editoval Dr.Diesel (13. 5. 2008 19:50)

ViliamKopecky
Nette hipster | 230
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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.

A.
Člen | 87
+
0
-

Aj, te zavorky tam jsem si nejak moc nevsimnul :-). Samozrejme, muzu, byl to pouze navrh na zvazeni.

Jinak se mi nette strasne moc libi, byl bych ale uz hodne opatrny v jakymkoliv rozsirovani. To sluvko simple je na nem totiz to nejkrasnejsi, dle meho nazoru.