Маршрутизация отображает URI запроса на метод конкретного контроллера. В этой главе мы увидим, как реализовать маршруты в Zend Framework.
В общем, любой URI состоит из трех частей:
- Сегмент имени хоста,
- Сегмент пути и
- Сегмент запросов.
Например, в URI / URL — http://www.example.com/index?q=data, www.example.com — это сегмент имени хоста, index — это сегмент пути, а q = data — это сегмент запроса. Как правило, маршрутизация проверяет сегмент страницы против набора ограничений. Если какое-либо ограничение совпадает, то оно возвращает набор значений. Одним из основных значений является контроллер.
Маршрутизация также проверяет сегмент хоста, сегмент запроса, методы HTTP запроса, HTTP-заголовки запроса и т. Д. В определенной ситуации.
Route & RouteStack
Маршрут является основным объектом в маршрутизации. Zend Framework имеет специальный интерфейс для объекта маршрута, RouteInterface . Весь объект маршрута должен реализовать RouteInterface. Полный список RouteInterface выглядит следующим образом:
namespace Zend\Mvc\Router; use Zend\Stdlib\RequestInterface as Request; interface RouteInterface { public static function factory(array $options = []); public function match(Request $request); public function assemble(array $params = [], array $options = []); }
Основным методом является совпадение . Этот метод сопоставления проверяет данный запрос на соответствие определенному в нем ограничению. Если какое-либо совпадение найдено, возвращается объект RouteMatch . Этот объект RouteMatch предоставляет сведения о сопоставленном запросе в качестве параметров. Эти параметры можно извлечь из RouteObject с помощью метода getParams .
Полный список RouteObject выглядит следующим образом:
namespace Zend\Mvc\Router; class RouteMatch { public function __construct(array $params); public function setMatchedRouteName($name); public function getMatchedRouteName(); public function setParam($name, $value); public function getParams(); public function getParam($name, $default = null); }
В общем, типичное приложение MVC имеет много маршрутов. Каждый из этих маршрутов будет обрабатываться в порядке LIFO, а один маршрут будет сопоставлен и возвращен. Если ни один маршрут не найден / не найден, приложение возвращает ошибку «Страница не найдена». Zend Framework предоставляет интерфейс для обработки маршрутов RouteStackInterface . Этот RouteStackInterface имеет возможность добавлять / удалять маршруты.
Полный список RouteStackInterface выглядит следующим образом:
namespace Zend\Mvc\Router; interface RouteStackInterface extends RouteInterface { public function addRoute($name, $route, $priority = null); public function addRoutes(array $routes); public function removeRoute($name); public function setRoutes(array $routes); }
Zend Framework предоставляет две реализации интерфейса RouteStack, и они следующие:
- SimpleRouteStack
- TreeRouteStack
Тип Маршрутов
Zend Framework предоставляет множество готовых объектов маршрутов для всех ситуаций в пространстве имен «Zend \ Mvc \ Router \ Http». Достаточно выбрать и использовать подходящий объект маршрута для данной ситуации.
Доступны следующие маршруты:
-
Имя хоста — используется для соответствия хост-части URI.
-
Literal — используется для точного соответствия URI.
-
Метод — используется для соответствия HTTP-метода входящего запроса.
-
Часть — используется для соответствия части сегмента пути URI с использованием пользовательской логики.
-
Regex — используется для сопоставления сегмента пути URI по шаблону Regex.
-
Схема — используется для соответствия схеме URI, такой как http, https и т. Д.
-
Сегмент — используется для сопоставления пути URI путем разбиения его на несколько сегментов.
Имя хоста — используется для соответствия хост-части URI.
Literal — используется для точного соответствия URI.
Метод — используется для соответствия HTTP-метода входящего запроса.
Часть — используется для соответствия части сегмента пути URI с использованием пользовательской логики.
Regex — используется для сопоставления сегмента пути URI по шаблону Regex.
Схема — используется для соответствия схеме URI, такой как http, https и т. Д.
Сегмент — используется для сопоставления пути URI путем разбиения его на несколько сегментов.
Давайте посмотрим, как написать наиболее часто используемый литерал и сегментный маршрут. Маршруты обычно указываются в файле конфигурации каждого модуля — module.config.php .
Буквальный маршрут
Как правило, маршруты запрашиваются в порядке LIFO. Литеральный маршрут предназначен для точного соответствия пути URI.
Это определено как показано ниже —
$route = Literal::factory(array( 'route' => '/path', 'defaults' => array('controller' => 'Application\Controller\IndexController', 'action' => 'index',), ));
Приведенный выше маршрут соответствует пути / в URL- адресе запроса и возвращает index в качестве действия и IndexController в качестве контроллера.
Сегментный маршрут
Сегментированный маршрут используется для случаев, когда ваш URL должен содержать переменные параметры.
Это описано как дано ниже —
$route = Segment::factory(array( 'route' => '/:controller[/:action]', 'constraints' => array( 'controller' => '[a-zA-Z][a-zA-Z0-9_-]+', 'action' => '[a-zA-Z][a-zA-Z0-9_-]+', ), 'defaults' => array( 'controller' => 'Application\Controller\IndexController', 'action' => 'index',), ));
Здесь сегменты обозначаются двоеточием, за которым следуют буквенно-цифровые символы. Если вы оставите сегмент необязательным, он будет заключен в квадратные скобки. Каждый сегмент может иметь ограничения, связанные с ним. Каждое ограничение является регулярным выражением.
Настройка маршрута в учебном модуле
Давайте добавим сегментный маршрут в наш учебный модуль. Обновите файл конфигурации модуля учебника — module.config.php, доступный в myapp / module / Tutorial / config .
<?php namespace Tutorial; use Zend\ServiceManager\Factory\InvokableFactory; use Zend\Router\Http\Segment; return [ 'controllers' => [ 'factories' => [ Controller\TutorialController::class => InvokableFactory::class, ], ], 'router' => [ 'routes' => [ 'tutorial' => [ 'type' => Segment::class, 'options' => [ 'route' => '/tutorial[/:action[/:id]]', 'constraints' => [ 'action' => '[a-zA-Z][a-zA-Z0-9_-]*', 'id' => '[0-9]+', ], 'defaults' => [ 'controller' => Controller\TutorialController::class, 'action' => 'index', ], ], ], ], ], 'view_manager' => [ 'template_path_stack' => ['tutorial' => __DIR__ . '/../view',], ], ];
Мы успешно добавили маршрутизацию для нашего учебного модуля. Мы только на один шаг позади в завершении нашего учебного модуля. Нам нужно добавить View для нашего модуля, который мы изучим в следующей главе.