10

As a mostly self-taught programmer I'm late to the game when it comes to design patterns and such. I'm writing a labor management webapp using CodeIgniter.

I did a bit of MVC ASP.NET/C# and Java at school, and the convention was that your model mainly consisted of classes that represented actual objects, but also abstracted all the database connection and such...which is pretty standard MVC stuff from what I've gathered.

I imagine I'm right in saying that CI abstracts the database connection completely out of sight (unless you go looking), which is par for the course, and the models you can create can abstract the 'generic' CRUD methods a bit more to create some methods that are more useful for the specific model.

The thing I have a problem with, because it's different to what I'm used to with MVC, is that whenever you say...return a row from a database, the convention is to just put it in an associative array or standard object with the properties representing the data from the row.

In ASP you'd have actual classes that you could construct to store this information. For example you'd have a House class and the data would be stored as properties (e.g. bedrooms, bathrooms, address) and the methods would represent useful things you could do with the data (e.g. printInfo() may print("$address has $bedrooms bedrooms and $bathrooms bathrooms!')).

I'm getting the impression — just from code I've seen around the Internet — that this isn't the standard way of doing things. Are you supposed to just use arrays or generic objects, and say...do $this->house_model->print_info($houseobject) instead of $houseobject->print_info();?

Thanks.

4

3 回答 3

28

尽管它声称相反,Codeigniter 根本不使用 MVC(事实上,很少有 Web 框架这样做!)它实际上使用了 PAC(Presentation-abstraction-control)架构。本质上,在 PAC 中,表示层由表示器(CodeIgniter 称为控制器)提供数据,而在 MVC 中,视图从模型中获取自己的数据。由于 MVC 的这种错误标记而存在混淆。

因此,CodeIgniter(以及大多数其他流行的 Web 框架)不鼓励使用适当的模型,而只是使用非常基本的数据访问它的位置。由于“胖控制器”,这会导致大量问题。与域相关的代码都不能重用。

进一步阅读:

这是 PHP 社区中普遍存在的混淆点(MVC 与 PAC 文章将问题确定为源自 PHP 社区。该问题写于 2006 年,没有任何改变,如果有的话,情况会变得更糟,因为有更多的框架和教程教一个错误的 MVC 定义。)以及为什么那些来自 Web 开发之外的背景的人在看“MVC”PHP 代码时会感到困惑,这是可以理解的。PHP 中的大多数“MVC”实现都不是 MVC。您认为模型应该结构正确是正确的,将自己标记为 MVC 是错误的 CodeIgniter。

于 2012-12-11T14:20:37.150 回答
1

CodeIgniter 在遵循 MVC 模式方面非常灵活,这取决于你想强制执行多少。您将在网上找到的大多数 CodeIgniter 代码与您描述的完全一样,模型实际上只是方法的集合,并不力求严格表示一个对象。

但是,如果您喜欢在 CI 中编写代码(这是我经常做的事情),您也可以使用这种方式进行编码。它使代码更具可维护性和可读性,并且看起来更好。

PS - 如果你刚接触 PHP 中的 MVC,你可能想看看周围。像 CodeIgniter 和 CakePHP 这样的框架(在某种程度上)是上一代的。CI 最初是为 PHP4 编写的,其中 OOP 支持在 PHP 中有点参差不齐。一个名为Fuel的 CI 分支是专门为解决这个问题而创建的(尽管我相信在某些时候,他们只是决定从头开始重写它会更好地为他们服务)。CI 确实具有拥有大量文档和在线帮助的优势,因为它比 Fuel 使用更广泛。

于 2012-12-11T03:13:54.430 回答
1

控制器

 // get the houses result from the model 
 // return it as an object 
 if( ! $houses = $this->house_model->findHouses($search) )
 { // if no results - call a no results view 
 $this->load->view( 'no_results', $data );
 }
 else
 { 
 // pass the houses object to data so it automatically goes to view
 data['houses'] = $houses ; 

 // Call your view
 $this->load->view( 'house_results', $data );
 }

看法

// we already know we have at least one house,
// thats what the controller is for, so we dont need to do an isset() etc for $houses

foreach $houses as $house :

echo 'This fine house at ' . $house->address . 'has '. $house->bedrooms . ' bedrooms and ' $house->bathrooms . ' bathrooms' ; 

endforeach ;   

显然有不同的方法可以在视图中创建最后一个句子,但我们的想法是,当我们到达视图时 - 它尽可能简单。

所以对于复杂的查询,比如向我展示好学校旁边的所有房子,有 2 间卧室和我的宠物 Ocelot 的房间。这就是模型中发生的事情。所有混乱的条件和业务规则。视图应该是具体的——如果你没有结果——那么就只显示一个没有结果的视图。Versus - 在视图中检查结果,然后根据没有结果更改显示。您制作的视图越具体,构建起来就越容易,它会鼓励您在控制器和模型中做出选择。

于 2012-12-11T05:53:03.503 回答