Как получить класс контроллера, который расширяют другие контроллеры? - PullRequest
2 голосов
/ 25 апреля 2011

Мне нужен ThingsController, который расширяет AppController. Мои отдельные контроллеры будут расширять ThingsController. Функции повторяются для каждой модели, и каждая модель имеет свой собственный в основном резервный контроллер.

А) Это хорошая идея?

Б) Как мне это сделать? Я попытался добавить его в каталог контроллеров, но торт не нашел его.

в) Как мне кодировать beforeFilter и beforeRender? Это включает в себя Auth.

Ответы [ 2 ]

10 голосов
/ 25 апреля 2011

Будет работать нормально.Контроллеры - это не что иное, как классы php, их можно наследовать любым удобным для вас способом, если только Cake может их найти.

  1. Создайте свой ThingsController и поместите его в app / controllers / things_controller.php
  2. В производном контроллере добавьте App::import('Controller', 'Things'); над определением класса.
  3. Определитекласс правильно: class TestController extends ThingsController {}

Фильтры будут наследовать как обычно.

1 голос
/ 20 августа 2014

в настоящее время вы можете использовать App::uses('ClassName', 'Folder/Subfolder')

расширение класса ничего не делает для вас с точки зрения таблиц в базе данных ... как только вы расширяете модель, ваше расширенное имя модели - это имя таблицы, которую торт будет искать в базе данных. вы не можете хранить общие поля в общей таблице, а расширенные поля - в таблице расширенного класса. для этого вам все равно нужны ассоциации моделей, поэтому нет смысла расширять модели и контроллеры в cakePHP. чтобы несколько моделей работали с одной и той же таблицей, вы должны переопределить таблицу, которую модель использует в определении модели, с помощью $ useTable, но я не могу представить себе особого смысла в этом, кроме того, что вашему проекту нужно общаться с таблицами, которые вы можете ' переименовать.

так что в вашем случае я бы сказал Automobile extends AppModel, Car extends AppModel, Truck extends AppModel, (нормальные модели тортов) Truck $belongsTo Automobile, Car $belongsTo Automobile. поместите ваши общие свойства и методы в Automobile точно так же, как если бы вы собирались расширяться от Automobile, и вместо наследования методов вы получаете доступ к ним по ассоциации моделей, как в $this->Truck->Automobile->vin с нотацией объекта, а не с $this->Truck->vin, что Вы хотите сделать с наследованием.

Другими словами, вы не станете ближе к нормализации базы данных, расширив Модели в cakePHP - это делается посредством ассоциаций моделей. вы наследуете от AppModel и AppController, чтобы получить базовые методы, такие как find (), save () и т. д., а также обратные вызовы, такие как beforeFilter (), afterRender () и т. д. WRT, когда вы переопределяете обратные вызовы, такие как beforeFilter () в Расширяя класс, вы должны вызвать parent::beforeFilter() внутри метода, иначе все сломается.

Полагаю, вы могли бы иметь таблицу со всеми полями для расширенных свойств в ней (табличный автомобиль с полями year, vin и также box_length, trunk_litres), затем расширять Models из базового класса и переопределять таблицу, которую расширенные модели используйте для использования имени таблицы базового класса (class Car extends Auto {$useTable = auto}), но это оставляет много пустых полей в таблице и не является надлежащей нормализованной структурой таблицы. Можно сказать, что VIN будет уникальным полем среди всех расширенных классов без особых усилий. не знаю, как в этом случае работает auto_increment для идентификатора. но затем требуется дополнительная работа для извлечения из этой общей таблицы записей данного типа, которые соответствуют типу расширенного класса (table auto has field auto_type, class Truck extends Auto {$autoType = 'truck'}), так что никакого выигрыша.

аналогично, при просмотре нет усиления. если у вас есть class AutoController extends AppController { function displayListing()}, а затем class TruckController extends AutoController, вы можете позвонить TruckController->display_listing(), но если вы не скажете действию $this->render('Auto/display_listing'), вам потребуется создать дубликат представления в /View/Truck/display_listing.ctp, и если вы выполните переопределение, тогда представление в View/Auto/display_listing.ctp должно иметь много операторов if, чтобы отобразить части представления, специфичные для грузовика или автомобиля, поэтому опять нет выгоды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...