如何构建MVC模型和ORM模型

Viv*_*ndi 3 php model-view-controller directory-structure

我在项目中获得一个好的文件夹结构有些麻烦,我想知道我可以用什么方法来构建我的文件.

我目前正在一个MVC sturctured文件夹中工作.

www/
  Controllers/
  Models/
  Views/
Run Code Online (Sandbox Code Playgroud)

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

ORM::load('table');
Run Code Online (Sandbox Code Playgroud)

现在这种代码应该存在于模型中吗?所以我会得到这样的东西:

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

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

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

ORM::withModel('authModel');
Run Code Online (Sandbox Code Playgroud)

这使ORM知道在向DB添加新行(或更新现有行)之前,它应首先检查以下模型的验证规则.

<?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.
    }
}
?>
Run Code Online (Sandbox Code Playgroud)

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

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

www/
  Controllers/
  Models/
    Repositories/
    Entities/
  Views/
Run Code Online (Sandbox Code Playgroud)

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

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

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

ter*_*ško 10

您应该了解的第一件事是MVC 中的Model不是类/对象.它是一个由多个对象组成的层.我懒得再次做同样的歌曲,所以请阅读此评论(跳到"旁注"部分).

您混淆的根源在于您在称为"模型"的类组中识别出两种不同的职责.实际上,您正在拥有负责业务逻辑的类实例(如您的UserModel类),以及一个名为"ORM"的单独的东西,它可以加载和存储内容.并且您具有身份验证,这不适合任何一个组.

我会选择这样的结构:

/application
    /modules
        /public
            /controllers
            /templates
         /admin
            /controllers
            /templates
         ....
    /views
    /model
        /logic
        /persistence
        /services
/framework
Run Code Online (Sandbox Code Playgroud)

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

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

我的2美分