Mirin webspace

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

19. 12. 2007 Zend Framework PHP

Uchovávání a manipulace s URL

Pokud používáte Zend Framework MVC, tak pomocí routeru určujete, na jakou action metodu určitého controlleru se požadavek, který jde na dané URL přepojí. Ve výstupech (views) pak pravděpodobně získáváte URL nějakým způsobem zpět. Buď můžete URL psát natvrdo, nebo využít flexibilnější metodu a použít view helperu Zend_View_Helper_Url. Na něm mě ale vadí jednak určitá ukecanost použití - musíte mu nacpat dost velké asociativní pole jako parametr a navíc je to jen view helper, s obtížemi se používá v jinde než ve views.

Další věc, co mě chyběla, je jasná definice parametrů a vůbec tvarů URL. Částečně to jde řešit definicí routeru přes config, ale to mě příliš nevyhovuje, raději si router inicializuji v kódu v aplikační třídě. Napsal jsem si tedy vlastní řešení, které využívá XML soubor jako zdroj všech URL v aplikaci.

XML jsem zvolil, protože struktura URL je hierarchická a pro takovou reprezentaci mě přišlo XML jako ideální. Struktura souboru s definicí URL pro aplikaci může vypadat například takto.


<?xml version="1.0"?>
<linkmap>
 <link url="">
  <name>main</name>
  <links>

   <link url="/about">
    <name>about</name>
   </link>

   <link url="/projects">
    <name>projectList</name>
    <links>
     <link url="/view/:projectName">
      <name>projectDetail</name>
     </link>
    </links>
   </link>

  </links>
 </link>
</linkmap>

V tagu link se nachází část URL, která se vztahuje k aktuální hierarchii v URL. Tag name je něco jako identifikátor daného URL. Používám to tak, aby identifikátory byly jedinečné pro celý XML soubor, ale není to nutné, viz dále.

V url parametru tagu link se nachází i parametry uvozené dvojtečkou, za ně se bude dosazovat nějaká konkrétní hodnota až při použití.

Mám napsanou třídu UrlEasyGet, od které v každé své aplikaci odvodím potomka, například AppUrlEnum. UrlEasyGet implementuje metodu __get která jako parametr dostane to, co se nachází v tagu name a vrátí příslušné URL, které postupně vzniká při procházení hierarchií. Odvozená třída pak obsahuje hlavně metody, které zajišťují nastavovaní hodnot pro parametry uvozené dvojtečkou. K url se je možné dostat i přes cestu složenou hierarchicky ze jmen v parametrech name, v našem případě tedy /main/projectList/projectDetail ale nepoužívám to, raději mám jednoznačné identifikátory. Pro rozsáhlejší XML se ale tyto symbolické cesty hodí, i když pak je to vlastně nahrazení jednoho URL druhým. Příklad použití pro jednoznačné identifikátory:


//project - our domain object
$project=new Project();

//url storage 
$urlEnum=AppUrlEnum::getInstance();

//set parameters, which are in the URL prefixed with a colon
$urlEnum->setProjectName($project->getName());

//in this variable, we have unique URL for our project, 
//we used the overloaded member access with __get()
$currentProjetUrl=$urlEnum->projectDetail;

U tohoto blogu jsem použil jedinou třídu v celé aplikace, je samozřejmě možné mít i více tříd a XML souborů s definicemi, třeba pro každý controller nebo modul, záleží asi na složitosti aplikace. Stejně tak není třeba mít třídu jako singleton, pokud je ale jen jedna pro celou aplikaci, tak se to nabízí.

Třídu používám jak ve view, tak v controllerech. Docela jsem si na její použití zvykl, mám tak URL na jednom místě a při použití identifikátorů to i dost ušetří. Pokud chci nějak změnit tvar URL, není to až tolik změn, jako kdyby se to dělalo ručně. Základní nevýhoda je, že je nutné ručně synchronizovat definice v XML a nastavení routeru. Možná by to šlo nějak řešit, ale zatím to odkládám.

Příští článek bude obsahovat link na stažení aplikace tohoto webu založené na Zend Frameworku a pár poznámek, bude to lepší, než sem jen plácnout zdrojové kódy.


Komentáře (0)

Komentáře jsou uzavřeny.