具有单个模型的多个控制器

时间:2011-09-02 00:13:41

标签: php cakephp cakephp-appmodel

继承人我想做什么

我有一个表,其中包含许多不同类型的项目数据。这个模型的名称是'Object'

例如:

row 1 : item_type = event
row 2 : item_type = news
row 3 : item_type = booking

我想编写一个控制器'event_controller'并使用'Object'模型,并且只处理事件的item_types。和另一个新闻控制器(news_controller)并使用相同的模型。

我如何在cakephp上执行此操作。

我从codeigniter进入蛋糕并在CI中我们可以将任何我们想要的模型加载到任何控制器中我可以用蛋糕做类似的事情吗?

3 个答案:

答案 0 :(得分:2)

在CakePHP 1.3+中使用var $uses被认为是不好的形式。它已被App :: import(见下文

取代

假设您有一个带有User模型的Users控制器和一个带Comment模型的Comments控制器。接受的模式是:

使用关联

如果模型可以逻辑关联,这是您最好的选择。

// models/user.php
Class User extends AppModel {
    public $hasMany = array('Comment');
}

// controllers/users_controller.php
Class UsersController extends AppController {
    function allComments() {
        $this->User->Comment->find('all'); // You can use this across multiple models (e.g. $this->User->Comment->NestedComment->find('all');
    }
}

实例化模型对象

这将加载模型文件,将实例添加到CakePHP的对象图中,并返回实例。

// models/user.php
Class User extends AppModel {}

// models/comment.php
Class Comment extends AppModel {}

// controllers/users_controller.php
Class UsersController extends AppController {
    function allComments() {
        $Comments =& ClassRegistry::init('Comment');

        $Comments->find('all');
    }
}

使用$ this-> loadModel

在内部,它使用ClassRegistry :: init,然后还将模型添加为控制器的属性。

// models/user.php
Class User extends AppModel {}

// models/comment.php
Class Comment extends AppModel {}

// controllers/users_controller.php
Class UsersController extends AppController {
    function allComments() {
        $this->loadModel('Comment');

        $this->Comment->find('all'); // using load model allows you to access it via $this->Model
    }
}

应用::进口

这实际上只是CakePHP需要文件的方式。您仍然需要实例化对象。

// models/user.php
Class User extends AppModel {}

// models/comment.php
Class Comment extends AppModel {}

// controllers/users_controller.php
App::import('Model', 'Comment');
Class UsersController extends AppController {
    function allComments() {
        $Comment = new Comment();

        $Comment->find('all');
    }
}

我希望这会有所帮助。

编辑:如果您想在控制器中全局使用模型对象,您可以使用我在beforeFilter()中指定的任何模式。

答案 1 :(得分:1)

我建议你不要$uses陈述。如果存在关系,则可以使用$this->Model->M0del1->....->someFunc();之类的模型的关系。

如果模型之间的关系不存在,那么只需在特定函数中使用$this->loadModel('ModelName');,无论何时需要它。

如果使用var $uses = array('Object');,它将变为控制器的全局,并且无论您是否需要,它都会为控制器的所有操作加载该模型。这会影响您的表现。

如果您在特定功能中使用$this-LoadModel('ModelName');,则只会在该功能中加载而不是在所有操作中加载。

答案 2 :(得分:0)

你声明你的控制器并在其上声明$ uses变量:

var $uses = array('Object');