josegonzalez / cakephp-page-route
在 CakePHP 中自动路由 /:page 风格的路由,无需烦恼
Requires
This package is auto-updated.
Last update: 2024-08-29 04:30:58 UTC
README
PageRoute 插件
别再让 routes.php
文件中充斥着无数的 /page
风格的路由了。
背景
有人在 IRC 上正在将大量的静态页面迁移到一个新的 CakePHP 安装中。在 webroot 目录下。我建议他将它们移动到 app/View/Pages
并使用路由来正确路由一切。我还提到,与其逐个路由每个静态文件,不如使用自定义的 CakeRoute
类,但没有详细说明。
所以,经过几分钟的修改,我有了这个可爱的 PageRoute
。
需求
- PHP 5.2+
- CakePHP 2.x
安装
[使用 Composer]
将插件添加到项目的 composer.json
文件中 - 例如这样
{
"require": {
"josegonzalez/cakephp-page-route": "1.0.0"
}
}
因为这个插件在其自己的 composer.json
中设置了类型 cakephp-plugin
,所以 composer 会将其安装到你的 /Plugins
目录中,而不是在常规的 vendors 文件中。建议将 /Plugins/PageRoute
添加到你的 .gitignore 文件中。(为什么?阅读此内容。)
[手动]
- 下载这个: https://github.com/josegonzalez/cakephp-page-route/zipball/master
- 解压下载的内容。
- 将生成的文件夹复制到
app/Plugin
- 将你刚刚复制的文件夹重命名为
PageRoute
[GIT 子模块]
在你的应用目录中键入
git submodule add git://github.com/josegonzalez/cakephp-page-route.git Plugin/PageRoute
git submodule init
git submodule update
[GIT Clone]
在你的插件目录中键入
git clone git://github.com/josegonzalez/cakephp-page-route.git PageRoute
启用插件
在 2.0 版本中,你需要在 app/Config/bootstrap.php
文件中启用插件
CakePlugin::load('PageRoute');
如果你已经使用了 CakePlugin::loadAll();
,则此步骤不是必需的。
用法
在你的 app/Config/routes.php
文件底部附近,添加以下内容
<?php App::uses('PageRoute', 'PageRoute.Routing/Route'); Router::connect('/:page', array('controller' => 'pages', 'action' => 'display'), array('routeClass' => 'PageRoute') );
现在你可以移除所有指向你的 /pages/display/page-name
url 的快捷方式。无论何时你在 app/View/Pages
中创建一个新的 .ctp
文件,这个路由都会自动使用 file_exists()
调用检测到它。因为这个原因,建议将其作为你应用程序中的最后一个路由之一,如果不是最后一个的话,以最大限度地减少文件读取。
也可以自定义用于此的路由控制器/操作。例如,我们可能想使用 StaticPagesController::index()
而不是 PagesController::display()
。在这种情况下,我们的 routes.php
将如下所示
<?php App::uses('PageRoute', 'PageRoute.Routing/Route'); Router::connect('/:page', array('controller' => 'static_pages', 'action' => 'index'), array('routeClass' => 'PageRoute', 'controller' => 'static_pages', 'action' => 'index') );
这样,我们可以轻松地将 PagesController
重命名为不那么有用的名称,并将 PagesController
重新用于其他目的 - 例如来自数据库的动态内容。
反向路由将像没有这个路由类一样正常工作。array('controller' => 'pages', 'action' => 'display', 'about')
将自动转换为 array('controller' => 'pages', 'action' => 'display', 'page' =. 'about')
以实现向后兼容。请注意,默认情况下,使用 [\/\w_-]+
正则表达式检查页面有效性,因此你可能需要更新 Route 选项中的该正则表达式如下
App::uses('PageRoute', 'PageRoute.Routing/Route'); Router::connect('/:page', array('controller' => 'static_pages', 'action' => 'index'), array('routeClass' => 'PageRoute', 'page' => '[a-zA-Z]+') );
请注意,出于安全原因,默认的正则表达式禁止了点(.)字符的使用,以消除遍历目录树的可能性。
待办事项
- 单元测试
- 允许在路由中使用点(.)字符
- 对 file_exists 调用添加缓存