我在项目中获得一个好的文件夹结构时遇到了一些麻烦,我想知道我可以用什么方法来构建我的文件。
我目前正在使用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知道在向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.
}
}
?>
现在的问题是,我有2种型号。我基本上使用getter / setter来获取数据并将数据存储到数据库(从我的控制器到我的模型)。
我还有另一个模型,其中设置了验证规则...我不想在同一个文件夹中混合两者。所以我必须为此提出另一种结构。类似的东西:
www/
Controllers/
Models/
Repositories/
Entities/
Views/
只是我的模型不是真正的“存储库”,因为它不会在repo类中存储任何对象,也没有commit()方法或类似的东西。
我也无法在Entities文件夹中存储第二个模型(用于验证),因为它们根本不是实体...
知道我应该如何构建这个...... ??
答案 0 :(得分:10)
您应该首先理解的是MVC中的 Model 不是类/对象。它是一个由多个对象组成的层。我懒得再次做同样的 song'ndance ,所以请阅读this comment(跳到“旁注”部分)。
你混淆的根源在于你在被称为“模型”的类组中认识到两种不同的责任。实际上,您正在拥有负责业务逻辑的类实例(例如您的UserModel
类),以及一个名为“ORM”的单独实例,它负载和存储内容。并且您有身份验证,不适合任何一个组。
我会选择这样的结构:
/application
/modules
/public
/controllers
/templates
/admin
/controllers
/templates
....
/views
/model
/logic
/persistence
/services
/framework
您可能会注意到/views
中有一个单独的/application
文件夹,而且每个模块都有一个单独的/templates
。这是因为,在适当的MVC中,Views是类的实例,负责表示逻辑并且通常兼顾多个模板。如果写得好,它们也是可重复使用的结构。
最后一点:不要尝试使用ORM。为需要它的每个域对象创建一个datamapper。有些人会考虑ORMs to be antipatterns。另外,避免静态调用..那不是OO代码。通过了解dependency injection
,您可以从中受益匪浅..我的2美分