Cakephp 2.3:全局访问模型属性的有效方法

时间:2013-03-25 20:27:00

标签: php cakephp cakephp-2.3

我希望能够获得某个属性具有特定值的所有模型的名称。

理想情况下,我想在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/indexauthors/index是明显的选择,而entries_authors对用户没有价值。

所以在这种情况下,我想创建一个元素,为那些应该可访问的模型返回一个nav接口(这不是代替ACL列表,我不是故意将其用于安全性,只是为了方便自动化home.ctp的内容。

我知道手动创建此类模型的列表很容易,并在必要时进行更新。但是,一般情况下,我尝试以编程方式手动编写任何内容。在我看来,我可以创建一个models模型,基本上是我的应用程序中的内容的注册表,然后requestAction()我的方式达到相同的效果。但后来我迷失了思考如何在调用时自动让每个模型注册,但只是第一次?这可能是向所有人重申我是业余开发者的好时机,哈哈哈。 :)

0 个答案:

没有答案