Persistentní parametry mohou být zcela neočekávaně přepsány
- Honza Marek
- Člen | 1664
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
Nenapadá mně jak. Zařadil bych to do kategorie „je potřeba zrefaktorovat presentery“. Btw, co Vašek?
- Honza Marek
- Člen | 1664
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
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
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.
- VasekPurchart
- Člen | 20
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ář? :)