Mirin webspace

Nejbohatší život má ten, kdo žije s minimem nároků

21. 2. 2008 Zend Framework

Ohýbání Zend Frameworku kvůli PHP

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.