- Zend Framework 教程
- Zend Framework - 首页
- Zend Framework - 简介
- Zend Framework - 安装
- 框架应用
- Zend Framework - MVC 架构
- Zend Framework - 概念
- Zend Framework - 服务管理器
- Zend Framework - 事件管理器
- Zend Framework - 模块系统
- 应用结构
- Zend Framework - 创建模块
- Zend Framework - 控制器
- Zend Framework - 路由
- Zend Framework - 视图层
- Zend Framework - 布局
- 模型 & 数据库
- 不同的数据库
- 表单 & 验证
- Zend Framework - 文件上传
- Zend Framework - Ajax
- Cookie 管理
- 会话管理
- Zend Framework - 身份验证
- 邮件管理
- Zend Framework - 单元测试
- Zend Framework - 错误处理
- Zend Framework - 工作示例
- Zend Framework 有用资源
- Zend Framework - 快速指南
- Zend Framework - 有用资源
- Zend Framework - 讨论
Zend Framework - 路由
路由将请求 URI映射到特定控制器的 方法。在本章中,我们将了解如何在 Zend Framework 中实现路由。
一般来说,任何 URI 都有三个部分:
- 主机名段;
- 路径段;以及
- 查询段。
例如,在 URI/URL http://www.example.com/index?q=data 中,www.example.com 是主机名段,index 是路径段,q=data 是查询段。通常,路由会根据一组约束检查路径段。如果任何约束匹配,则它会返回一组值。其中一个主要值是控制器。
在某些情况下,路由还会检查主机段、查询段、请求 HTTP 方法、请求 HTTP 头等。
路由 & 路由栈
路由是路由中的主要对象。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 = []);
}
主要方法是match。此 match 方法会根据其中定义的约束检查给定的请求。如果找到任何匹配项,它将返回RouteMatch 对象。此 RouteMatch 对象提供匹配请求的详细信息作为参数。这些参数可以使用getParams 方法从RouteObject 中提取。
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" 命名空间下的所有情况提供了许多现成的路由对象。为给定情况选择和使用合适的路由对象就足够了。
可用的路由如下:
Hostname - 用于匹配 URI 的主机部分。
Literal - 用于匹配精确的 URI。
Method - 用于匹配传入请求的 HTTP 方法。
Part - 使用自定义逻辑匹配 URI 路径段的一部分。
Regex - 使用正则表达式模式匹配 URI 路径段。
Schema - 用于匹配 URI 模式,例如 http、https 等。
Segment - 用于通过将 URI 路径拆分为多个段来匹配 URI 路径。
让我们看看如何编写最常用的 Literal 和 Segment 路由。路由通常在每个模块的配置文件中指定 - module.config.php。
Literal 路由
通常,路由按 LIFO 顺序查询。Literal 路由用于对 URI 路径进行精确匹配。
其定义如下:
$route = Literal::factory(array(
'route' => '/path',
'defaults' => array('controller' => 'Application\Controller\IndexController',
'action' => 'index',),
));
上面的路由匹配请求 url 中的/path 并返回index 作为action 和IndexController 作为控制器。
Segment 路由
当你的 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',),
));
这里,段由冒号表示,后跟字母数字字符。如果你保留一个可选段,则将其用括号括起来。每个段可能与其关联的约束相关联。每个约束都是一个正则表达式。
在 Tutorial 模块中配置路由
让我们在 Tutorial 模块中添加一个 segment 路由。更新 Tutorial 模块配置文件 - 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',],
],
];
我们已经成功为Tutorial 模块添加了路由。完成 Tutorial 模块只差一步。我们需要为模块添加视图,我们将在下一章学习。