[php] dopasowanie sciezek

0

potrzebuej zrobic cos takiego:

bedzie to taka funkcja, ktora jako parametr bedzie dostawac jakas sciezke, np: "/gdzies/kiedys/id/15"
i na podstawie jakiejs bazy bedzie zwracac inna sciezke po przeksztalceniu. przykladowa baza:

/uzytkownik/:id = /user/profile/:id
/uzytkownik/wiadomosci/:id = user/posts/:id
/wiadomosci/uzytkownik/:id/nowe = /posts/latest/user/:id

dane na wejsciu ─ dane na wyjsciu
/uzytkownik/15 ─ /user/profile/15
/uzytkownik/wiadomosci/20 ─ /user/posts/20
/wiadomosci/uzytkownik/30/nowe ─ /posts/latest/user/30

cos w ten desen...
zapewne jako pierwsze co przychdzi kazdemu do glowy, to wyrazenia regularne. niby tak najlatwiej, ale wole jakies optymalne rozwiazania.
bo jezeli taka baza jest duza, to sprawdzenie kazdej sciezki troche zajmuje czasu.

0

A czemu to ma służyc?

0

sprawieniu, zeby adresy URI byly bardziej przyjazne ;)

0

Nie możesz normalnie użyć mod_rewrite w .htaccess?
RewriteRule /uzytkownik/([0-9]+) = /user/profile/$1 [L]
itp

0

pisze systemik w modelu MVC... troche sie wzoruje na Zend.

generalnei wszystkie requesty ida do index.php - oczywiscie przez odpowiednie ustawienie w .htaccess
tam masz kontroler frontowy, ktory z adresu wyciage nazwe kontrolera i tworzy obiekt jego klasy. uruchamia funkcje o nazwie akcji i przekazuje jej jakies dodatkowe parametry.
tyle te kontrolery sa tworzne zgodnie z taka logika programowania a nie uzytkownia. np mam kontroler auth ktory ma akcje login i logout. ale dla uzytkownika jako adres do strony logowania chce dac po prostu:
http://serwer.pl/logowanie
zamist:
http://serwer.pl/auth/login
niby zadna roznica, ale zawsze to ladniej i takze przy indeksowaniu przez google jest przydatne.

0

Jednym słowem potrzebujesz zrobić coś takiego jak urls.py w Django ;-). I najłatwiej jest to naprawdę zrobić przy użyciu wyrażeń regularnych. Piszesz o czasie - akurat preg_match jest jednym z najszybszych rozwiązań i czasem jest szybszy niż normalne operacje na stringach w PHP.

http://uk.php.net/manual/pl/reference.pcre.pattern.modifiers.php -> spójrz też na przełącznik "S" (nie "s"!) - włącza optymalizację PCRE.

Spójrz w jaki sposób wygląda to we wspomnianym przeze mnie Django:

from django.conf.urls.defaults import *

urlpatterns = patterns('heygirl.views',
        (r'^hey/$', 'index'),
        (r'^nohey/$', 'innafunkcja')
)

W PHP również sobie można łatwo wyobrazić coś podobnego:

$urls = array("^logowanie$" => "auth/login", "^wylogowanie$" => "auth/logout");

Wystarczy następnie zamieniać nawet zgodnie z wyrażeniem regularnym i dalej traktować odwołanie "normalnie".

1 użytkowników online, w tym zalogowanych: 0, gości: 1