0%

No comments 4877 views

Beugró bejegyzésként remek téma, melyben azt mutatom meg, hogy én mivel oldom meg az url útvonalak kezelését. Akarom mondani hogyan nem, ugyanis én simán csak .htaccess használatával szoktam. :) Minden esetre e bejegyzésben PHP alapú kezelésről lesz szó. Nem is ragozom tovább, van egy-két hasznos függvényem a témában és most ezt tenném közszemlére.

Lássuk először az alap .htaccess fájlt, melyhez különösebb magyarázatot nem fogok adni, szóval feltételezem, aki ezt olvassa nagyjából érteni is fogja.

.htaccess

<IfModule mod_rewrite.c>
    
	RewriteEngine On
	
	RewriteCond %{REQUEST_FILENAME} !favicon.ico
	RewriteCond %{REQUEST_FILENAME} !-d
	RewriteCond %{REQUEST_FILENAME} !-f
	RewriteRule ^(.*)$ index.php?uri=$1 [QSA]
	
</IfModule>

Ezzel a .htaccess-el meg is volnánk. A következő lépésben a függvényeket mutatnám be.

/*
* url útvonal beállítás
* bementi típus: string (ha nincs bemeneti érték, akkor alapértelmezett a $_SERVER["REQUEST_URI"] érték)
*/
route_url( [ string $request_url = null ] )

/*
* a függvény letárolja a route_regex() és route() függvények eredményét
* bementi típus: boolean (alapértelmezettként tárol, ha a bement FALSE, akkor nincs tárolás)
*/
route_store_result( [ bool $disable = null ] )

/*
* Útvonal ellenőrzése
* ha az url illeszkedik a $pattern-ben megadott reguláris kifejezésekhez, akkor a $callback-ben definiált függvény/vagy osztály meghívást kap
* $pattern: lehet reguláris kifejezés mint string és lehet tömb
* $callbak: lehet function vagy osztály név (classname)
* $strict: TRUE/FALSE, ha true akkor összehasonlítja az url részeinek számát a megadott reguláris kifejezések számával
* return: ha az ellenőrzés sikeres, akkor a visszatérési érték az útvonal (object). Ellenkező esetben false
*/
route_regex( string/array $pattern [, string/function $callback = null [, bool $strict = false ]] )

/*
* Útvonal ellenőrzése (nem reguláris kifejezésekkel)
* $mode: lehet POST vagy GET
* $pattern: minta (erről később)
* $callbak: lehet function vagy osztály név (classname)
* $strict: TRUE/FALSE, ha true akkor összehasonlítja az url részeinek számát a megadott kifejezések számával
* return: ha az ellenőrzés sikeres, akkor a visszatérési érték az útvonal (object). Ellenkező esetben false
*/
route( string $mode, string $pattern [, string/function $callback = null [, $strict = false ]] )

/*
* Útvonal ellenőrzése, lásd: route()
*/
get( string $pattern [, string/function $callback = null [, $strict = false ]] )
post( string $pattern [, string/function $callback = null [, $strict = false ]] )

Most, hogy végére értem a függvényeknek lássunk valami REGEX-es példát, miként is működik az egész. A hagyományos verzió is hasonlóképpen üzemel, így azt külön nem fogom bemutatni, de kitérek a minta használatára. A cikk alján letölthető csatolmány tartalmazza az ehhez szükséges példákat.

route_regex()

<?php
require "route.php";

	class Test {
		
		function __construct(){
			echo "called class: TEST\n";
		}
		
	}
	
	function funcTest(){
		echo "called func: TEST\n";
	}

// set example url
route_url( "/blog/postid_or_aliasname" );

	echo "Test 1: ";
	route_regex(array("/(?<section>(.*))/", "/(?<id>[a-zA-Z0-9_-]+)/"), function($param){
		print_r($param);
		echo "OK\n";
	});

	echo "Test 2 (recall and call Test): ";
	if ($param = route_regex(array("/(?<section>(.*))/", "/(?<id>[a-zA-Z0-9_-]+)/"), "Test")){
		print_r($param);
		echo "OK\n";
	}

	echo "Test 3: ";
	if (route_regex(array("/blog/", "/(?<id>[a-zA-Z0-9_-]+)/"), "funcTest")){
		echo "Ok\n";
	}

