我正在尝试在MVC架构中编程。
所以,我有一个HTML表单,用户可以插入一个电影。我有一个控制器(用于添加该电影)和一个HTML表单视图。
但我也希望用户能够在添加之后编辑该电影。因此,他按下“编辑电影”按钮,然后重定向到新的URL,我有新的控制器和新视图(它具有与用户添加电影时相同的形式,但现在只看到他输入的输入中的值以前,我希望你理解我的意思)这个编辑表格。
此外,当我想展示他的电影对其他用户的看法时,我再次有了新的控制器和新视图。
编辑:我还必须验证他输入的内容。那么,验证应该在模型中?因为我验证了两次,所以看起来不对。
是否正确思考MVC?或者制作它的最佳方法是什么?感谢。
答案 0 :(得分:1)
不,这太复杂了。
您不需要使用不同的控制器来执行您想要对其进行的其他操作。例如。如果你有一个用于创建电影的控制器,则不需要单独的控制器来进行编辑。您需要单独操作,而不是控制器。
基本上你应该使用 DRY(不要重复自己)规则。如果视图仅因值和form
的操作而异,则仅对一个操作使用一个视图(创建和编辑)。 View应该为这两个操作生成类似的代码 - 一个将没有填充表单字段,并将form
的操作设置为例如。 “movies/create
”和第二个将具有预先填充的表单字段,其中form
的操作设置为例如。 “movies/<movie_ID_here>/update
”(命名约定取决于您)。
验证应该是模型,但作为用户的额外帮助,您也可以在客户端使用JavaScript或HTML5(根据您的需要)验证它,因此他们不需要提交表格,知道他们忘了什么。
答案 1 :(得分:1)
你得到的几乎是正确的,但仍有一些地方可以简化它。常见的是在控制器内部创建动作功能,处理用户可以执行的某些(惊讶,惊讶)动作。例如,您通常会Article controller
执行操作add
,remove
,edit
等。这样您就可以集中应用程序的公共实体的操作并防止溢出控制器。如果您想尽快更改某些内容,则更容易维护,更容易找到,并且您将很好地关注DRY principle。
您可以做的另一件事是为多个控制器中使用的常见内容创建abstract base controller
(从数据库中动态加载元数据)。
拥有多个视图很好。无论如何,你没有太多的选择。但我建议使用一些模板引擎,这会让你的生活更轻松,再一次迫使你不要重复自己。 Twig或Smarty将是完美的选择。
验证逻辑应位于模型中。 Model
负责大多数后端逻辑(数据操作,其验证......)。 Controllers
只需接收请求,从Models
加载适当的数据,并指向正确的View
。不过不要感到困惑,您通常最终会在Models
内验证Controller
(例如,调用validate()
函数)。
无论如何,最后,你会发现有很多方法可以看看MVC模式。有些人更喜欢“胖模特”和“瘦调控制器”,有些则更喜欢。使用符合您需求的任何内容并保持简单!
如果您需要一些学习资料,请查看Symfony2 framework或CakePHP教程。有关此主题的一些有价值的信息。也许你最终会使用其中一个而不是重新发明轮子:)
答案 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()
在我们的数据上运行我们的验证逻辑并保存到数据库,或将数据与我们的验证错误消息一起传递给视图。
希望这会有所帮助:)