我希望能够获得某个属性具有特定值的所有模型的名称。
理想情况下,我想在AppModel中放置一个属性,然后继承该属性,然后由所有其他模型设置,以便可以从任何地方轻松访问。这是我的想法的要点:
在我要分组的任何模型中将此设置为 true :
class AppModel extends Model {
public $hasPortal = false;
}
然后将此函数添加到AppController:
class AppController extends Controller {
public $components = array('DebugKit.Toolbar');
static function getPortals() {
$portalModels = array();
$models = App::objects('Model');
foreach( $models as $model ) {
if ( !class_exists($model) ) {
$m = ClassRegistry::init($model);
if ( $m->hasPortal ) {
$portalModels[] = $model;
}
}
}
return $portalModels;
}
}
因此我可以这样做:$portals = AppController::getPortals()
在任何地方 - 它现在运行得很好(当我有> 20个类!),但我很确定这是愚蠢无效的。我希望能够动态分组模型集合(理想情况下甚至是控制器和函数)以生成菜单。但我对OOP非常认真,并且怀疑这不是获得我想要的功能的最有效方式。
在阅读之前查看评论,我正在处理描述我的特定背景的请求
我并非所有确信这种方法有意义!
我想要实现的实际内容是home.ctp
中自动创建的菜单。使用上面的代码,我的home.ctp
就是这样:
$portaledModels = AppController::getPortals();
foreach ($portaledModels as $model) {
echo $this->element('modelPortal', array('model' => $model) );
}
(虽然最终$ model会是一个包含描述,图标链接等的数组。)
通常的情况是,在蛋糕应用程序的默认“主页”上,我真正想要的是有一种方法可以导航到许多模型的各种动作 - 但不是全部(即entries/index
和authors/index
是明显的选择,而entries_authors
对用户没有价值。
所以在这种情况下,我想创建一个元素,为那些应该可访问的模型返回一个nav接口(这不是代替ACL列表,我不是故意将其用于安全性,只是为了方便自动化home.ctp的内容。
我知道手动创建此类模型的列表很容易,并在必要时进行更新。但是,一般情况下,我尝试以编程方式手动编写任何内容。在我看来,我可以创建一个models
模型,基本上是我的应用程序中的内容的注册表,然后requestAction()
我的方式达到相同的效果。但后来我迷失了思考如何在调用时自动让每个模型注册,但只是第一次?这可能是向所有人重申我是业余开发者的好时机,哈哈哈。 :)