【问题标题】:how to structure MVC models and ORM models如何构造 MVC 模型和 ORM 模型
【发布时间】:2012-04-16 07:21:19
【问题描述】:

在我的项目中获得良好的文件夹结构时遇到了一些麻烦,我想知道我可以使用哪些其他方式来构建我的文件。

我目前在 MVC 结构化文件夹中工作。

www/
  Controllers/
  Models/
  Views/

到目前为止没有什么特别的。但我也在使用 ORM 系统。有了它,我可以轻松地从我的数据库中获取一个“对象”,例如:

ORM::load('table');

现在这种代码应该驻留在模型中,对吧?所以我会得到这样的东西:

<?php
class userModel
{
    public function getAllUsers ( )
    {
        return ORM::load('table');
    }

    public function getUserById ( $id )
    {
        return ORM::load('table', 'userid=?', array($id));
    }
}
?>

在我看来到目前为止看起来不错...但还有一件事。我还可以在使用 ORM 系统时指定一个“模型”。有了这个模型,我基本上可以设置验证规则。像这样:

ORM::withModel('authModel');

这让 ORM 知道,在向数据库添加新行(或更新现有行)之前,它应该首先检查以下模型的验证规则。

<?php
class authModel //Or maybe authValidation??
{
    // Method gets automatically triggered when an update is done with the ORM
    public function onUpdate ( $obj )
    {
        if ( $obj->username == '' )
            throw new \Exception('No username');
    }

    public function onInsert ( $obj )
    {
        // Validations here too.
    }
}
?>

现在的问题是,我有两种模型。我基本上使用 getter/setter 来获取数据并将数据存储到数据库(从我的控制器到我的模型)。

我还有另一个模型,其中设置了验证规则...我不想将两者混合在同一个文件夹中。所以我必须为此想出另一种结构。比如:

www/
  Controllers/
  Models/
    Repositories/
    Entities/
  Views/

只是我的模型不是真正的“存储库”,因为它没有在 repo 类中存储任何对象,也没有 commit() 方法或类似的东西。

我也无法将第二个模型(用于验证)存储在实体文件夹中,因为它们根本不是实体...

知道我应该如何构建这个..??

【问题讨论】:

  • 你为什么不用像 Kohana 这样的 ORM 准备好去农场?
  • @webbandit 因为我正在创建自己的“框架”以获得更多经验。我知道我可以轻松使用其他框架。但我也想通过自己的方式学习。

标签: php model-view-controller directory-structure


【解决方案1】:

首先你应该明白的是,MVC 中的 Model 不是一个类/对象。它是一个层,由大量对象组成。我懒得再做同样的 song'n'dance 了,所以请阅读this comment(跳到“旁注”部分)。

您困惑的根源在于您在称为“模型”的类组中认识到两种不同的职责。您实际上拥有负责业务逻辑的类实例(例如您的 UserModel 类),以及一个名为“ORM”的单独事物,它加载和存储内容。而且您有身份验证,这不适合任何一个组。

我会采用这样的结构:

/application
    /modules
        /public
            /controllers
            /templates
         /admin
            /controllers
            /templates
         ....
    /views
    /model
        /logic
        /persistence
        /services
/framework

您可能会注意到/application 中有一个单独的/views 文件夹,并且每个模块都有一个单独的/templates。这是因为,在正确的 MVC 中,视图是类的实例,负责表示逻辑并且通常处理多个模板。如果写得好,它们也是一个可重用的结构。

最后一点:不要尝试使用 ORM。为每个需要它的域对象创建一个数据映射器。有些人认为ORMs to be antipatterns。此外,避免静态调用 .. 那不是 OO 代码。了解dependency injection 会让您受益匪浅

.. 我的 2 美分

【讨论】:

  • 尽管我必须不同意 ORM 确实是一种反模式(例如,有些人对 repo 模式也这么说)。我不认为这是坏事。我还是会用的。但这是另一回事。但是你给了我一些关于结构部分的很好的见解:-)
  • @Vivendi ,我只是希望您阅读有关 ORM 的文章,而不是将其视为您原则上不同意的内容。
猜你喜欢
  • 2019-03-10
  • 2011-12-07
  • 1970-01-01
  • 1970-01-01
  • 2014-12-26
  • 2023-03-31
  • 2012-12-31
  • 1970-01-01
  • 2013-05-02
相关资源
最近更新 更多