Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在CakePHP中实现URL别名_Url_Cakephp - Fatal编程技术网

在CakePHP中实现URL别名

在CakePHP中实现URL别名,url,cakephp,Url,Cakephp,我是CakePHP新手,但对于用于web开发的MVC框架来说并不陌生。我通常会使用Drupal来制作非web应用程序的网站,但我的员工觉得从头开始编写代码要比使用预先构建的经过良好测试的工作解决方案好得多。唉 不管怎样,他同意至少让我使用一个框架,我选择CakePHP是因为a)我一直想学习它,b)我太喜欢Rails了,不能再回到Zend:)不管怎样,我决定吃点蛋糕,请耐心点:) 我设置了很多控制器和实现站点所有功能的东西,现在我需要设置类似Drupal的url别名。例如,这样的别名可以让您请求并

我是CakePHP新手,但对于用于web开发的MVC框架来说并不陌生。我通常会使用Drupal来制作非web应用程序的网站,但我的员工觉得从头开始编写代码要比使用预先构建的经过良好测试的工作解决方案好得多。唉

不管怎样,他同意至少让我使用一个框架,我选择CakePHP是因为a)我一直想学习它,b)我太喜欢Rails了,不能再回到Zend:)不管怎样,我决定吃点蛋糕,请耐心点:)

我设置了很多控制器和实现站点所有功能的东西,现在我需要设置类似Drupal的url别名。例如,这样的别名可以让您请求并显示与请求时看到的页面相同的页面。或者当你输入/blog/有史以来最优秀的文章时,返回与/article/301相同的内容-我想你已经了解了它的工作原理

我建立了一个数据库和一个模型,这样我就可以查询“别名”并检索“内部url”,然后我就卡住了。看来

$html = $this->requestAction($internal_url, array('return'));
将返回完全呈现的HTML,就像我的用户直接请求$internal_url一样,但事实并非如此。我只得到动作视图的HTML,没有所有很棒的布局

我之所以选择数据库/控制器,是因为我希望站点管理员能够通过浏览器编辑别名,而不是通过编辑一些模糊的路由指令或.htacces。登录、创建页面、设置别名和出去吃午饭也要快得多

现在:我该怎么做

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

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;
}

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

很抱歉回答得太晚了

您要做的是重新执行CakeRoute使用的解析方法。通过这种方式,您可以随心所欲地解析条目,甚至可以使用数据库获取类似slug的url的id。它更详细地解释了您可以像示例中那样执行此操作,并添加一个if子句,其中if没有找到任何内容并且(is numeric&&!empty())像往常一样执行id


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

尝试使用路由,你可能想要一些东西,就像我已经有了一个将“/:url”映射到AliasController::parse的“一应俱全”路由一样,因此,将所有内容作为参数传递。我认为我需要的仅仅使用路由是不可行的,我需要获取请求url,在数据库中查找它,检索对应于其他路由的“内部url”,并分派它。我认为从我举的例子中可以清楚地看出这一点。此外,所有其他路由都工作得很好,因此,例如“/articles/1”确实会被“/articles/:id”路由捕获,而不是被一般路由捕获。哦,我明白了,那么您正在寻找类似的东西,并在解析函数中做一些更改,以便在没有找到slug或类似的东西时执行技巧并接受id。。。这样你就不用再打电话给调度员就可以完成任务,而且死在最后,这似乎更有可能。这样,如果找到一个slug,我只需要构建一个合适的CakeRoute并返回它。现在,如果您可以添加这个作为答案,我可以接受它…:)对不起,等等:我忘了提到我使用的是CakePHP2.0。这个解决方案是否仍然合适,或者我应该考虑其他问题?