Külső források:
Hogyan hozzuk ki a legtöbbet a Router-ből
A Cakeben a router felelős azért, hogy URL-t a dispatcher számára értelmezhető formára hozza: melyik controller melyik action-ét kell éppen futtatni. 1.1 alatt ennyi az egész, viszont 1.2 alatt másképpen is tud operálni – tömb formájában is megadhatók a rendszer számára a szükséges paraméterek, valamint azt is megmondja, mely URL-ek megfelelők. A Cake összes URL használó/generáló metódusa (a requestAction kivételével) ehhez van kapcsolva. A továbbiakban arról lesz szó, hogyan tudjuk ezt az új funkciót használni.
Kezdjük az elején
Ha nem használsz saját útvonalakat, az alábbi kód ismerős lesz:
echo $html->link('this is a post with id 1',"/Post/view/1");
Semmi probléma nincs a fenti kóddal, különösen, ha még nem ismerjük a cake varázslatos lehetőségeit e téren. Ekkor jó ötlet, ha a fenti módon, string-ként adjuk meg az URL-eket és a dolgok egyszerűen működni fognak. Ha mindenhol ebben a formájában írjuk le az URL-eket, különösen, ha általános element-ben is szerepel, meg lehet próbálni az alábbi formát is:
echo $html->link('this is a post with id 1',"/".$this->name."/view/1");
Még egyszer, semmi gond nincs a fenti kóddal, ezzel egy lépéssel közelebb kerültünk egy általánosabb kódhoz, ami általában jó dolog. Ha különösen vakmerő vagy, lehetséges, hogy az alábbihoz hasonló kis kódot használsz a lehető legtöbb helyen az alkalmazásodban:
// Controller függvény része, mely az aktuális index-hez irányít $url = isset($this->params[CAKE_ADMIN])?'/'.CAKE_ADMIN:''; $url .= $this->plugin?'/'.$this->plugin:''; $url .= '/'.$this->name; return $this->redirect($url);
Még egyszer, semmi baj a fenti kóddal; ha ehhez hasonlót használsz 1.1 alatt, akkor a lehető legtöbbet hoztad ki a rendszerből. Az egyetlen probléma a fenti kódolási formával, hogy előre megszabod a kódban, hogy az URL-jeid hogyan nézhetnek ki. Ha nem használsz saját URL-eket, akkor ennek nem sok jelentősége van, viszont ha igen, akkor mindez problémás lehet. Például vess egy pillantást az eredeti post URL-jére (“/MiBlog/MakingTheMostOfTheRouter”). Ez saját útvonalat használ, melynek a stílusát és a logikáját a saját routes fileomban definiáltam. String URL-ek használata itt azt jelenti, hogy az URL kezelési logika duplikálva van mindenütt ebben a plugin-ban. Ha megvan pontosan ez a kód nálad local-ban, de nincsenek meg pontosan ugyanezek az útvonalak: az alkalmazás egyszerűen nem fog működni. Tehát hogyan tud ezen segíteni a router…
1.2 – Router on steroids
Ahogy említettem, és ahogy tudhatod, 1.2 alatt tömbökkel is megadható az URL bárhol a kódban. A tömb kulcsai az alábbiak szerint lettek definiálva:
- CAKE_ADMIN
- plugin
- controller
- action
- + bármi, amit szeretnél
‘Normál’ kulcsok esetén, ha nem definiáltad, az aktuális (alapértelmezett???) értéket használatja a rendszer. Vess egy pillantást az alábbi példákra:
// Részletes definíció:
echo $html->link('this is a post with id 1',array(
'controller'=>'Post',
'action''=>'view',
1
));
// Post controller-ben
echo $html->link('this is a post with id 1',array(
'action'=>'view',
1
));
// Post controller view action esetén
echo $html->link('this is a post with id 1',array(1));
// Teljes definíció (szükséges, ha admin függvényben vagy pluginben vagy)
echo $html->link('this is a post with id 1',array(
CAKE_ADMIN=>false,
'plugin'=>false,
'controller'=>'Post',
'action'=>'view',
1
));
A fenti példákban az az érdekes, hogy nem kell mindent kiírni – sosem lesz szükséged többé ‘controller’=>$this->name vagy ‘plugin’=>$this->plugin típusú értékekere, mert alapesetben pontosan ez történik. A tisztánlátás érdekében az alábbi két példa pontosan ugyanazt csinálja:
// Controller függvény része, mely az aktuális index-hez irányít // Terjengős, szükségtelen definíció: $url = array( CAKE_ADMIN=>isset($this->params[CAKE_ADMIN])?CAKE_ADMIN:false; 'plugin'=>$this->plugin?$this->plugin:false; 'controller'=>$this->name, 'action'=>'index' ); return $this->redirect($url); // Ugorj az index-hez! $url = array( 'action'=>'index' ); return $this->redirect($url);
És mit jelent mindez… ?
So apart from meaning you can write arrays instead of strings all over the place what does that mean to you? Let’s say that you just ran through the blog tutorial (and converted where appropriate the code used to be 1.2 style), or downloaded some code which made use of array urls everywhere. In addition it’s setup to use Slugs. So somewhere in the code the below link is present:
echo $html->link('Valami izgi',array('action'=>'view','ValamiIzgi');
With a default install, it will display a link to the url “/Posts/view/SomethingInteresting”. If you decide that you want your urls to look like “/Posts/SomethingInteresting” or “/Noticias/SomethingInteresting” or “Anything/At/All/SomethingIntersting” – if you define a route to do that cake will understand which controller to use when the url is used and generate urls/links which point to your chosen url ’scheme’ wherever in your code you used an array to define the url.
Végszó
A router cake 1.2 alatt a saját útvonal definíciódat használja annak eldöntésére, hogy a kapott URL-ből melyik controller/action kombinációt kell meghívni. Ez egy egyszerű és következetes használata a saját útvonalaknak annélkül, hogy duplikálnánk a logikát vagy feltételezésekkel élnénk az URL-ekkel kapcsolatban.
Bake on!