【发布时间】:2011-09-23 15:47:54
【问题描述】:
我是 CakePHP 的新手,虽然对用于 Web 开发的 MVC 框架一点也不陌生。在做不是 Web 应用程序的网站时,我通常会使用 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 相同的结果——我猜你知道它是如何工作的。
我设置了一个数据库和一个模型,这样我就可以查询“别名”并检索“内部 url”,然后我就卡住了。好像在呼唤
$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;
}
除了名称(它并没有真正解析任何东西,是吗?)它工作正常……至少它做了我想要它做的事情。但我还是觉得脏:) 有人有什么建议吗?
【问题讨论】:
-
尝试使用您可能想要的路线,例如this
-
我已经有一个“catch all”路由,将“/:url”映射到 AliasController::parse,从而将所有内容作为参数传递。我认为我需要的仅使用路由是不可行的,我需要获取请求 url,在数据库中查找它,检索与其他路由对应的“内部 url”,然后调度它。我认为从我给出的例子中很清楚。此外,所有其他路由都可以完美运行,例如“/articles/1”确实被“/articles/:id”路由捕获,而不是被通用路由捕获。
-
哦,我明白了,那么您正在寻找类似 @987654324@ 的东西,并在解析函数中进行一些更改以完成技巧并在未找到 slug 时接受 id 或类似的东西.. . 这样你就可以做到这一点,而无需再次调用调度程序并在最后死去
-
这似乎更有可能。这样,如果找到 slug,我只需要构建一个合适的 CakeRoute 并返回它。现在,如果您可以将其添加为答案,以便我可以接受... :)
-
抱歉,等等:我忘了说我使用的是 CakePHP 2.0。该解决方案仍然合适吗?还是我应该看看别的?