?>

route(), get() és post()

Végül, de nem utolsó sorban jöjjön a hagyományos url ellenőrző funkció, ami azok kedvérevaló lehet, akik kevésbé szeretik a reguláris kifejezéseket vagy éppen nem tudják használni. Én személy szerint inkább a másikat ajánlom, mert a kód végrehajtása valószínűleg gyorsabb is és több lehetőség rejlik benne a reguláris kifejezéseknek köszönhetően. Ugyan akkor van egy dolog, amiben a hagyományos többet tud, mint a REGEX verzió, az nem más, mint a $_POST adatok ellenőrzése. Ezt a cikk végén mutatom be. No, lássuk is miről van szó.

Minta

  • ket fő részből áll, a ? előtti és utáni részből (ez csak a POST mód és post() függvénynél használható)
  • a két fő részen bellül minden egyes mintát a / karakterrel tudjuk elválasztani
  • az egyes mintákat szögletes zárójelbe kell tennünk, pl: [ ... ]/[ ... ] ..

Típusok lehetnek

  • s: string
  • i: integer
  • d: float/double
  • *: bármi
  • vagy a kívánt találat értéke lehet string. pl: home
  • ezen kívül megadható VAGY kapcsolatként is. pl: [ param1|param2 ... ]

Karakterhossz

  • egyenlő 6 - [type{6}]
  • nagyobb vagy egyenlő 4 - [type{4,}]
  • kisebb vagy egyenlő 9 - [type{,9}]
  • nagyobb vagy egyenlő 3 és nem nagyobb mint 8 - [type{3,8}]

Elnevezés

  • :-t karakter után megadott név lesz az azonosító neve: [type({x,y}):name]
route_url( "/blog/2015/04/postid_or_aliasname" )

// vagy/or
route_url( "/article/2015/04/101" )

// minta/pattern
route( ... , "[blog|*{4,10}:section]/[i{4}:year]/[i{2}:month]/[si{1,}:id]", ... )

Ahol:

  • A blog|* egy VAGY kapcsolatot definiál, tehát blog vagy * bármi és mindkettőnek legalább 4 karakterből, maximum 10 karakterből kell állnia. A :section rész mondja meg, hogy a találat neve section legyen
  • A i{4}:year rész számot kér melynek hossza 4 számjegy és neve year
  • A i{2}:month szinte az előzőhöz hasonló, viszont itt csak 2 számjegy lehet
  • Az si{1,}:id pedig s mint string és i mint integer típust keres melynek minimális hossza 1 karakter vagy számjegy és elnevezése id

post() és POST mód

post( "[submit:submit]/[*:form_type]?[i:id]/[s:action]/[*:content]/[*:title]", ... )
// vagy/or
route( "POST", "[submit:submit]/[*:form_type]?[i:id]/[s:action]/[*:content]/[*:title]", ... )

post( "[i:id]/[s:action]/[*{10,}:content]/[*{4,}:title]", ... )

Mint ahogyan fentebb látjuk a post() függvény esetén, ha a minta nem tartalmaz ? jelet, akkor értelem szerűen a $_POST változó adatait ellenőrizhetjük. Ha pedig tartalmaz, akkor a ? jel előtti rész utal az url-re utóbbi pedig a $_POST változóra.

A működésben csak annyi eltérés van, hogy a :name rész itt kötelező és nem az elnevezést szolgálja, hanem a $_POST tömb elemeinek azonosítója. Tehát, ha [*{10,}:content] akkor a $_POST["content"] kerül ellenőrzésre.

  • 2024

Article

Url routing egyszerűen Php-vel