Роутер компонента

В предыдущей части мы написали контроллер компонента, умеющий выполнять три типа действий: view_all (показ списка сообщений), add (добавление сообщения), delete (удаление сообщений).

Как контроллер узнает какое из этих действий нужно выполнить в конкретный момент? Он смотрит в переменную $do, которую мы определили так:

    //...
 
    //Получаем текущее действие из URL страницы
    $do = $inCore->request('do', 'str', 'view_all');
 
    //...

Переменная $do берет свое значение из адреса страницы (т.е. передается контроллеру методом GET). Если в адресе ее значение не было указано, она принимает значение 'view_all'. То есть, если кто-то наберет в браузере адрес http://site/guestbook, он запустит наш компонент guestbook без каких-либо параметров. Соответственно переменная $do примет значение по-умолчанию – view_all – и мы увидим список всех сообщений гостевой книги.

Теперь разберемся с остальными адресами. Ранее мы договорились что у нас будет два адреса:

  • http://site/guestbook/add.html – для добавления сообщений (действие add контроллера)
  • http://site/guestbook/deleteXX.html – для удаления сообщений (действие delete контроллера), где XX должно будет преобразоваться в переменную $message_id

Нам нужно связать эти адреса страниц с действиями контроллера. Для этого используется роутер компонента.

Роутер представляет из себя файл router.php находящийся в папке компонента:

<?php
    function routes_guestbook(){
 
        $routes[] = array( /* маршрут 1 */ );
 
        $routes[] = array( /* маршрут 2 */ );
 
        return $routes;
 
    }

Внутри файла определяется функция routes_XXX(), где XXX - название компонента (в нашем случае это «guestbook»). Внутри функции заполняется массив $routes, содержащий маршруты. Каждый маршрут связывает URL страницы с действием контроллера. Для нашего контроллера потребуется 2 маршрута:

<?php
    function routes_guestbook(){
 
        //добавление сообщения
        $routes[] = array(
                            '_uri'  => '/^guestbook\/add.html$/i',
                            'do'    => 'add'
                         );
 
        //удаление сообщения
        $routes[] = array(
                            '_uri'  => '/^guestbook\/delete([0-9]+).html$/i',
                            'do'    => 'delete',
                            1       => 'message_id'
                         );
 
    }

Каждый элемент массива $routes тоже является массивом и может содержать следующие записи:

  1. _uri ⇒ регулярное выражение, с которым сравнивается адрес страницы (аналог первой части RewriteRule из .htaccess) - обязательный элемент
  2. параметр ⇒ значение (сколько угодно пар) - опционально
  3. номер сегмента ⇒ параметр (столько же пар, сколько пар круглых скобок в рег.выражении, аналог $1, $2 из .htaccess ) - опционально

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

После регулярного выражения идут указания – какие параметры передать контроллеру компонента если адрес совпадет с выражением. Например запись:

  'do'    => 'add'

означает что будет создана переменная do со значением 'add'. В коде контроллера мы получим это значение с помощью метода request('do') и узнаем, что требуется показать страницу добавления сообщения.

Второй маршрут (для удаления) подразумевает передачу в компонент еще и части адреса в виде переменной message_id. Взглянем еще раз на шаблон адреса для удаления сообщения:

  '_uri'  => '/^guestbook\/delete([0-9]+).html$/i'

обратите внимание на выражение в круглых скобках: ([0-9]+) и на строчку:

  1       => 'message_id'

буквально эту строку можно трактовать как «совпадение из первых круглых скобок нужно передать под именем message_id». Соответственно, если добавить еще одно выражение в круглых скобках в шаблон адреса, то его значение можно будет передать как:

  2       => 'second_var'

Больше примеров маршрутов вы можете посмотреть в файлах router.php стандартных компонентов InstantCMS.

Любые вопросы связанные с роутингом можно не стесняясь задавать на форуме.

Что дальше?

 
разработка/компоненты/роутер_компонента.txt · Последние изменения: 2011/09/25 21:14 От neochapay