我正在研究CodeIgniter及其软件模式。应该首先创建哪个,视图还是控制器?
模型,因为这是您的应用程序。控制器和视图仅形成模型的一个接口。有人可能会说,控制器就是你家的门。你首先建造什么?门还是房子?好的,所以先构建模型。然后添加一个接口。
我总是从View开始。场景是,我已经设计了我的数据库,选择了技术。这是我在MVC模式上的工作流程。
- 使用CSS/image等创建html模板
- 根据视图中显示的数据,我创建Controller方法
- 我在控制器方法中放入了伪数据,这样我就可以看到一个正确操作视图的动态页面
- 根据我的控制器需要的数据,我创建了Model方法
在这个过程中,我从不创建任何额外的方法或代码块。它防止添加我们通常认为"可能是必要的"的代码。但它们从来都不需要。
通过这种方式,您首先创建规范,然后在每个步骤上实现它。因此,View为它创建数据需求。Controller提供它。并为Model创建数据规范。最后,模型只提供那些被调用或需要的数据。
控制器是必须的。因为如果没有控制器,你就无法执行/完成工作。所以控制器是第一位的,因为以下,
- 必要时可以禁用视图
- 您可以通过控制器为视图设置相关变量
- 与模型的交互是由控制器完成的,因此当您需要数据时,控制器会优先考虑
- 您可以将用户重定向到其他控制器
- 您可以根据请求显示其他视图。对于计算机视图A,对于移动设备视图B,如wise
- 视图就是演示,所以首先需要数据来演示
虽然这个问题已经有了公认的答案,但我想从可测试性的角度提供一种方法。现成的框架通常在设计控制器时没有考虑到可测试性,所以这类问题会反复出现。
一个编写良好、可测试的控制器应该将该视图视为通过控制器的__construct
方法注入的依赖项。不过,我不知道CodeIgniter控制器是否允许此功能。
在MVC范式中,控制器将视图和模型的元素"结合在一起",因此,与任何行为依赖项一样,如果这些对象提供了"愚蠢"数据存储之外的任何功能,则应在实例化时将它们注入控制器,以便对其进行模拟以进行测试。因此,您可以执行以下操作:
$view = new SmartyView;
$model = new UserModel;
$controller = new LoginController($view, $model);
通常,该模型不提供任何公共的"行为"方法,而是充当基本的数据存储实体。如果是这种情况,出于同样的原因,您不需要将阵列数据结构注入控制器来创建新的阵列,您可以在控制器内安全地创建新的模型实例,而不会牺牲可测试性:
class LoginController
{
protected $view;
public function __construct(ViewInterface $view)
{
$this->view = $view;
}
public function doLogin($user, $pass)
{
$userModel = new UserModel();
// do stuff with model to determine if user/pass was valid
}
}
$view = new SmartyView;
$controller = new LoginController($view);
对于可测试性,最佳实践是避免将控制器与视图和模型紧密耦合。这就是为什么您通常应该避免在控制器代码中使用new
关键字。您的控制器——以及任何其他对象——应该ASK对其依赖项,而不是LOOK。这将带来更透明的API、更可测试的代码、更少的调试麻烦和更快乐的生活。
我知道这可能是个老问题,但我现在遇到了
以后其他人可能需要它。所以我决定总结一下。
我认为你的方法将取决于情况
让您进行的操作顺序是模型视图控制器
并称之为自下而上方法。这方面的案例和理由由@Gordon在这里提供
当您开始使用UI时,另一种情况让我们称之为自上而下。案例和理由由@shiplu.mokadd.im提供
评估您自己的案例并从中选择一个。祝你好运
控制器,您需要它在模型和视图之间进行通信。如果没有控制器,模型就无法与视图交互。
您应该从Controller开始,因为它正在调用View。
在这里,您可以看到Controller位于Model和View之间。http://codeigniter.com/user_guide/overview/mvc.html
我会说模型和控制器手牵手。
如果没有模型,你怎么知道控制器中的流量是多少?
如果没有控制器,你怎么知道模型中需要什么方法?
有时,模型会获得优先级,有时控制器会根据情况而定。