Несколько контроллеров с одной моделью - PullRequest
0 голосов
/ 02 сентября 2011

Вот что я пытаюсь сделать

У меня есть таблица, которая содержит много разных типов данных для предметов.имя модели для этого - '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 ]

2 голосов
/ 02 сентября 2011

Это плохая форма для использования var $uses в CakePHP 1.3+. Его заменил App :: import ( см. Ниже )

Если у вас есть контроллер Users с моделью User и контроллер Comments с моделью 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
    }
}

App :: импорт

Это действительно просто 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 голос
/ 02 сентября 2011

Я хотел бы предложить вам не $uses заявление. Вместо этого вы можете использовать отношения моделей типа $this->Model->M0del1->....->someFunc();, если отношение существует.

Если связь между моделями не существует, просто используйте $this->loadModel('ModelName'); в конкретной функции, где бы она вам ни понадобилась.

Если вы используете var $uses = array('Object');, он становится глобальным для контроллера и загружает эту модель для всех действий контроллера, независимо от того, требуется вам это или нет. Это повлияет на вашу производительность.

Если вы используете $this-LoadModel('ModelName'); в определенной функции, она будет загружаться только в эту функцию, а не во всех действиях.

0 голосов
/ 02 сентября 2011

Вы объявляете свой контроллер и объявляете переменную $ использовании на нем следующим образом:

var $uses = array('Object');
...