3

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

我目前正在使用 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() 方法或类似的东西。

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

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

4

1 回答 1

10

您应该了解的第一件事是 MVC 中的模型不是类/对象。它是一个层,由大量对象组成。我懒得再做同样的歌曲'n'dance,所以只需阅读此评论(跳到“旁注”部分)。

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

我会采用这样的结构:

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

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

最后一点:不要尝试使用 ORM。为每个需要它的域对象创建一个数据映射器。有些人认为ORM 是反模式。此外,避免静态调用 .. 那不是 OO 代码。你可以从学习依赖注入中受益匪浅

.. 我的 2 美分

于 2012-04-17T05:37:38.827 回答