2012-04-16 80 views
3

我在项目中获得一个好的文件夹结构时遇到了一些麻烦,我想知道我可以使用哪些其他方式来构造我的文件。如何构建MVC模型和ORM模型

我目前正在一个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. 
    } 
} 
?> 

现在的问题是,我有2种模型。其中我基本上使用getters/setter来获取和存储数据到数据库(从我的控制器到我的模型)。

而我有另一个模型,其中设置了验证规则......我不想在同一个文件夹中混合使用这两个模型。所以我必须为此提出另一个结构。喜欢的东西:

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

这只是我的模型是不是一个真正的“仓库”,因为它没有存储在回购类中的任何对象,并没有commit()方法之类的东西。

我也不能存储在实体文件夹中的第2个型号(验证),因为他们不是实体在所有...

任何想法,我应该如何构建这个..?

+0

受益匪浅? – 2012-04-16 07:34:32

+6

@webbandit因为我创建了自己的'框架'来获得更多的经验。我知道我可以轻松使用其他框架。但我也想通过这样做来学习,我自己也是这么做的。 – Vivendi 2012-04-16 07:56:02

回答

10

您应该了解的第一件事是MVC中的模型不是类/对象。它是一个由众多对象组成的图层。我懒得做同样的song'n'ance,所以只是读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代码。你为什么不使用一些准备去farmeworks与像Kohana的ORM,你可以从学习dependency injection

..我的2美分

+0

虽然我必须不同意ORM是真正的反模式(有些人会说回购模式相同)。我不认为这是糟糕的。我仍然会使用它。但是这是另外一个讨论。但是你给了我关于结构部分的一些很好的见解:-) – Vivendi 2012-04-17 10:16:30

+1

@Vivendi,我只是希望你阅读关于ORM的文章,而不是把它作为一个你不同意的东西作为一个原则问题。 – 2012-04-17 11:49:27