2013-05-07 41 views
0

我想在CakePHP中创建一个管理练习和用户结果的应用程序。用户和结果在这个问题中并不重要。CakePHP,使用通用控制器进行可选控制器的路由,否则

我想要添加一个练习,只添加特定的表格和行到.ini配置文件。应用程序应该路由到GenericExercisesController如果特定的不存在。如果特定不存在,控制器应该加载GenericExerciseModel。我会与模型加载和部分地与控制器路由这样的管理:

route.php

foreach(Configure::read('exercisesTables') as $exerciseName){ 
    if(App::import('Controller', Inflector::pluralize($exerciseName))){ 
     Router::connect('/exercises/'.Inflector::pluralize($exerciseName).'/:action', array('controller' => Inflector::pluralize($exerciseName))); 
    }else{ 
     Router::connect('/exercises/'.Inflector::pluralize($exerciseName).'/:action', array('controller' => 'GenericExercises', 'fakeModel' => $exerciseName)); 
    } 
} 

所以,如果我要加载的锻炼美孚我应当使用地址:

http://example.com/exercises/Foos/view

这工作正常,如果具体的控制器存在没关系。

当我使用反向路由在视图中生成链接时,问题就开始了。如果锻炼有特定的控制器此工作正常:

print $this->Html->url(array('controller' => Inflector::pluralize($exerciseName), 'action' => 'view')); 生产: /exercises/Foos/view

但是当锻炼酒吧没有特定的控制器则相同的代码产生: /Bars

这会导致问题,没有Bars控制器。

暂时我手动生成这些链接,但我不认为这是最好的解决办法:

print $this->Html->url("/".Configure::read('exerciseRoutingPrefix')."/".Inflector::pluralize($exerciseName)."/view");

也许你认识的人更好的解决方案。感谢您阅读我的问题。

更新1:

这些都是在route.php路线,以foreach之前定义为他们在文件中:

Router::connect('/', array('controller' => 'questions', 'action' => 'regulations')); 
Router::connect('/pages/*', array('controller' => 'pages', 'action' => 'display')); 
Router::connect('/help', array('controller' => 'pages', 'action' => 'faq')); 
+0

为什么从我的问题开始,stackoverflow删除短语“你好,欢迎”? – 2013-05-07 12:46:22

+0

一些编辑删除不必要的短语。虽然它可能是“谢谢你”和“你好”有礼貌地问好,但它不会对问题本身有所贡献,所以有些人喜欢将它们删除。 – Nunser 2013-05-07 13:15:49

+0

你在这里发布的foreach之前是否有'routes.php'中定义的其他路线? – Nunser 2013-05-07 13:45:58

回答

1

如果我理解正确你的问题,你可以尝试做一个“MyHtmlHelper”这确实有些神奇的解析你的选择到HtmlHelper::link();

之前,您可以像这样:

/app/View/Helpes/MyHtmlHelper.php

创建它扩展了 “的HtmlHelper” 像这样一个帮手:

<?php 
App::uses('HtmlHelper', 'View/Helper'); 
class MyHtmlHelper extends HtmlHelper { 
    public function link($title, $url = null, $options = array(), $confirmMessage = false) { 
     //do your magic here and change the $title, $url or $options accordingly. 
     return parent::link($title, $url, $options, $confirmMessage); 
    } 
} 
在你的控制器

现在,你应该包括助手像这样(代替$helpers = array('Html');

我想你可以自己填写公共功能链接上的空白。如果没有,随意问更多的帮助:)

关当然,这是有可能与其他所有助手,或者你能想到的方法来做到这一点。 HtmlHelper :: link()仅用作示例。

+0

谢谢你的答案。这可能会诀窍,但我不确定这是否是最好的方法。如果可能的话,我宁愿使用cakePHP本地函数。无论如何我会检查它并最终标记为正确的答案。 – 2013-05-09 12:10:34

+1

这是Cakephp原生的,当你扩展一个助手:)我一直这样做。只是使用别名,所以你仍然可以使用相同的名称,这将防止核心失败:) – Jelmer 2013-05-09 13:26:40

+0

如果我把MyHtml放在AppController中,那么所有的类默认应该使用MyHtml?对? – 2013-05-15 11:09:03