社区,
从其他MVC-Frameworks / persistance-API(例如Java世界中的休眠)中,我知道了一种最佳实践机制,可以从生成的模型结构继承并将这些继承的模型用作应用程序中的DAO。我特别喜欢这种方法,因为您可以在数据库更改后轻松重新创建模型以调整模型关联,而无需覆盖访问代码(自定义方法,事件回调等)。
但是,我找不到与CakePHP类似的东西。
到目前为止我尝试过的
我实现此目标的第一种方法是使用CakePHPs 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';
...
}
但是,只要我为自定义模型类分配了新的唯一名称(iE InmessageDao扩展了Inmessage),此方法就起作用。使用另一个模型名的问题是,所有继承的模型关系都不会引用我的其他自定义实现,而是引用烘焙的模型。因此,我需要将所有关系复制并更改到我的自定义模型中,以使其正常工作,然后缺少继承的优势。所以我在这里什么都没得到。
如果我尝试对自定义模型使用相同的名称,则Cake无法再处理不同的对象。这种方法导致ClassNotFoundException
class Inmessage extends Inmessage {
...
}
所以我的问题是:
有人知道是否存在适当地继承模型并使用它们代替烘焙模型的方法吗?
或者是另一种仅重新建立模型关系而不覆盖模型类中编写的代码的方法?
提前致谢!
ps。我当前正在运行2.5.8版。
我特别喜欢这种方法,因为您可以在数据库更改后轻松重新创建模型以调整模型关联,而无需覆盖访问代码(自定义方法,事件回调等)。
这不是CakePHP中的工作方式。如果更改了架构,则模型将检测到更改,除非您使用Model :: $ _ schema手动描述了架构。
我不知道您在说什么Java框架,但这听起来像您有一个Schema类,并且您的模型扩展了该架构类。
但是,如果数据库架构遵循CakePHP约定,则Cake将检测到关联。因此,如果存在带有user_id字段的配置文件表,即使没有手动创建关联,也可以执行$ User-> Profile。但这是不推荐的。
或者是另一种仅重新建立模型关系而不覆盖模型类中编写的代码的方法?
另外,我看不到手动添加新的assoc的问题,只需几秒钟的时间。烘焙模型后,无需一遍又一遍地重新烘焙模型。
如果您正在寻找实现可重用代码的地方,请查看“行为”,或将其放入AppModel中(如果应用程序中的每个模型都需要该功能)。
我不确定我是否能正确解决您的全部问题,希望这可以使一切变得更加清晰。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句