我一直在阅读和学习面向对象的编程(Head First Object-Oriented Analysis and Design和Code Complete: A Practical Handbook of Software Construction - 感谢StackOverflow上的建议。我也一直在学习如何使用几个PHP MVC框架(特别是Codeigniter和Kohana)。
我已经阅读过的一些面向对象的原理由MVC框架以不同的方式处理。我想我已经设法理解了差异和做出决定的原因(完整且易于使用的解决方案),但我想测试我的假设......所以如果你要幽默我......请评论或纠正。
假设#1:
考虑到Web应用程序的正确抽象,包含类库的目录应位于包含表示文件的目录之外。该组织遵守DRY(“不要重复自己”)主体,允许多个演示文件夹(www.domain.com,management.domain.com,api.domain.com等)使用相同的对象。
假设#2:
如果您的所有类都位于演示文件夹之外,那么MVC实现中的模型只使用这些类的实例。如果这是真的,那么MVC框架只是一个表示类(控制器),它有助于管理输入(GET和POST请求),响应(模型或实例)和输出(视图或模板)。
假设#3:
如果MVC框架只是一个表示类,那么控制器实例初始化的数据库类会破坏控制器类的抽象。模型(控制器实例)不应该有一个(“有一个”)数据库,它应该有一个来自类库的东西(用户,产品),那个东西应该有一个数据库。
假设#4:
此外,如果MVC框架只是一个表示类,则控制器实例初始化的数据库类与控制器类紧密耦合。从一种存储方法改为另一种存储方法需要对所有模型进行重新分解。
假设#5:
使用HMVC框架时,包含数据库的控制器的问题更严重,因为您的模型更多模块(更多模型,更多重新分解)。
更新
对不起,我可能已经使用了控制器和模型一点松散...也许这说明紧耦合。我混淆的根源来自database class syntax。
使用模型,不应该是:
$user = new User($id);
$data['name'] = $user->getName();
$data['title'] = $user->getTitle();
return $data
而不是:
$query = $this->db->get_where('user', array('id' => $id), 1, 0);
$row = $query->row_array();
$data['name'] = $row['name'];
$data['title'] = $row['title'];
return $data
答案 0 :(得分:5)
假设#1:考虑网络的正确抽象 应用程序,包含的目录 课程库应该是 位于目录之外 包含演示文稿文件。 该组织坚持干旱 (“不要重复自己”)校长 允许多次演示 文件夹(www.domain.com, management.domain.com,api.domain.com, 等)使用相同的对象。
这是正确的,因为库不用于表示(即不是视图)。它们是将在多个控制器中使用的模块。通常他们不应该使用持久性数据,因为它们不是模型,但在某些情况下(例如,codeigniter会话)。
假设#2:
如果找到所有课程 在演示文件夹之外, 那么MVC中的模型 实现只使用实例 那些课程。如果那是真的那么 MVC框架只是一个 演示类(控制器) 这有助于管理输入(GET& POST请求),响应(模型 或实例)和输出(视图或 模板)。
这对我来说有点混乱。你是正确的控制器只是用于编排GET和POST请求,但是当然要调用“表示类”。控制器负责模型(持久数据)和视图(数据表示)的编排。
假设#3:
如果MVC框架只是一个 表示类,然后是数据库 类控制器实例 初始化打破了抽象 控制器类。一个模型(的 控制器实例)不应该有 (“有一个”)数据库,应该有一个 来自图书馆的东西(用户,产品) 课程和那件事应该有 数据库。
这很令人困惑,我真的不明白你在这里说的是什么。 MVC只是一个“表示类”,模型没有“数据库”,框架可以保存与数据库的连接,模型是数据库的抽象(对象,如用户,产品)。
假设#4:
此外,如果MVC框架是 只是一个演示类, 数据库类即控制器 实例初始化太紧了 加上控制器类。 从一种存储方式改为 另一个需要重新考虑所有因素 模特。
控制器不初始化数据库,框架通常只处理控制器访问数据库的抽象(模型)。如果数据库系统被任何东西替换,则仅重新考虑模型接口的实现。
假设#5:
使用HMVC框架,问题与 包含数据库的控制器 更糟糕的是,因为你的模型更多 模块(更多型号,更多 重新分解)。
HMVC并不一定意味着更多的模型。使用HMVC允许来自项目的可移植模块,可以跨多个控制器访问。通常,您会看到Libraries在非HMVC框架中执行此操作,即不具有某些db / templating的库。
答案 1 :(得分:0)
更新: 只是想回答/评论我的疑惑问题。
Kohana提供了一个模块文件夹,用于解决我之前的问题。
例如,如果您使用Plesk设置具有子域的域,则文件夹结构将如下所示。
httpdocs
subdomains
+--management
+--httpdocs
如果您想在域和子域之间共享代码,使用Kohana的模块,您可以像这样设置文件系统:
modules
system
httpdocs
+--application
+--index.php
subdomains
+--management
+--httpdocs
+--application
+--index.php
其中 httpdocs / index.php 和 subdomains / management / httpdocs / index.php 具有以下内容:
$application = 'application';
$modules = '/root/pathto/modules';
$system = '/root/pathto/system';
域和子域中使用的任何对象都可以放在模块文件夹中以供应用程序使用。
希望有所帮助。