Должен ли я использовать App :: import ('Model', ...) или ClassRegistry (...)? - PullRequest
8 голосов
/ 08 марта 2011

Из-за других ответов ( вроде этого ) я просто хочу уточнить, что следует использовать в CakePHP 1.3 .

В частности, у меня есть ситуация, при которой модель зависит от другой, поэтому из метода в этой модели я хотел бы загрузить другую, кое-что сделать с информацией и т. Д.

Документация для класса приложения гласит:

В предыдущих версиях были разные функции для загрузки необходимого класса в зависимости от типа класса, который вы хотите загрузить. Эти функции устарели, теперь вся загрузка классов и библиотек должна выполняться через App :: import ().

Я предполагаю, что это охватывает использование ClassRegistry и т. Д., Но я просто хочу, чтобы это было ясно и определенно:

Должен ли я использовать App::import('Model', ...), чтобы использовать одну модель из другой или что-то еще? Если что-то еще, что?

Ответы [ 4 ]

13 голосов
/ 09 марта 2011

Похоже, что даже через два года с 2008 года лучшим методом является использование ClassRegistry::init(), несмотря на цитируемую документацию.

Это видно из фактического API / документации для конкретных классов / методов.

App::import()

Находит классы на основе $ name или определенных файлов для поиска.Вызов App :: import () не создаст никаких классов, содержащихся в файлах.Он только найдет и потребует () файл.

ClassRegistry::init()

Загружает класс, регистрирует объект в реестре и возвращаетэкземпляр объекта.

Примеры Простое использование: Получить экземпляр модели Post ClassRegistry :: init ('Post');

Как видите, даже в документации API указываетсяпримеры использования ClassRegistry для загрузки моделей, создание их экземпляров для вас, в отличие от App::import (что делает намного меньше), и несмотря на измененную формулировку в документации CakePHP "Book".

7 голосов
/ 09 марта 2011

Если вы можете связать модели, то лучший способ - динамически связать отношения, используя

$this->bindModel("hasOne" => array("Model2")).

Если вы не можете связать модель и хотите использовать вторую модель только в одном случае, тогда вы можете использовать

ClassRegistry::init('Model2')->find('allThatIWant');

, если хотите использоватьэто в нескольких случаях, то вы должны попробовать

$this->model2 = & ClassRegistry::init('Model2') 
$this->model2->find('allThatIWant');
2 голосов
/ 23 января 2015

Начиная с версии 2.6.x, конечно, это ClassRegistry :: init ().

Есть существенная разница.App :: import будет просто включать / требовать его.С другой стороны, ClassRegistry :: init () создаст его экземпляр и получит полностью загруженный объект модели.

Например, вы загрузили модель в beforeFilter вашего AppController.Вы добавляете к нему некоторые пользовательские свойства, используя $ this-> Model -> __ что-то .Теперь вы вызываете ClassRegistry :: init ('Model') где-то, где у вас нет доступного объекта $ controller, например, в поведении.У объекта, возвращаемого ClassRegistry :: init ('Model'), будет ваше собственное свойство $ this-> Model -> __ что-то в такте.

Btw, $ controller->loadModel () кажется идеальным способом загрузить модель, где у вас есть доступный объект $ controller, например, в ваших компонентах.

0 голосов
/ 08 марта 2011

$this->loadModel('model name') будет делать, если вам не нужно это для всего контроллера, затем просто определите отношения в модели, такие как hasone, ownsto ... и вызовите $this->model->model2.

...