我在网络应用程序中使用了这种方法farm.ba http://farm.ba/(不再由所有者维护)。
我做了什么:
- 创建表“节点”,其中包含字段 id、slug、model、foreign_key、type、..
- 创建自定义路线(1 http://book.cakephp.org/2.0/en/development/routing.html#custom-route-classes),(2 http://mark-story.com/posts/view/using-custom-route-classes-in-cakephp) 处理 Node 模型的类
- 保存帖子后,在节点模型中存储和缓存 slug
- 删除帖子后,删除缓存和节点记录
这与 WordPress 路由非常相似,允许您输入自定义 slug 等。
EDIT:
在 App/Lib/Routing/Router/MultiRoute.php 中创建自定义路由类,如下所示:
<?php
App::uses('CakeRoute', 'Routing/Route');
/**
* MultiRoute
*/
class MultiRoute extends CakeRoute
{
public function parse($url)
{
// debug($url); '/florida/abc/people/add'
// Add custom params
$params = array(
'location' => null,
'company' => null,
'controller' => 'peoples',
);
$params += parent::parse($url);
// debug($params);
/**
* array(
* 'location' => null,
* 'company' => null,
* 'controller' => 'peoples',
* 'named' => array(),
* 'pass' => array(
* (int) 0 => 'florida', // location
* (int) 1 => 'abc', //company
* (int) 2 => 'people', // controller
* (int) 3 => 'add' // action, default index
* ),
* 'action' => 'index',
* 'plugin' => null
* )
*
*/
// reverse passed params
$pass = array_reverse($params['pass']);
// debug($pass);
/**
* array(
* (int) 0 => 'add',
* (int) 1 => 'people',
* (int) 2 => 'abc',
* (int) 3 => 'florida'
* )
*/
if(isset($pass[3])) { $params['location'] = $pass[3]; }
if(isset($pass[2])) { $params['company'] = $pass[2]; }
// if you need load model and find by slug, etc...
return $params;
}
public function match($url)
{
// implement your code
$params = parent::match($url);
return $params;
}
}
在routes.php中
App::uses('MultiRoute', 'Lib/Routing/Route');
Router::connect('/admin/*',
array('admin' => true),// we set controller name in MultiRoute class
array('routeClass' => 'MultiRoute')
);
Router::connect('/*',
array(),// we set controller name in MultiRoute class
array('routeClass' => 'MultiRoute')
);
在您的控制器中使用额外的请求参数查找结果,例如:
$this->request->location;
$this->request->company;
我希望这是有帮助的。