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

因此,如果我想加载一个练习Foo,我应该使用地址:

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

如果存在特定的控制器,这也没关系。

当我使用反向布线在视图中生成链接时,问题就开始了。如果演习Foo有特定的控制器,则该控制器工作正常:

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

现在,在您的控制器中,应该包含类似于so(别名($helpers = array('Html' => array('className' => 'MyHtml'));的Helper,而不是$helpers = array('Html');

我想你可以自己填写公共功能链接上的空白。如果没有,请随时寻求更多帮助:(

  • 有关助手的详细信息

当然,可以用你能想到的所有其他Helper或方法来做这件事。HtmlHelper::link((只是一个例子

相关内容

  • 没有找到相关文章

最新更新