我正在学习CodeIgniter及其软件模式。应该首先创建哪个视图或控制器?MVC模式:需要先创建什么?
回答
该模型因为这是你的应用程序。控制器和视图仅形成一个模型接口。人们可以说,控制器是你家门口。你先建什么?门或房子?对,所以先建立模型。然后添加一个接口。
+1这就是我们'一般'工作的方式,我认为它会导致更好的模型/ API,并帮助TDD。有时候,我们会打破流程,尽量减少工作量,通常在我们的要求不明确或者利益相关者过度参与和示范时。它还允许多个开发人员/设计人员更容易地将待办事项列表分开,即backend/ui。 – Gavin 2012-09-30 13:21:50
控制器,你需要它在模型和视图之间进行通信。 没有控制器,模型不能与视图进行交互。
你应该从控制器开始,因为它正在调用View。
在这里您可以看到Controller在Model和View之间。 http://codeigniter.com/user_guide/overview/mvc.html
控制器是必须的。因为你不能在没有控制器的情况下执行/完成工作。所以控制器至上以下的,因为
- 您可以禁用的观点,必要时
- 您可以通过控制设置相关的变量到视图
- 与模型的相互作用是由控制器这样做,所以当你需要控制器先来的数据
- 您可以将用户重定向到其他控制器
- 您可以根据请求显示其他视图。对于计算机视图A,对于移动设备视图B,就像明智的
- 视图是演示文稿,所以首先需要数据才能呈现。
我总是开始于查看。情景是,我已经设计了我的数据库,选择了技术。这是我在MVC模式上的工作流程。
- 创建CSS /图像等
- 根据对视图创建控制器方法时所显示的数据的HTML模板。
- 我把控制器方法中的虚拟数据,以便我可以看到一个动态页面,正确操纵视图。
- 根据我的控制器需要的数据我创建了模型方法。
在这个过程中,我从不创建任何额外的方法或代码块。它防止添加我们通常认为“可能是必需的”的代码。但他们从不需要。
通过这种方式,您首先创建规范然后在每个步骤上实现它。所以它就像View一样为它创建数据需求。控制器提供它。并为Model创建数据规范。最后,Model只提供被调用或需要的数据。
小心解释减投票? – 2012-02-12 15:58:55
+1这是一个完全有效的自上而下的方法。当前期逻辑规范或模型设计缺失/不被认为是有效使用努力时,肯定会工作得很好。这完全取决于环境和质量保证要求。对于许多应用程序来说,没有什么可以更容易或更快,然后自上而下。 – Gavin 2012-09-30 13:14:50
+1在过去,当我们使用记事本来预先静态页面时,我们都使用了设计第一次评估。在过去,它非常有意义,尽管它可能非常基于个人选择。我相信如果你正在自己开发一个项目,这是一个完美的感觉。 – 2016-08-23 09:25:13
我会说模型和控制器手拉手。
没有模型,你将如何知道控制器中的流程是什么?
没有控制器,你怎么知道模型需要什么方法?
有时候,模型会得到优先级,有时控制器会根据情况而定。
虽然这个问题已经有了一个可接受的答案,但我想从可测试性的角度提供一种方法。现成的框架通常不设计他们的控制器考虑到可测性,所以这种问题一遍又一遍地出现。
甲写得很好,可测试控制器应该采取的视图作为通过控制器的__construct
方法注入的依赖性。不过,我不知道CodeIgniter控制器是否支持这种功能。
在MVC范例中,Controller将视图和模型的元素“汇集在一起”,因此,就像任何行为依赖关系一样,如果这些对象提供除“哑”数据存储之外的任何功能,则应将其注入到控制器在实例化时,可以将它们模拟出来用于测试目的。所以,你会做类似如下:
$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,更多的可测试代码,更少的调试麻烦和更快乐的你。
这部分让我困惑了一下。在请求生命周期中,您最终会如何向控制台提供相关信息? 一般来说,路由器/调度员确实喜欢 一个非常简单的调用'$为route->设置( '/ URI /到/匹配', 'ControllerName', 'controllerAction');' 你描述是一个在大型项目中编写代码非常繁琐的工作,其中涉及将一些匿名函数应用于路由器/调度程序,然后在将它们传递给控制器之前处理这些实例。如果一个模型依赖于其他模型呢? – AgmLauncher 2013-10-21 08:59:46
- 1. 为什么创建虚拟表需要OPEN_READWRITE模式?
- 2. MVC根据需要创建对象的接口的模式/库
- 3. Symfony - 创建插件需要什么?
- 4. 为什么需要使用OnModelCreating(首先是MVC 5 EF代码)?
- 5. 我需要知道什么来创建Xcode项目模板?
- 6. 为什么我们需要创建模拟对象?
- 7. 为什么在创建模型表单时需要“类Meta”?
- 8. 为什么首先需要GUID属性?
- 9. 分配给模型的创建/新视图需要mvc建议?
- 10. 为什么要创建模拟对象?
- 11. 多租户 - 预先创建表或根据需要创建表?
- 12. siebel需要什么建议?
- 13. 为什么代码首先要创建索引列?
- 14. 首先要学习什么创建聊天室?
- 15. MVC 2需要什么版本的.net?
- 16. MVC仓库模式:创建模型类
- 17. 创建模板和编辑模板需要不同的MVC模板?
- 18. 为什么我需要IIS7中的ASP.NET MVC中的“经典模式”?
- 19. 什么是MVC模式的模型
- 20. 创建工厂需要节点模块
- 21. 需要c#设计模式的建议
- 22. 需要模式建议(Hibernate + Guice)
- 23. 为什么我需要在创建新模型时指定名称?
- 24. 导轨 - 帮助需要创建一个新模式
- 25. 需要帮助从XSD模式创建XML文件
- 26. 某种在C#中需要创建模式的
- 27. Rails为什么acts_as_taggable不需要以嵌套形式创建标签?
- 28. 什么特权需要在SharePoint 2013中创建应用程序?
- 29. 创建网络爬虫程序时需要考虑什么?
- 30. MySQL用户创建数据库需要什么权限?
一般来说,我同意@Shiplu的问题太宽泛。不过,我认为它实际上带来了一些积极的答案,所以这只是一次有用。我建议路人查看一下提供的不同答案。 – rdlowrey 2012-02-12 15:54:01
不同答案的数量很有趣。所以我觉得很好的问题。我个人认为这很大程度上取决于项目的简单性和团队中的资源数量。我认为很多单一开发人员会将工作速度加快,以便进行建模。在一些公司中,规格将是线框或HTML。我怀疑是否有适合所有正确的答案。 – Gavin 2012-09-30 13:24:44