0

社区,

从其他 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';
    ...
}

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

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

class Inmessage extends Inmessage {
    ...
}

所以我的问题是:

有谁知道是否有一种方法可以正确继承模型并使用它们而不是烘焙模型?

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

提前致谢!

附言。我目前正在运行 2.5.8 版。

4

2 回答 2

1

我特别喜欢这种方法,因为您可以在数据库更改后轻松地重新烘焙模型以调整模型关联,而不会覆盖您的访问代码(自定义方法、事件回调等)。

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

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

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

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

此外,我认为手动添加新关联没有问题,只需几秒钟。一旦你烘烤了模型,就没有必要一遍又一遍地重新烘烤它们。

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

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

于 2015-02-13T13:04:11.637 回答
1

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

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

我希望这可能会有所帮助!

于 2015-02-13T18:22:10.137 回答