使用自定义模型,继承CakePHP中的烘焙模型

时间:2015-02-13 12:38:51

标签: cakephp inheritance model overwrite cakephp-bake

社区,

从其他MVC-Frameworks / persistance-API,例如java世界中的hibernate,我知道一种最佳实践机制,可以从生成的模型结构继承并在应用程序中将这些继承的模型用作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';
    ...
}

但是,只要我为自定义模型类指定一个新的唯一名称(i.E. InmessageDao扩展Inmessage),这就有效。 使用另一个modelname的问题是,所有继承的模型关系都不是指我的其他自定义实现,而是引用烘焙模型。 所以我需要将所有关系复制并更改为我的自定义模型以使其工作,然后缺乏继承的优点。所以我不在这里任何事情。

如果我尝试为自定义模型使用相同的名称,那么Cake无法再处理不同的对象。这种方法导致 ClassNotFoundException

class Inmessage extends Inmessage {
    ...
}

所以我的问题是:

是否有人知道是否有正确继承模型的方法并使用它们而不是烘焙模型?

或者另一种方法是只重新模仿模型关系而不是覆盖模型类中的编写代码?

提前致谢!

PS。我目前正在运行2.5.8版本。

2 个答案:

答案 0 :(得分:1)

  

我特别喜欢这种方法,因为你可以很容易地重拍你的   数据库更改后的模型,以便在没有的情况下调整模型关联   覆盖您的访问代码(自定义方法,事件回调等)。

这不是它在CakePHP中的工作原理。如果更改架构,模型将检测更改,除非您使用Model :: $ _ schema手动描述架构。

我不知道你说的Java框架,但这听起来像你有一个Schema类,你的模型扩展了该模式类。

但是,如果数据库模式遵循CakePHP约定,Cake 将检测到关联。因此,如果有一个带有user_id字段的配置文件表,您可以执行$ User-> Profile - 即使没有手动创建关联。但不建议这样做。

  

或者另一种只重塑模型关系的方法   不覆盖模型类中的书面代码?

此外,我还没有看到手动添加新关联的问题,这只需几秒钟。一旦你将它们烘焙过,就不需要反复烘烤模型。

如果您正在寻找实现可重用代码的地方,请查看行为或将其放入AppModel中,如果应用中的每个模型都需要此功能。

我不确定我的整个问题是否正确,希望这会让事情变得更加清晰。

答案 1 :(得分:1)

我认为在Cake中执行此操作的一种简单方法是创建一个&#34;插件&#34;,将模型存储在该插件中,并在需要时包含在控制器&#34; plugin.model&#34;。< / p>

模型可以扩展到烘焙生成的模型,所有其他的东西都可以在插件模型中,当你烘焙时,不需要重写关系,验证等......

我希望这可能有所帮助!