我应该有一个观点吗? 2个视图好吗?

时间:2011-12-11 20:25:14

标签: php model-view-controller architecture

我正在尝试在MVC架构中编程。

所以,我有一个HTML表单,用户可以插入一个电影。我有一个控制器(用于添加该电影)和一个HTML表单视图。

但我也希望用户能够在添加之后编辑该电影。因此,他按下“编辑电影”按钮,然后重定向到新的URL,我有新的控制器和新视图(它具有与用户添加电影时相同的形式,但现在只看到他输入的输入中的值以前,我希望你理解我的意思)这个编辑表格。

此外,当我想展示他的电影对其他用户的看法时,我再次有了新的控制器和新视图。

编辑:我还必须验证他输入的内容。那么,验证应该在模型中?因为我验证了两次,所以看起来不对。

是否正确思考MVC?或者制作它的最佳方法是什么?感谢。

3 个答案:

答案 0 :(得分:1)

不,这太复杂了。

您不需要使用不同的控制器来执行您想要对其进行的其他操作。例如。如果你有一个用于创建电影的控制器,则不需要单独的控制器来进行编辑。您需要单独操作,而不是控制器

基本上你应该使用 DRY(不要重复自己)规则。如果视图仅因值和form的操作而异,则仅对一个操作使用一个视图(创建和编辑)。 View应该为这两个操作生成类似的代码 - 一个将没有填充表单字段,并将form的操作设置为例如。 “movies/create”和第二个将具有预先填充的表单字段,其中form的操作设置为例如。 “movies/<movie_ID_here>/update”(命名约定取决于您)。

验证应该是模型,但作为用户的额外帮助,您也可以在客户端使用JavaScript或HTML5(根据您的需要)验证它,因此他们不需要提交表格,知道他们忘了什么。

答案 1 :(得分:1)

你得到的几乎是正确的,但仍有一些地方可以简化它。常见的是在控制器内部创建动作功能,处理用户可以执行的某些(惊讶,惊讶)动作。例如,您通常会Article controller执行操作addremoveedit等。这样您就可以集中应用程序的公共实体的操作并防止溢出控制器。如果您想尽快更改某些内容,则更容易维护,更容易找到,并且您将很好地关注DRY principle

您可以做的另一件事是为多个控制器中使用的常见内容创建abstract base controller(从数据库中动态加载元数据)。

拥有多个视图很好。无论如何,你没有太多的选择。但我建议使用一些模板引擎,这会让你的生活更轻松,再一次迫使你不要重复自己。 TwigSmarty将是完美的选择。

验证逻辑应位于模型中。 Model负责大多数后端逻辑(数据操作,其验证......)。 Controllers只需接收请求,从Models加载适当的数据,并指向正确的View。不过不要感到困惑,您通常最终会在Models内验证Controller(例如,调用validate()函数)。

无论如何,最后,你会发现有很多方法可以看看MVC模式。有些人更喜欢“胖模特”和“瘦调控制器”,有些则更喜欢。使用符合您需求的任何内容并保持简单!

如果您需要一些学习资料,请查看Symfony2 frameworkCakePHP教程。有关此主题的一些有价值的信息。也许你最终会使用其中一个而不是重新发明轮子:)

答案 2 :(得分:1)

对我来说,使用典型的项目布局,我可能会有以下内容:

Controllers
|  |
|  - MoviesController.php
|
Models
|  |
|  - Movie.php
Views
|  |
|  - Movies
|  |- Create.php
|  |- Edit.php
|  - Partials
|  |- _MovieForm.php

MoviesController包含两个操作 - Create()Edit($id),它们有自己的视图。我个人也会有第三个动作,它处理两个动作的表单提交:

public function Save()
{
    //...snip...
}

Create()只需加载相应的视图。 Edit()略有不同,它首先使用我们的模型从数据库中检索现有记录,然后再将其传递给视图。

这两个视图有一个嵌套的“部分”,它是常用HTML的一个片段 - 在这种情况下是_MovieForm.php,它有我们的表单输入(能够显示传入的值)。 / p>

表单还包含行id的隐藏输入字段。当我们调用Edit()操作时,只会给出一个值。

表单提交到MoviesController的Save()方法,该方法检查我们是否有传递的行ID。如果是这样,从数据库中获取我们的行(再次,由我们的模型表示),更新值,并调用我们的模型Save()方法。Model::Save()在我们的数据上运行我们的验证逻辑并保存到数据库,或将数据与我们的验证错误消息一起传递给视图。

希望这会有所帮助:)