Php MVC应该如何在CodeIgniter中工作

Php MVC应该如何在CodeIgniter中工作,php,codeigniter,model-view-controller,web,Php,Codeigniter,Model View Controller,Web,作为一个自学成才的程序员,当涉及到设计模式之类的问题时,我已经迟到了。我正在使用CodeIgniter编写一个劳动管理Web应用程序 我在学校做了一些MVC ASP.NET/C和Java,惯例是你的模型主要由表示实际对象的类组成,但也抽象了所有的数据库连接等等……这是我收集的相当标准的MVC内容 我想我说的是,CI抽象数据库连接完全是看不见的(除非你去看),这是这个过程的标准,你可以创建的模型可以更抽象地抽象“通用”CRUD方法来创建一些对特定模型更有用的方法。 我有一个问题,因为这与我在MVC

作为一个自学成才的程序员,当涉及到设计模式之类的问题时,我已经迟到了。我正在使用CodeIgniter编写一个劳动管理Web应用程序

我在学校做了一些MVC ASP.NET/C和Java,惯例是你的模型主要由表示实际对象的类组成,但也抽象了所有的数据库连接等等……这是我收集的相当标准的MVC内容

我想我说的是,CI抽象数据库连接完全是看不见的(除非你去看),这是这个过程的标准,你可以创建的模型可以更抽象地抽象“通用”CRUD方法来创建一些对特定模型更有用的方法。 我有一个问题,因为这与我在MVC中所习惯的不同,那就是每当你说……从数据库返回一行时,惯例是将它放在一个关联数组或标准对象中,属性表示该行中的数据

在ASP中,您可以构造实际的类来存储这些信息。例如,您将拥有一个
House
类,数据将存储为属性(例如
卧室
浴室
地址
),并且这些方法将表示您可以对数据执行的有用操作(例如
打印信息()
可以
打印($address有$bedrooms bedrooms和$bathrooms bathrooms!')

我从我在互联网上看到的代码中得到的印象是,这不是做事情的标准方式。你应该只使用数组或通用对象,然后说…做
$this->house\u model->print\u info($houseobject)
,而不是
$houseobject->print\u info();


谢谢。

当遵循MVC模式时,CodeIgniter非常灵活,具体执行程度取决于您。您将在网上找到的大多数CodeIgniter代码与您描述的完全相同,模型实际上只是方法的集合,并不严格表示对象

但是,如果您喜欢在CI中编写代码,也可以这样编写(这是我经常做的事情),这样可以使代码更易于维护和可读,而且看起来更好

PS-如果你刚刚进入PHP中的MVC,你可能想看看周围。像CodeIgniter和CakePHP这样的框架(有些)是上一代的。CI最初是为PHP4编写的,在PHP中OOP支持有点参差不齐。专门创建了一个名为(虽然我相信在某一点上,他们只是认为从头开始重写会更好。)CI确实有很多文档和在线帮助的优势,因为它比燃料更广泛使用。

 // 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 );
 }
看法

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

因此,对于复杂的问题,如向我展示好学校旁边的所有房子,有两间卧室和一个房间给我的宠物。
这就是模型中发生的情况。所有混乱的条件和业务规则。视图应该是特定的-如果没有结果,那么只显示一个无结果视图。与之相对的是--在视图中进行结果检查,然后根据无结果更改显示。视图越具体,构建起来就越容易,而且会更容易鼓励您在控制器和模型中做出选择。

尽管Codeigniter声称相反,但它根本不使用MVC(事实上,很少有web框架使用MVC!)它实际上使用了PAC(表示抽象控制)体系结构。本质上,在PAC中,表示层由表示者提供数据(CodeIgniter称之为控制器)在MVC中,视图从模型中获取自己的数据。这种混淆是因为MVC的这种错误标记而存在的

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

进一步阅读:


这是PHP社区中普遍存在的一个困惑点(MVC vs.PAC一文将问题确定为源于PHP社区。这篇文章写于2006年,没有任何变化,如果说有什么更糟的话,那是因为有更多的框架和教程教授错误的MVC定义。)以及为什么人们会关注“MVC”来自web开发以外背景的PHP代码会变得混乱,这是可以理解的。大多数“MVC”PHP中的实现不是MVC。您认为模型应该具有适当的结构是正确的,将自己标记为MVC是错误的,这是CodeIgniter。

啊,是的,我认为它是灵活的。我主要关注的是遵循任何广泛使用的约定(如果有的话)是的。原因是我不相信自己会做出这样的决定,因为我确信它以后会咬到我的屁股,一般人做事的方式似乎非常值得信赖。至于燃料,我太投入了,无法跳出去做其他事情。虽然它看起来很完美,但ViewModels对我来说更熟悉,它们肯定会停止我为实现这一目标所做的一些黑客行为。这是我今后一定要记住的事情。按照惯例,CI模型通常是以“非对象”的方式编写的。这可能主要是因为CI源于PHP4。
// 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 ;