CakePHP,使用通用控制器进行可选控制器的路由

时间:2013-05-07 12:45:01

标签: php cakephp cakephp-2.2 cakephp-helper cakephp-routing

我想在CakePHP中创建一个管理练习和用户结果的应用程序。用户和结果在这个问题上并不重要。

我希望能够添加一个练习,只在.ini配置文件中添加一个特定的表和行。应用程序应该路由到GenericExercisesController,如果不存在特定的。如果特定不存在,Controller应加载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

但是当练习 Bar 没有特定的控制器时,相同的代码会产生: /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'));

1 个答案:

答案 0 :(得分: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);
    }
}

现在,在您的控制器中,您应该包含帮助器(aliasing$helpers = array('Html' => array('className' => 'MyHtml'));而不是$helpers = array('Html');

我猜你可以自己填写公共功能链接的空白。如果没有,请随时提出更多帮助:)

当然,您可以使用其他所有可以想到的帮助器或方法来执行此操作。 HtmlHelper :: link()仅用作示例。