josegonzalez/cakephp-page-route

在 CakePHP 中自动路由 /:page 风格的路由,无需烦恼

dev-master 2015-11-29 11:23 UTC

This package is auto-updated.

Last update: 2024-08-29 04:30:58 UTC


README

Build Status Coverage Status Total Downloads Latest Stable Version Documentation Status Gratipay

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 文件中。(为什么?阅读此内容。)

[手动]

[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 调用添加缓存