代码之家  ›  专栏  ›  技术社区  ›  TurbuLenz

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

  •  0
  • TurbuLenz  · 技术社区  · 10 年前

    社区

    从其他MVC框架/持久化API(如java世界中的hibernate)中,我知道一种从生成的模型结构继承并将这些继承的模型用作应用程序中的DAO的最佳实践机制。 我特别喜欢这种方法,因为您可以在数据库更改后轻松地重新制作模型,以调整模型关联,而无需覆盖访问代码(自定义方法、事件回调等)。

    然而,我找不到CakePHP的类似内容。

    到目前为止我所做的一切

    我实现这一目标的第一个方法是使用CakePHPs 应用程序::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版本。

    2 回复  |  直到 10 年前
        1
  •  1
  •   floriank    10 年前

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

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

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

    然而,Cake将检测到关联 如果 DB模式遵循CakePHP约定。因此,您可以执行$User->如果存在带有user_id字段的配置文件表,则配置文件-即使不手动创建关联。但不建议这样做。

    或者另一种仅重新生成模型关系和 不覆盖模型类中编写的代码?

    另外,我认为手动添加新的关联没有问题,只需几秒钟。一旦你烤好了模型,就不需要一遍又一遍地重新烤。

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

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

        2
  •  1
  •   Newton Pasqualini Filho    10 年前

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

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

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