In acest articol vom analiza una din cele mai importante clase pe care framework-ul CodeIgniter ni le pune la dispozitie: clasa URI. Clasa URI ne pune la dispozitie functii care ne permit sa citim parametrii trimisi prin browser.
De fapt, folosim aceasta clasa de fiecare data cand facem un apel prin CodeIgniter. Dupa cum am explicat intr-un articol anterior, CodeIgniter trateaza tot ce apare in URL dupa index.php, ca fiind un parametru.
Astfel, daca avem un url de forma http://localhost/codeigniter/index.php/test/main
, CodeIgniter va stii ca test
este controller-ul apelat, iar main
este functia pe care vrem sa o apelam.
Dar ce facem atunci cand vrem trimitem mai multi parametrii catre controller? Cum ii citim? Aici intervin functiile suplimentare din clasa URI. Ne putem folosi de acestea pentru a citi parametrii trimisi din browser.
Vom folosi un URL de forma http://localhost/codeigniter/index.php/main/run/123/4
. Vom considera ca primul parametru dupa run
este id
, iar al doi-lea este categoryId
. Astfel, vom citi parametrii cu ajutorul urmatorului cod:
<?php class Main extends Controller { function Main() { parent::Controller(); } function index() { // Cod care ruleaza implicit } function run() { $id = $this->uri->segment(3); $categoryId = $this->uri->segment(4); printf("id: %s <br /> categoryId: %s", $id, $categoryId); } } ?>
Ne intereseaza codul din functia run()
. Acolo incarcam variabila $id
cu parametrul al trei-lea din URL si categoryId
cu parametrul al patru-lea. Functia printf()
este doar ca sa avem o reprezentare vizuala la ceea ce am facut acolo. Rezultatul va fi:
id: 123 categoryId: 4
Pentru un plus de control, putem sa adaugam un al doi-lea parametru (optional) functiei segment()
. Acesta specifica ce valoare intoarca functia daca segmentul nu exista. Codul va arata asa:
function run() { $id = $this->uri->segment(3, 0); $categoryId = $this->uri->segment(4, 1); printf("id: %s <br /> categoryId: %s", $id, $categoryId); }
Codul de mai sus se va comporta in felul urmator: atunci cand segmentele sunt definite $id
va fi egal cu 123 si $categoryId
cu 4. Atunci cand ele nu exista, $id
va fi egal cu 0, iar $categoryId
va fi egal cu 1.
Pana acum totul a fost bine. Asta pentru ca stim cu ce lucram si stim ca parametrul 3 este id si parametrul 4 categoryId. Ce facem in schimb daca vrem sa lucram cu date ceva mai bine structurate?
Pentru asta vom lucra cu URL un pic diferit. Acesta va fi de forma: http://localhost/codeigniter/index.php/main/run/id/123/categoryId/4
.
function run() { $assoc = $this->uri->uri_to_assoc(3); print_r($assoc); }
Dupa cum puteti vedea, nu am mai folosit functia segment()
. In schimb, cu ajutorul functiei uri_to_assoc()
obtinem un array asociativ in care fiecare parametru impar este considerat cheie, iar fiecare parametru par este valoarea.
Se poate observa ca functia uri_to_assoc()
ia un parametru cu valoarea 3. Parametrul reprezinta index-ul de la care functia incepe sa contruiasca array-ul asociativ. Valoarea sa implicita este 3 pentru ca, de obicei, se stie ca primii doi parametrii sunt controller-ul si functia apelata.
Mai simplu, codul de mai sus va afisa in browser asa ceva:
Array( [id] => 123, [categoryId] => 4 )
Daca in loc de 3, functia uri_to_assoc()
ar fi primit parametru cu valoarea 2, rezultatul ar fi aratat asa:
Array( [run] => "id", [123] => "categoryId" )
Poate vrem sa vedem toate segmentele care au fost trimise prin URL, dar nu vrem sa ne batem capul cu array-uri asociative. Nimic mai simplu. Folositi codul de mai jos:
function run() { $nonAssoc = $this->uri->segment_array(); print_r($nonAssoc); }
Rezultatul acestul cod va arata asa:
Array( [1] => "main", [2] => "run", [3] => "id", [4] = > 123, [5] => "categoryId", [6] => 4 )
Am sa va mai arat o functie din aceasta clasa, care mie mi-a placut foarte mult. Este pe cat de simpla, pe atat de utila. Sa presupunem ca avem un URL care a fost creat dinamic si vrem sa validam faptul ca toate segmentele au fost construite.
Putem, bineinteles, sa folosim functia segment_array()
si sa numaram elementele rezultate, dar nu este cea mai eleganta solutie. In schimb, CodeIgniter ne pune la dispozitie functia total_segments()
care intoarce (in mod previzibil) numarul total de segmente care compun URI-ul.
Se da codul:
function run() { $segments = $this->uri->total_segments(); print_r($segments); }
Rezultatul printat in browser, va fi 6. Asta avand in vedere URL-ul pe care am lucrat pana acum.
Clasa URI pune la dispozitie multe alte functii care pot fi utile in functie de ceea ce incercam sa implementam. Pentru documentatia completa asupra clasei, puteti urma acest link.
Ca de obicei, va astept cu pareri, probleme, sau imbunatatiri asupra codului. De asemenea, va incurajez sa folositi cu incredere formularul de comentarii din pagina Propune un articol.