Автор Тема: Автоматична детекция на релативно URL - MVC  (Прочетена 1536 пъти)

b2l

  • Напреднали
  • *****
  • Публикации: 4786
  • Distribution: MCC Interim
  • Window Manager: - // - // -
  • ...sometimes I feel like screaming... || RTFM!
    • Профил
    • WWW
Написах си един рутер, който има за цел да ми създава инстанция на обект от клас подаден по URL-то. Например: http://host/controller/method/arguments.
Е то всичкото добре обаче аз си бачкам на Localhost-а като съм си едитнал default сайта да ми е сочи към: /var/www/project/, но ме накараха да го оставя както си е по default (/var/www) и проекта да си го зарежда като: http://host/project/. При което моя рутер гръмна. Логиката която бях вкарал беше следната:
Код
GeSHi (PHP):
  1. ...
  2. $url = explode('/', trim($_SERVER['REQUEST_URI'], '/'));
  3.        array_shift($url);
  4.  
  5.        // get controller name
  6.        if (empty($url[0])) {
  7.            $controller = //some php code here
  8.        } else {
  9.            $controller = //another php code here
  10.        }
  11.  
  12.        // get method name of controller
  13.        if (empty($url[1])){
  14.            $method = 'indexAction';
  15.        } else {
  16.            $method = $url[1] . 'Action';
  17.        }
  18.  
  19.        //get arguments
  20.        //and so on
  21.  
  22.        $cont = new $controller;
  23.        $cont->$method($arguments);
И както с сещате за да проработи рутера ми трябваше да сменям индексите на масива, което не ми хареса. Ако тестовия проект е в: /var/www/site/test/project/ver1.0/ - то тогава мамата си трака.
Някаква идея или решение на този казус.

PS: Дефинирах си RELATIVE_URL променлива, която в момента ми е равна на SITE_ROOT . '/project' - ама проблема ми с масива и цепенето на request string-а си остава.
« Последна редакция: Feb 17, 2012, 13:11 от b2l »
Активен

"Човекът е въже, опънато между звяра и свръхчовека, въже над пропаст. Човекът е нещо, което трябва да бъде превъзмогнато." - Фр. Ницше

VladSun

  • Moderator
  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
mod_rewrite?
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

b2l

  • Напреднали
  • *****
  • Публикации: 4786
  • Distribution: MCC Interim
  • Window Manager: - // - // -
  • ...sometimes I feel like screaming... || RTFM!
    • Профил
    • WWW
Не, не. В момента използвам рутера на opencart. Да, има запис и в .htaccess-а, ама целта на заданието ми беше да си напиша мой рутер, не да взимам на готово.

PS: А това, което съм написал по-долу е бъгаво.
Активен

"Човекът е въже, опънато между звяра и свръхчовека, въже над пропаст. Човекът е нещо, което трябва да бъде превъзмогнато." - Фр. Ницше

SmashThePain

  • Напреднали
  • *****
  • Публикации: 21
    • Профил
Не виждам смисъл да преоткриваш топлата вода :)
Ако все пак държиш да го правиш, след като сплитнеш URL-а се движи отзад напред. HTTP протокола има достатъчно удобен начин за предаване на параметри. Тази част arguments от адреса е напълно излишна. Аргументите предполагат променлив брой, понякога въобще може да ги няма. Това само ще ти усложни парсването.

Ако масивът има само един елемент ползваш дифолъен контролер и метод.
Ако масивът е с два елемента последния е контролера.
При 3 или повече елементи. Взимаш последните два и дерзаеш.

Този shift е тежка и безмислена операция.

Преди време правих рутер за Node.js Стратегията ми беше следната. Регистрирам обект за определен URL. Структурата беше хеш таблица. При рикуестване на URL проверявах дали имам слушател. Ако имам извиквам `index` метода му.
Ако нямам, рутера връщаше 404.
Активен

teleport

  • Напреднали
  • *****
  • Публикации: 134
    • Профил
Вместо $_SERVER['REQUEST_URI'] ползвай $_SERVER['PATH_INFO'].

Активен