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