[英]Should I have one view for this? Is 2 views alright?
我正在尝试在MVC架构中编程。
因此,我有一个HTML表单,用户可以在其中插入电影。 我有一个控制器(用于添加电影)和一个用于HTML表单的视图。
但我也希望用户在添加电影后能够对其进行编辑。 因此,他按下了“编辑电影”按钮,并将其重定向到新的URL,我有了新的控制器和新视图(其格式与用户添加电影时的形式相同,但只有现在他才能看到他输入的输入中的值以前,希望您能理解此编辑表单的含义。
另外,当我想向其他用户展示他的电影时,我又一次拥有新的Controller和新的View。
编辑 :我还必须验证他输入的内容。 那么,验证应该在模型中进行? 因为我两次验证,所以似乎不正确。
对MVC的思考正确吗? 或做这件事的最佳方法是什么? 谢谢。
不,它过于复杂。
您不需要其他控制器即可对某物进行其他操作。 例如。 如果您有用于创建电影的控制器,则不需要单独的控制器来编辑它。 您需要单独的操作,而不是controller 。
基本上,您应该为此使用DRY(请勿重复) 。 如果视图仅因值和form
的操作而不同,则只需对两个操作使用一个视图 (创建和编辑)。 View应该为这两个动作生成相似的代码-一个不会填充表单字段,并且将form
的动作设置为例如。 “ movies/create
”,第二个将具有预填充的表单字段,其中form
的动作设置为例如。 “ movies/<movie_ID_here>/update
”(命名约定取决于您)。
验证应该在模型中 ,但作为对用户的附加帮助,您也可以在客户端使用JavaScript或HTML5(取决于您想要的内容)对其进行验证,因此他们无需提交表单即可知道自己忘记了什么。
您几乎完全正确,但是仍有一些地方可以简化它。 常见的事情是在控制器内部创建动作功能,以处理用户可以执行的某些(惊奇,意外)动作。 例如,通常您将拥有带有操作add
, remove
, edit
等的Article controller
。通过这种方式,您可以集中处理应用程序公共实体的操作,并防止控制器溢出。 如果您想尽快更改某些内容,则更容易维护,更容易找到,并且可以很好地遵循DRY原理 。
您可以做的另一件事是为在多个控制器中使用的常见内容创建abstract base controller
控制器(考虑从数据库动态加载元数据)。
拥有多个视图很好。 无论如何,您没有太多选择。 但是我建议您使用一些模板引擎,这将使您的生活更轻松,并再次迫使您不要重复自己。 嫩枝或Smarty将是完美的选择。
验证逻辑应位于模型中。 Model
负责大多数后端逻辑(数据操作,其验证...)。 Controllers
只是接受请求,从Models
加载适当的数据,然后将您指向适当的View
。 不过不要感到困惑,通常您最终会在Controller
内验证Models
(例如,调用validate()
函数)。
无论如何,最后,您会发现有很多方法可以查看MVC模式。 有些人喜欢“胖模型”和“瘦控制器”,而另一些则更喜欢。 使用任何适合您的需求并保持简单!
如果您需要一些学习资料,请查看Symfony2框架或CakePHP教程。 有关此主题,有一些有价值的信息。 也许您最终将使用其中之一而不是重新发明轮子:)
使用我的典型项目布局,我可能会遇到以下情况:
Controllers
| |
| - MoviesController.php
|
Models
| |
| - Movie.php
Views
| |
| - Movies
| |- Create.php
| |- Edit.php
| - Partials
| |- _MovieForm.php
MoviesController
包含两个动作 MoviesController
Create()
和Edit($id)
,它们具有各自的views 。 我个人也将执行第三项操作,处理这两项操作提交的表单:
public function Save()
{
//...snip...
}
Create()
只是加载相应的视图。 Edit()
稍有不同,它首先使用我们的Model从数据库中检索现有记录,然后再将其传递到视图中。
这两个视图具有嵌套的“部分”,这是常用HTML的片段-在本例中为_MovieForm.php
,它具有我们的表单输入(能够显示传入的值)。
表单还包含我们行ID的隐藏输入字段。 仅当我们调用Edit()
动作时才给它一个值。
表单提交给MoviesController的Save()
方法,该方法检查我们是否有传递的行ID。 如果是这样,请从数据库中获取行(再次由模型表示),更新值,然后调用模型的Save()
方法。 Model::Save()
对数据运行验证逻辑,然后保存到数据库,或者将数据与验证错误消息一起传递回视图。
希望这可以帮助 :)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.