Учебники

Zend Framework — Маршрутизация

Маршрутизация отображает 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 для нашего модуля, который мы изучим в следующей главе.