Сообщество,
Из других API-интерфейсов MVC-Frameworks/persistence-API, таких как спящий режим в мире java, я знаю передовой механизм наследования от сгенерированной структуры модели и использования этих унаследованных моделей в качестве DAO в вашем приложении. Мне особенно нравится этот подход, потому что вы можете легко перепечь свои модели после изменений в базе данных, чтобы настроить ассоциации моделей, не перезаписывая свой код доступа (пользовательские методы, обратные вызовы событий и т. д.).
Однако я не смог найти ничего подобного для CakePHP.
Что я уже пробовал
Мой первый подход к достижению этой цели заключался в использовании функции CakePHP App::build(). Я зарегистрировал новые плагины-директивы для запеченных моделей и контроллеров и заменил пакеты моделей и контроллеров по умолчанию моими собственными папками реализации:
в bootstrap.php:
App::build(array(
'BakedModel' => array(ROOT. DS . APP_DIR . '/Model/'),
'BakedController' => array(ROOT. DS . APP_DIR . '/Controller/')
),
App::REGISTER
);
App::build(array(
'Model' => array(ROOT. DS . APP_DIR . '/Model/impl/'),
'Controller' => array(ROOT. DS . APP_DIR . '/Controller/impl/')
),
App::RESET
);
После того, как я создал свои собственные контроллеры и модели в папках impl, импортируя и наследуя от ссылающейся запеченной модели:
моя пользовательская модель:
App::uses('Inmessage', 'BakedModel');
class InmessageDao extends Inmessage {
var $useTable = 'inmessages';
...
}
Однако это работает, пока я назначаю новое уникальное имя для пользовательских классов моделей (т.е. InmessageDao расширяет Inmessage). Проблема с использованием другого имени модели заключается в том, что все унаследованные отношения моделей относятся не к другим моим пользовательским реализациям, а, конечно, к запеченным моделям. Поэтому мне нужно было бы скопировать и изменить все отношения в моих пользовательских моделях, чтобы заставить их работать, в которых тогда отсутствует преимущество наследования. Так что я ничего не получаю здесь.
Если я попытаюсь использовать идентичное имя для своих пользовательских моделей, Cake больше не сможет адресовать разные объекты. Такой подход приводит к исключению ClassNotFoundException.
class Inmessage extends Inmessage {
...
}
Итак, мой вопрос:
Кто-нибудь знает, есть ли способ правильно наследовать модели и использовать их вместо запеченных моделей?
Или, в качестве альтернативы, другой способ перепрошить только отношения модели и не перезаписывать написанный код в классах модели?
Заранее спасибо!
пс. В настоящее время я использую версию 2.5.8.