(pseudo)inteligentny router?

11 lipca 2007

Wiem, że powinienem w tym czasie zamiast bawić się w PHP rozwijać te kilka ważnych projektów w C++, ale doszedłem do wniosku, ze poświęcę jeszcze trochę czasu na uporządkowanie kilku spraw i projektów. A potem zabrać się za komunikatora ;)

Notatka nie będzie dotyczyć zabaw z typowym routerem, mowa tu o komponencie/module frameworka odpowiedzialnym za obsługę żądań (requestów) i spraw związanych z generowaniem linków.
Może nie jest to typowe, modelowe zadanie routera, tak czy owak w moim małym, skromnym frameworku spełnia takie funkcje ;)

Właśnie kończę implementacje odpowiedzialna za parsowanie requesta i wyciągnie odpowiednich danych o kontrolerze akcji i dodatkowych parametrach.

Wcale ten router nie jest taki inteligentny jak może sugerować tytuł, jest on trochę ironiczny :P

Jednym z głównych założeń routera było zbliżone działanie do tego z CodeIgnitera, a mianowicie możliwość „inteligentnego odpalania” kontrolerów z subf-olderów z nieco większa elastyczność niż rozwiązanie zastosowane w CI. Tam (chyba) tylko kontroler mógł być zagnieżdżony o 1 poziom w sub-folderze względem głównego folderu zawierającego kontrolery.
Ja u siebie nie chciałem się ograniczać jednym poziomem - chcę mieć nieograniczoną możliwość zagnieżdżania folderów w dół.

Dla pliku ustaliłem większy priorytet niż dla katalogu, tak, więc może kilka przykładów, które rozjaśnia zasady działania mojej implementacji.

Przy okazji, z ostatniego członu requesta będzie wycinane .html, jeśli takowe się tam znajdzie.

Mamy requesta:

http://domena.com/foo/bar/param.html

Jaka zostanie odpalona akcja, z którego kontrolera i z jakimi parametrami?
Zależy to od struktury i rozmieszczenia pliku kontrolera, rozważmy kilka przypadków:

  1. W głównym katalogu kontrolerów istniej plik foo.php, tak wiec, wywołana zostanie akcja bar z parametrami param kontrolera foo.
  2. W katalogu foo/ istnieje plik bar.php z definicja kontrolera.
    W tym wypadku użyty zostanie kontroler bar znajdujący się w sub-folderze foo, a akcją będzie metoda param.
  3. Połączenie 1 i 2, czyli istnieją pliki i foldery według 1 i 2 przypadku.
    Oczywiście wynik będzie taki jak w przypadku 1. Jak wspomniałem plik ma większy priorytet niż katalog ;)
  4. Istnieją katalogi według ścieżki foo/bar/ ale bez żadnych odpowiednich plików.
    Router w tym przypadku ustawia jako kontroler – domyślny kontroler (index) znajdujący się w folderze foo/bar/, a jako akcje – param.

W przypadku requesta:

http://domena.com/foo.html

Router jeśli znajdzie plik kontrolera foo, to wywoła metodę domyślną (index) tego kontrolera. Jeśli nie znajdzie pliku, a będzie istniał katalog foo/ to wywoła domyślną akcje domyślnego kontrolera z tego katalogu.

Ja bym chciał na przykład w takim przypadku, aby została wywołana domyślna akcja z parametrem foo domyślnego kontrolera.
Wpadłem wiec na pomysł, aby dodać do kontrolera dodatkową właściwość.
I zależnie od jej wartości, jeśli w danym kontrolerze nie zostanie znaleziona szukana akcja, to zostanie przyjęta domyślna akcja z parametrem. Oczywiście parametr ten byłby ustawiany w czasie projektowania (a może i nie tylko) danego kontrolera i miałby widoczność lokalna ;)

Pozostaje jeszcze kwestia filtrowania requesta pod katem „złych/niebezpiecznych” znaków ;)

Pewnie niektórym nie spodoba się takie podejście i rozwiązanie, ale w końcu to będzie mój framework, prosty framework (bez dzielenia 4 funkcji na 40 klas i rozrzucania po 10 folderach!), z którego głównie pewnie tylko ja będę korzystał, więc powinien spełniać jak najbardziej moje potrzeby i ułatwiać mi prace ;)

Podobne notatki:

Może zainteresują Cię również następujące, pododbne notatki:

Komentarze i nawiązania (5)

Kanał RSS komentarzy

  1. ja tam chetnie sobie go obejrze jak skonczysz :D

  2. Ciekawe :) Mógłbym troszkę sobie podkraść pomysł ;)? Z tym zagnieżdżaniem :-), bo to naprawdę ciekawy pomysł :) Przydałby mi się np. do budowy ACP ;) ?

  3. Widze kolega tez preferuje swoje : ) Podobnie jak ja : ) I zgadzam sie z ostatnim akapitem dotyczacym prostoty – nie znosze przerostu formy na trescia ; ) Pzdr

  4. Ciekawe, dość podobną funkcjonalność w zbliżony sposób implementuję w moim frameworku, tyle że tam posługuję się formatem katalog/katalog/…/klasa/metoda, przy czym katalogi są opcjonalne, a ich zagłębienie nieograniczone. Po za tym wszystko działa na Ajaksie ;-)

    Zerknij, jeśli jesteś zainteresowany: http://tigermouse.epsi.pl

  5. [...] o moim projekcie małego, prostego i wydajnego frama, o którym pojawiły się kiedyś dwie notki: (pseudo)inteligentny router? i Fowardowanie [...]

Dodaj swój komentarz

Możesz użyć tych tagów XHTML-a: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Jeśli chcesz wstawić kilku linijkowy fragment kodu, użyj tagów <pre lang="x"></pre> (gdzie x język kodu np. cpp, perl, html). W ten sposób kod zostanie odpowiednio sformatowany i pokolorowany przez system.

Uwaga!

Na tym blogu działa system cache oraz filtr antyspamowy. Twój komentarz może być widoczny na stronie z pewnym opóźnieniem. Proszę o cierpliwość. Jeśli utraciłeś już wszystkie jej zasoby poinformuj mnie o tym, być może system uznał Cię za spamera ;)