CakePHP,使用通用控制器进行可选控制器的路由,否则
我想在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'));
如果我理解正确你的问题,你可以尝试做一个“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()仅用作示例。
谢谢你的答案。这可能会诀窍,但我不确定这是否是最好的方法。如果可能的话,我宁愿使用cakePHP本地函数。无论如何我会检查它并最终标记为正确的答案。 – 2013-05-09 12:10:34
这是Cakephp原生的,当你扩展一个助手:)我一直这样做。只是使用别名,所以你仍然可以使用相同的名称,这将防止核心失败:) – Jelmer 2013-05-09 13:26:40
如果我把MyHtml放在AppController中,那么所有的类默认应该使用MyHtml?对? – 2013-05-15 11:09:03
为什么从我的问题开始,*删除短语“你好,欢迎”? – 2013-05-07 12:46:22
一些编辑删除不必要的短语。虽然它可能是“谢谢你”和“你好”有礼貌地问好,但它不会对问题本身有所贡献,所以有些人喜欢将它们删除。 – Nunser 2013-05-07 13:15:49
你在这里发布的foreach之前是否有'routes.php'中定义的其他路线? – Nunser 2013-05-07 13:45:58