繁体   English   中英

单个模型的多个控制器

[英]Multiple controllers with a single model

我想做的继承人

我有一张桌子,上面放着许多不同类型的数据。 型号名称为“对象”

例如 :

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

我想编写一个控制器'event_controller'并与其一起使用'Object'模型,并且仅处理event_types类型。 和新闻的另一个控制器(news_controller),并使用相同的模型。

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

我从codeigniter进入蛋糕,在CI中,我们可以将所需的任何模型加载到任何控制器中,我可以对cake做类似的事情吗?

在CakePHP 1.3+中使用var $uses被认为是差的形式。 它已由App :: import代替( 请参阅下文

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

使用关联

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

// 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()指定的任何这些模式。

我建议您不要$uses语句。 取而代之的是,您可以使用$this->Model->M0del1->....->someFunc();等模型的关系$this->Model->M0del1->....->someFunc(); 如果该关系存在。

如果模型之间的关系不存在,则只需使用$this->loadModel('ModelName'); 在任何需要的地方使用特定功能。

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

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

您声明控制器,并在其上声明$ uses变量,如下所示:

var $uses = array('Object');

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM