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

using custom models, inheriting from baked models in CakePHP

社区,

从其他 MVC 框架/持久性 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';
    ...
}

然而,只要我为自定义模型分配一个新的唯一名称-类(即 InmessageDao 扩展 Inmessage),这就可以工作。 使用另一个模型名称的问题是所有继承的模型关系都不是指我的其他自定义实现,而是指烘焙模型。 所以我需要将所有关系复制并更改到我的自定义模型中才能使其工作,这样就缺乏继承的优势。所以我在这里没有得到任何东西。

如果我尝试为自定义模型使用相同的名称,Cake 将无法再对不同的对象进行寻址。这种方法导致 ClassNotFoundException

class Inmessage extends Inmessage {
    ...
}

所以我的问题是:

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

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

提前致谢!

ps。我目前 运行 版本 2.5.8.

I especially like this approach because you can easily rebake your models after database changes to ajust the model associations without overwriting your access code (custom methods, eventcallbacks, etc.).

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

我不知道你说的 Java 框架,但这听起来你有一个架构 class 并且你的模型扩展了该架构 class.

但是,如果数据库架构遵循 CakePHP 约定,Cake 将检测到关联 。因此,如果存在带有 user_id 字段的配置文件 table,您可以执行 $User->Profile - 即使无需手动创建关联。但不推荐这样做。

Or alternatively another way of rebaking only the model-relations and not overwriting the written code in the model classes?

我也没有发现手动添加新关联有问题,这只是几秒钟的问题。烘烤模型后,无需一遍又一遍地重新烘烤模型。

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

我不确定我是否理解了你的整个问题,希望这能让一切更清楚。

我认为在 Cake 中一个简单的方法是创建一个 "plugin",在该插件中存储模型,并在需要时将其包含在控制器中 "plugin.model"。

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

希望对您有所帮助!