2014-10-26 2 views
0

В чем разница между $ uses и $ this-> loadModel()?
CakePHPCookbook, Выпуск 2.
61:
$ this-> loadModel (»User», 2);
страница 62:
класс RecipesController расширяет AppController {
public $ uses = array ('Recipe', 'User');

Заранее благодарен!

ответ

1

Использование определяет, к каким моделям контроллер имеет доступ по умолчанию, если вы не определяете это, это будет модель для этого контроллера, т.е. UserController будет загружать Пользователя по умолчанию (и любые модели, определенные в использовании $ AppController's).

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

У вас также есть возможность использовать ClassRegistry :: init ('Recipe') -> find ('all'); и т. д., который вернет один экземпляр модели для одного использования, но не добавит модель к карте объектов.

Что вы действительно должны спросить себя, почему вы загружаете модель в контроллер? В идеале у вас должны быть отношения между вашими моделями, например, если вы находитесь в контроллере рецептов, вы можете вызвать $ this-> Recipe и $ this-> Recipe-> User.

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

Edited согласно комментарий РПС в

+0

«_ [...] каждый раз, когда метод управления называется модель будет added._» Не уверен, что именно вы пытаетесь сказать, но это не правильно, даже в старых версиях Cake. Почему я упоминаю старые версии Cake? Поскольку с 2.x модели [** ленивы загружены **] (http://book.cakephp.org/2.0/en/appendices/new-features-in-cakephp-2-0.html#models) , определение '$ uses' в одиночку не загружает ничего, модель будет загружаться только после того, как вы попытаетесь получить к ней доступ, см. [**' Controller :: __ isset() '**] (https://github.com /cakephp/cakephp/blob/2.5.5/lib/Cake/Controller/Controller.php#L352). – ndm

+0

Спасибо большое. У меня есть этот фрагмент в Plugin JobDirectory, и он работает: класс JobCategoryNamesController расширяет JobDirectoryAppController { // public $ uses = array ('JobDirectory.JobCategoryName'); public function index() { //$this->loadModel('JobDirectory.JobCategoryName '); $ res = $ this-> JobCategoryName-> find ('all'); $ this-> set ('res', $ res); } } Как вы можете видеть, $ uses и $ this-> load прокомментированы. Как это работает? – jstar

+0

Отредактировано согласно вашим комментариям ndm, я ошибся с моим первоначальным ответом. jstar по умолчанию JobCategoryNames будет использовать модель JobCategoryName, а любая из указанных в JobDirectoryAppController :: $ использует. Если вы укажете $ uses, вам нужно убедиться, что у вас есть JobCategoryName в массиве, чтобы он продолжал работать. – HelloSpeakman

0

На основе документации по uses и loadmodel, $uses простой способ иметь одну или несколько моделей, доступных для всего контроллера, и loadModel используется, когда вы хотите иметь доступ к модели, которая не в $uses списке

Смежные вопросы