CakeFest 2024: The Official CakePHP Conference

Класс Yaf_Router

(Yaf >=1.0.0)

Введение

Yaf_Router - это стандартный каркасный маршрутизатор. Маршрутизация - это процесс получения конечной точки URI (той части URI, которая идёт после базового URI: смотрите Yaf_Request_Abstract::setBaseUri()) и разложение её на параметры, чтобы определить, какой модуль, контроллер и действие должны получить запрос. Эти значения модуля, контроллера, действия и других параметров упакованы в объект Yaf_Request_Abstract, который затем обрабатывается Yaf_Dispatcher. Маршрутизация происходит только один раз: при первоначальном получении запроса и до отправки первого контроллера. Yaf_Router предназначен для обеспечения функциональности, подобной mod_rewrite, с использованием чистых структур PHP. Он основан на маршрутизации Ruby on Rails и не требует каких-либо предварительных знаний о перезаписи URL веб-сервера. Он предназначен для работы с одним правилом Apache mod_rewrite (одним из):

Пример #1 Правило перезаписи для Apache

RewriteEngine on
RewriteRule !\.(js|ico|gif|jpg|png|css|html)$ index.php
или (предпочтительнее):

Пример #2 Правило перезаписи для Apache

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]
При использовании Lighttpd используйте следующее правило перезаписи:

Пример #3 Правило перезаписи для Lighttpd

url.rewrite-once = (
  ".*\?(.*)$" => "/index.php?$1",
  ".*\.(js|ico|gif|jpg|png|css|html)$" => "$0",
  "" => "/index.php"
)
При использовании Nginx используйте следующее правило перезаписи:

Пример #4 Правило перезаписи для Nginx

server {
  listen ****;
  server_name  yourdomain.com;
  root   document_root;
  index  index.php index.html;

  if (!-e $request_filename) {
    rewrite ^/(.*)  /index.php/$1 last;
  }
}

Маршрут по умолчанию

Yaf_Router поставляется с предварительно настроенным маршрутом по умолчанию Yaf_Route_Static, который будет соответствовать URI в форме контроллера/действия. Кроме того, имя модуля может быть указано в качестве первого элемента пути, что позволяет использовать URI формы модуля/контроллера/действия. Наконец, он также будет соответствовать любым дополнительным параметрам, добавляемым к URI по умолчанию - controller /action/var1/value1/var2/value2.

Замечание:

Имя модуля должно быть определено в конфигурации с учётом application.module="Index,Foo,Bar", в этом случае только index, foo и bar могут рассматриваться как имя модуля. Если не настроено, есть только один модуль с именем "Index".

Некоторые примеры соответствия таких маршрутов:

Пример #5 Пример использования Yaf_Route_Static(маршрут по умолчанию)

// Предполагая следующую настройку:
$conf = array(
   "application" => array(
      "modules" => "Index,Blog",
   ),
);

Только контроллер:
http://example/news
    controller == news
Только действие (если определено yaf.action_prefer=1 в php.ini)
    action  == news

Неверный модуль отображается на имя контроллера:
http://example/foo
    controller == foo

Модуль + контроллер:
http://example/blog/archive
    module     == blog
    controller == archive

Модуль + контроллер + действие:
http://example/blog/archive/list
    module     == blog
    controller == archive
    action     == list

Модуль + контроллер + действие + параметры:
http://example/blog/archive/list/sort/alpha/date/desc
    module     == blog
    controller == archive
    action     == list
    sort       == alpha
    date       == desc

Обзор классов

class Yaf_Router {
/* Свойства */
protected $_routes;
protected $_current;
/* Методы */
public __construct()
public addRoute(string $name, Yaf_Route_Abstract $route): bool
public getRoutes(): mixed
public route(Yaf_Request_Abstract $request): bool
}

Свойства

_routes

стек зарегистрированных маршрутов

_current

после фазы маршрутизации указывается название того, какой маршрут используется для маршрутизации текущего запроса. Вы можете получить его имя с помощью Yaf_Router::getCurrentRoute().

Содержание

add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top