Маршрутизация или как это называется...

Духовность™

Продвинутый новичок
Маршрутизация или как это называется...

Для понимания данного примера можно посетить http://adverts.ru/admin/user
ибо работает реальный пример на основе примера показанного ниже.

Вот так у меня запускается мой мега-супер-фреймворк:

index.php:
PHP:
<?php
if (empty($_REQUEST['_path']))
{
    $_REQUEST['_path'] = '/index';
}

require('./kernel/configuration.php');

// правила URL 
$map = array
(
    array( 'pattern' => '~^/admin/(user)/?$~', 
           'module' => 'User',
           'controller' => 'BackendMain',
           'aliases' => array('_module_alias'),
           'additional' => array('_controller_alias' => 'main'),
         ),
    array( 'pattern' => '~^/admin/(user)/(main)/?$~', 
           'module' => 'User',
           'controller' => 'BackendMain',
           'aliases' => array('_module_alias', '_controller_alias'),
         ),
    array( 'pattern' => '~^/admin/(user)/(edit)/?$~', 
           'module' => 'User',
           'controller' => 'BackendEdit',
           'aliases' => array('_module_alias', '_controller_alias'),
         ),
    array( 'pattern' => '~^/admin/(user)/(delete)/?$~', 
           'module' => 'User',
           'controller' => 'BackendDelete',
           'aliases' => array('_module_alias', '_controller_alias'),
         ),

    // Ajax - country, region, city
    array( 'pattern' => '~^/(ajax)/(country)/?$~', 
           'module' => 'Ajax',
           'controller' => 'Country',
           'aliases' => array('_module_alias', '_controller_alias'),
         ),
    array( 'pattern' => '~^/(ajax)/(region)/?$~', 
           'module' => 'Ajax',
           'controller' => 'Region',
           'aliases' => array('_module_alias', '_controller_alias'),
         ),
    array( 'pattern' => '~^/(ajax)/(city)/?$~', 
           'module' => 'Ajax',
           'controller' => 'City',
           'aliases' => array('_module_alias', '_controller_alias'),
         ),

);

try {
    $application = new Base_Application();
    $application->setMaps($map);
    $application->run();
} catch (Exception $e) {
   // ...
}
?>
Как видно, у меня есть карта всех существующих URL адресов (без учета Query_String). URL строятся стандартно: /модуль/контроллер/(другие возможные параметры идущие в скрипт)

Нельзя в систему добавить какую-то страницу, не прописав вот таким образом следующие элементы:
PHP:
array
( 
   // для URL /admin/user/?
   'pattern' => '~^/admin/(user)/?$~',
   // используется модуль User 
   'module' => 'User',
    // и контроллер под названием BackendMain
   'controller' => 'BackendMain',
   // переменная объекта Request  _module_alias будет 
   // иметь значение user - первое значение в скобках из паттерна URL.
   // можно сколь угодно назначить "алиасов", т.е. сколько значений в скобках - ()
   // столько и алиасов.  
   'aliases' => array('_module_alias'),
   // дополнительно создаем переменную объекта Request
   //  _controller_alias со значением main - это алиас контроллера 
   // алиасы нужны для построения URL в шаблонах...
   'additional' => array('_controller_alias' => 'main'),
),
Скажите, это хорошая практика вот так, через карты "создавать" виртуальные пути?

Аппликейшен пока сырой: http://adverts.ru/app.txt
 

HraKK

Мудак
Команда форума
посмотри как у меня сделано.

-~{}~ 18.03.10 02:06:

Кстати, не логичней не очищать хеадеры а ставить только когда надо?
 

Духовность™

Продвинутый новичок
посмотри как у меня сделано.
а где там именно, где роутеры?

Кстати, не логичней не очищать хеадеры а ставить только когда надо?
ну их тогда же придется ставить в каждом контроллере или выносить в общий метод это все. легче очистить хедеры - я это делаю на 404 ошибке и на аяксе
 

HraKK

Мудак
Команда форума
а где там именно, где роутеры?
да.

PHP:
 if (!$this->parseUrl())
            {
                $this->response->setHeader(null, 'HTTP/1.x 404 Not Found');

                $this->request->getRequest()->_module_name = '404';
                $this->request->getRequest()->_controller_name = '404';

                $controller_name = 'Module_404_Controller_404';
            }
            else
            {
        $this->response->setHeader('Content-type', 'text/html; charset=windows-1251');
        $this->response->setHeader('Content-Language', LANG);
        $this->response->setHeader('Expires', 'Mon, 26 Jul 2008 05:00:00 GMT');
        $this->response->setHeader('Last-Modified', gmdate("D, d M Y H:i:s")." GMT");
        $this->response->setHeader('Cache-Control', 'no-store, no-cache, must-revalidate');
        $this->response->setHeader('Pragma', 'no-cache');

                $controller_name = 'Module_'.$this->request->getRequest()->_module_name.
                                   '_Controller_'.$this->request->getRequest()->_controller_name;
            }
Разве?

-~{}~ 18.03.10 02:31:

Только давай я наверно тебе немного новее версию роутеров выложу, хотя смысл там не поменялося, а идею можешь и там посмотреть.
 

fixxxer

К.О.
Партнер клуба
Управление заголовками меня смущает. Что делать если конкретной вьюхе надо отдать скажем json?
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
triumvirat
имхо это не совсем удобно, потому как при очень разветвленном приложении (много контроллеров, роутеров и т.д.) у тебя будет громадный массив ненужных данных, которые в данном куске скрипта не нужны. Или я не прав.?..
 

Beavis

Banned
triumvirat
логичнее сделать стандартное для всех контроллеров/экшенов формирование урлов, а исключения уже прописывать такими картами
 

Духовность™

Продвинутый новичок
ну да, см. ссылку на аппликейшен

Что делать если конкретной вьюхе надо отдать скажем json?
Hrakk прав.
PHP:
<?php
class Module_Ajax_Controller_Common extends Base_Controller
{
    protected $view_class_name = 'Module_Ajax_View_Default';

    public function run()
    {
        $this->response->clearHeaders();
    }
}
?>

и потомок:

<?php
class Module_Ajax_Controller_City extends Module_Ajax_Controller_Common
{
    public function run()
    {
        parent::run();

        $this->response->setHeader('Content-type', 'text/plain; charset=windows-1251');

        $this->view = $this->createView('JsonList');    // JsonList - имя шаблона

        $User_City_Mapper = new Module_User_Mapper_City();
        $this->view->xmlData = $User_City_Mapper->getArrayListForHtmlSelect($this->request->getRequest()->id);
    }
}
?>
при очень разветвленном приложении (много контроллеров, роутеров и т.д.) у тебя будет громадный массив ненужных данных, которые в данном куске скрипта не нужны
ну да, поэтому я и спросил как быть. Он не "не нужны", просто из всего массива карт URL адресов ищется совпадение с текущим QS.

Beavis
ок подумаю
 

HraKK

Мудак
Команда форума
triumvirat
Что думаешь насчет моей реалиации?
 
Сверху