我想在 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
Controller。
我暂时手动生成这些链接,但我认为这不是最好的解决方案:
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'));