- Zend 框架教程
- Zend 框架 - 主页
- Zend 框架 - 简介
- Zend 框架 - 安装
- 骨架应用
- Zend 框架 - MVC 架构
- Zend 框架 - 概念
- Zend 框架 - 服务管理器
- Zend 框架 - 事件管理器
- Zend 框架 - 模块系统
- 应用结构
- Zend 框架 - 创建模块
- Zend 框架 - 控制器
- Zend 框架 - 路由
- Zend 框架 - 视图层
- Zend 框架 - 布局
- 模型和数据库
- 不同的数据库
- 表格和验证
- Zend 框架 - 文件上传
- Zend 框架 - Ajax
- Cookie 管理
- 会话管理
- Zend 框架 - 身份验证
- 电子邮件管理
- Zend 框架 - 单元测试
- Zend 框架 - 错误处理
- Zend 框架 - 工作示例
- Zend 框架有用的资源
- Zend 框架 - 快速指南
- Zend 框架 - 有用的资源
- Zend 框架 - 讨论
Zend 框架 - 路由
路由将请求 URI 映射到特定控制器的方法。在本章中,我们将了解如何在 Zend Framework 中实现路由。
一般来说,任何 URI 都由三个部分组成 -
- 主机名段,
- 路径段,以及
- 查询段。
例如,在 URI / URL - http://www.example.com/index?q=data 中, www.example.com是主机名段,index是路径段,q=data是查询段。通常,路由根据一组约束检查页面段。如果任何约束匹配,则它返回一组值。主要价值之一是控制器。
在某种情况下,路由还会检查主机段、查询段、请求 HTTP 方法、请求 HTTP 标头等。
路由和路由堆栈
Route是路由中的主要对象。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。此匹配方法根据其中定义的约束检查给定的请求。如果找到任何匹配项,则返回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 框架提供了RouteStack接口的两种实现,如下所示:
- 简单路由栈
- 树路由栈
路线类型
Zend框架在“Zend\Mvc\Router\Http”命名空间下为所有情况提供了大量现成的路由对象。针对给定情况选择和使用正确的路由对象就足够了。
可用路线如下 -
主机名- 用于匹配 URI 的主机部分。
Literal - 用于匹配精确的 URI。
Method - 用于匹配传入请求的 HTTP 方法。
部分- 用于使用自定义逻辑匹配 URI 路径段的部分。
Regex - 用于通过 Regex 模式匹配 URI 路径段。
Schema - 用于匹配 URI Schema,例如 http、https 等。
Segment - 用于通过将 URI 路径拆分为多个段来匹配 URI 路径。
我们来看看最常用的字面Route和分段Route怎么写。路由通常在每个模块的配置文件 - module.config.php中指定。
文字路线
通常,按 LIFO 顺序查询路由。Literal 路由用于精确匹配 URI 路径。
它的定义如下 -
$route = Literal::factory(array( 'route' => '/path', 'defaults' => array('controller' => 'Application\Controller\IndexController', 'action' => 'index',), ));
上面的路由匹配请求 url 中的/path并返回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',], ], ];
我们已成功添加教程模块的路由。我们在完成教程模块方面仅落后一步。我们需要为我们的模块添加视图,我们将在后续章节中学习。