在CakePHP中实现URL别名

时间:2011-09-23 15:47:55

标签: url cakephp

我是CakePHP的新手,虽然对于Web开发的MVC框架来说根本不是新手。我通常会选择Drupal来做非网络应用程序的网站,但我的员工认为从头开始编写代码比使用预先构建良好测试和工作的解决方案要好得多。叹息。

无论如何,他同意至少让我使用一个框架,我之所以选择CakePHP是因为a)我一直想学习它,而且b)我非常喜欢Rails我真的不能回到Zend一次更多:)无论如何,我决定要一些蛋糕,所以熊我:)

我设置了很多控制器和实现网站所有功能的东西,现在我需要设置类似Drupal的url别名。这样的别名可以让您请求http://www.example.com/this-be-me-page并显示您在请求http://www.example.com/pages/42时看到的相同页面。或者在键入/ blog / the-most-excellent-post-ever时返回与/ article / 301相同的内容 - 我猜你知道它是如何工作的。

我设置了一个数据库和一个模型,以便我可以查询“别名”并检索“内部网址”,然后我就卡住了。似乎在打电话

$html = $this->requestAction($internal_url, array('return'));

会返回完全呈现的HTML,好像我的用户直接请求$ internal_url但事实并非如此。我只获得了动作视图的HTML,没有所有令人敬畏的布局。

我正在使用这种数据库/控制器方式,因为我希望网站的管理员能够通过浏览器编辑别名,而不是编辑一些模糊的路由指令或.htacces。登录,创建页面,设置别名以及外出吃午饭也快得多。

现在:我该怎么做?

编辑模仿app / webroot / index.php的行为我为AliasController写了这个动作:

public function parse() {
    $alias = $this->request->params['url'];

    $record = $this->Alias->findByAlias($alias);
    $request = $record['Alias']['request'];

    $Dispatcher = new Dispatcher();
    $Dispatcher->dispatch(new CakeRequest($request), new CakeResponse(array('charset' => Configure::read('App.encoding'))));

    die;
}

除了名称(它没有真正解析任何东西,是吗?)它工作得很好......至少它做了我想要它做的事情。但我还是觉得很脏:)有人有建议吗?

1 个答案:

答案 0 :(得分:1)

对不起,迟到了。

您要做的是重新执行CakeRoute使用的解析方法。这样你就可以按照自己的意愿去解析条目,甚至可以使用数据库来获取像url这样的slug的id。更详细地解释here你可以像在例子中那样做,并添加一个if子句,如果没有找到任何东西和(是数字&&!empty())像往常一样id。 ..

希望这有效,我在1.3中测试它应该在2.0中工作,因为这是一个新功能1.3,所以你可以创建自定义路线(我想很多人有同样的问题)所以我认为它会去工作:))