Tak to vypadá, že chyby, které mě nejvíce brzdily v tom, abych se začal věnovat uzpůsobení svého blogu na novou verzi Zend Frameworku by měli být opraveny. Takže jsem s tím pomalu začal, ale narazil jsem ještě na jednu dost nepříjemnou věc. Využíval jsem totiž nedokumentovaného chování dispatcheru pro pojmenování actions a příslušných view skriptů.
Jak jsem se před asi třemi měsíci zmiňoval, v Zend Frameworku 1.0.x se chovají actions které jsou pojmenovány v camelCase stylu trochu zvláštně. Vše jsem popsal v zde. V Zend Frameworku 1.5 se to se zavedením třídy Zend_Filter_Inflector a úpravy dispatcheru mění a svým způsobem dává do latě. Opravdu šlo o nedokumentované chování a trochu prsty v tom má i schizofrenie PHP jako takového. V PHP jsou funkce case insensitive (nezáleží na velikosti písma), ale většina ostatních věcí (zejména názvy proměnných) jsou case sensitive. Jak to tedy vlastně s těmi actions je a bude.
Předpokládejme jednoduchou routu /:controller/:action
. Název akce hraje důležitou roli, zejména na těchto místech
- v url
- v názvu action metody daného controlleru
- v názvu view skriptu pokud se používá viewRenderer (implicitně je zapnutý)
Pokud, se v url nachází oddělovač slov (implicitně '-' a '.') tak se si to dispatcher interně převede na camelCase. Takže pro url /index/print-article
se zavolá printArticleAction()
ve třídě IndexController.
Pokud se oddělovač slov v url nenachází, tak dispatcher interně převede název akce na malá písmena. Takže pro url /index/printArticle
se zavolá printarticleAction()
. A tady je oproti 1.0.x změna, nesmíme se spoléhat na
tu výše zmíněnou nezávislost názvů funkcí na velikosti písmen. Pokud tedy máme metodu pojmenovanou printArticleAction()
tak máme smůlu a dostaneme výjimku. Je to zařízeno fintou přes magickou metodu __call()
místo původního volání $this->$action()
.
Pak ale do hry vstoupí ještě viewRenderer a ten si dovodí název view skriptu od názvu action metody (nikoli tedy už od parametru v url!) tak, že camelCase se převede na verzi s oddělovači. Takže pro printArticleAction()
se bude hledat view skript print-article.phtml
a pro printarticleAction()
se bude hledat printarticle.phtml
.
Každopádně trochu viny na tom podle mě má i PHP samotné a jeho case insensitive u funkcí. Každopádně nejsem asi sám, kdo si naběhl a v manuálu o tom bude dost dlouhé povídání v části o migraci. Samotné PHP tak zavařilo i vývojářům frameworku , kteří asi kvůli množícím se stížnostem na chybu ve zpětné kompatibilitě zavedli do front controlleru příznak useCaseSensitiveAction
, který povoluje původní chování dispatcheru s tím, že se vyvolá poznámku o tom, že používáte nepodporovanou funkcionalitu.
Doporučení na závěr? Pořádně si příště číst manuál a teď to předělat všechno tak aby to vypadalo:
- v url takhle:
/index/print-article
- u action metody takhle:
printArticleAction()
- v názvu view skriptu takhle:
print-article.phtml
Komentáře (0)
Komentáře jsou uzavřeny.