我希望能够获取某个属性是某个值的所有模型的名称。
理想情况下,我想在 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
没有任何价值给用户)。
所以在这种情况下,我想创建一个元素,为那些应该可以访问的模型返回一个导航界面(这不是代替 ACL 列表,我不是为了安全而使用它,只是为了方便自动化home.ctp 的内容)。
我知道手动创建此类模型的列表并在必要时对其进行更新很容易。不过,一般来说,我尽量不写任何可以通过编程获得的东西。我突然想到我可以创建一个models
模型,基本上是我的应用程序中内容的注册表,然后requestAction()
我可以达到同样的效果。但是后来我迷失了思考如何在每个模型被调用时自动注册它自己,但只是第一次?这可能是向大家重申我是业余开发者的好时机,哈哈哈。:)