路由系統是 MVC 框架的導航中樞,負責將 HTTP 請求映射為具體的控制器、動作與參數。Zend Framework 的 Zend_Controller_Router 提供了靈活、可擴展的路由解決方案,支持標準路由、正則路由、主機名路由、鏈式路由等多種策略。本文將深入剖析其核心架構、路由類型與實戰配置技巧。
定義路由器核心契約:
route(Request $request):匹配請求,注入控制器/動作/參數assemble($userParams, $name, $reset, $encode):反向組裝 URL實現接口通用邏輯:前端控制器引用、調用參數管理(_invokeParams)、參數堆疊操作。
標準重寫路由器,核心特性:
addRoute()、addRoutes()、removeRoute()addConfig(Zend_Config, $section) 支持 INI/XML 定義路由setGlobalParam() 影響所有路由組裝setChainNameSeparator()最常用路由,支持靜態/動態混合路徑:
$route = new Zend_Controller_Router_Route(
'author/:username', // 路由模式
['controller' => 'profile', 'action' => 'userinfo'], // 默認值
['username' => '\w+'] // 變量正則約束
);
$router->addRoute('user', $route);
特性:
:,通配符 * 收集剩餘鍵值對module、controller、action 驅動分發器['host' => '...', 'path' => '...']固定路徑映射,性能最高:
$route = new Zend_Controller_Router_Route_Static(
'login',
['controller' => 'auth', 'action' => 'login']
);
最強大靈活,基於 PCRE 正則:
$route = new Zend_Controller_Router_Route_Regex(
'archive/(\d+)', // 正則模式
['controller' => 'archive', 'action' => 'show'], // 默認值
[1 => 'year'], // 子模式映射參數名
'archive/%s' // 反向組裝模板
);
優勢:支持複雜 URL 結構(如 blog/archive/(\d+)-(.+)\.html),提取多個命名參數。
基於域名/子域名路由:
$route = new Zend_Controller_Router_Route_Hostname(
':username.example.com', // 主機名模式
['controller' => 'profile', 'action' => 'index'] // 默認值
);
默認路由實現,支持 module/controller/action/params 結構,兼容傳統 URL 格式。
組合多個路由,實現如 blog/archive/2023 這樣的層級結構:
$chain = new Zend_Controller_Router_Route_Chain();
$chain->chain($blogRoute)->chain($archiveRoute);
$router->addRoute('blogArchive', $chain);
[production] routes.archive.route = "archive/:year/*" routes.archive.defaults.controller = "archive" routes.archive.defaults.action = "show" routes.archive.defaults.year = 2023 routes.archive.reqs.year = "\d+" routes.news.type = "Zend_Controller_Router_Route_Static" routes.news.route = "news" routes.news.defaults.controller = "news" routes.news.defaults.action = "list"
加載方式:
$config = new Zend_Config_Ini('/path/routes.ini', 'production');
$router->addConfig($config, 'routes');
視圖助手用法:
<a href="<?= $this->url(['username' => 'martel'], 'user') ?>">Martel</a> // 生成:/user/martel
控制器中:
$url = $this->_helper->url->url(['id' => 123], 'archive', true);
實現 Zend_Controller_Router_Route_Interface:
interface Zend_Controller_Router_Route_Interface {
public function match($path); // 返回參數數組或 false
public function assemble($data, $reset, $encode); // 返回 URL 字符串
public function getVersion(); // 版本標識
}
註冊使用:$router->addRoute('custom', new My_Custom_Route(...))
Zend_Controller_Router 以接口抽象、多態實現、配置驅動三大特性,構建了極具彈性的路由體系。從簡單的靜態映射到複雜的正則提取、主機名分發、鏈式組合,均能優雅應對。掌握其核心模型與組裝機制,是構建 RESTful API、多語言站點、多租戶應用的關鍵基石。