Persistentní parametry mohou být zcela neočekávaně přepsány

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Honza Marek
Člen | 1664
+
0
-
class HomepagePresenter extends BasePresenter
{

	/** @persistent */
	public $lang = 'cs';

	public function renderDefault()
	{
		$params = $this->getParameter();
		$params['lang'] = 'prase';
		dump($this->getParameter());
	}

}

Kvízová otázka. Co je nyní v parametru lang? Kdo by to byl řek, ale je to „prase“.

Může za to kód metody Presenter::loadState, který pro $presenter->params['nejakyPersistentniParametr'] navyrábí nějaké reference, takže kdekoliv člověk změní hodnotu persistentního parametru, tak to provede toto kouzlo. I když to odporuje všemu, na co je člověk při běžném používání PHP zvyklý. Nešlo by to řešit jinak?

Filip Procházka
Moderator | 4668
+
0
-

Nenapadá mně jak. Zařadil bych to do kategorie „je potřeba zrefaktorovat presentery“. Btw, co Vašek?

Honza Marek
Člen | 1664
+
0
-

IMHO by stačilo z PresenterComponent::$params udělat getter, který by vracel obsah pole params + by si přečetl persistentní proměnné z public proměnných persistentních parametrů.

Patrik Votoček
Člen | 2221
+
0
-

Nevím ale mě stávající chování připadá logické. HomepagePresenter::$lang je logicky reference na HomepagePresenter::$params['lang']. HomepagePresenter::$lang existuje v podstatě pouze z důvodu jednoduššího zápisu flagu persistent a jednodušší manipulací s tím to parametrem.

Honza Marek
Člen | 1664
+
0
-

Očekával bych, že když požádám metodu getParameter o parametry, tak mi vrátí hodnoty, se kterýma si budu moct dělat co chci. Ne, že budu muset dávat pozor, abych je nedejbože neupravil, protože pak by se mi mohla rozbít celá aplikace.

Ondřej Mirtes
Člen | 1536
+
0
-

Honza +1. Je to WTF, čučeli jsme do toho v Mediu celé odpoledne.

VasekPurchart
Člen | 20
+
0
-

Akorát jsem slyšel, že tomu celé odpoledne říkali bug PHPčka ;)

No Vašek s presentery momentálně nic nedělá a minimálně přes prázdniny ještě těžko bude – vy jste neviděli Davidův plný kalendář? :)

hrach
Člen | 1834
+
0
-

No, a pak jsou tu jeste jine podobne problemy. Pokud mate v referenci v promenne, tak ji z nic dostanete unsetem a pak novym definovanim na null. Bohuzel toto nelze provadet na tridach dedenych od nette\object.

David Grudl
Nette Core | 8082
+
0
-

Unset a nová definice by už v aktuálním Nette\Object měla fungovat.

hrach
Člen | 1834
+
0
-

Jojo, videl sem, diky moc Davide :)