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

因此,我有一个HTML表单,用户可以在其中插入电影。 我有一个控制器(用于添加电影)和一个用于HTML表单的视图。

但我也希望用户在添加电影后能够对其进行编辑。 因此,他按下了“编辑电影”按钮,并将其重定向到新的URL,我有了新的控制器和新视图(其格式与用户添加电影时的形式相同,但只有现在他才能看到他输入的输入中的值以前,希望您能理解此编辑表单的含义。

另外,当我想向其他用户展示他的电影时,我又一次拥有新的Controller和新的View。

编辑 :我还必须验证他输入的内容。 那么,验证应该在模型中进行? 因为我两次验证,所以似乎不正确。

对MVC的思考正确吗? 或做这件事的最佳方法是什么? 谢谢。

===============>>#1 票数:1

不,它过于复杂。

您不需要其他控制器即可对某物进行其他操作。 例如。 如果您有用于创建电影的控制器,则不需要单独的控制器来编辑它。 您需要单独的操作,而不是controller

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

验证应该在模型中 ,但作为对用户的附加帮助,您也可以在客户端使用JavaScript或HTML5(取决于您想要的内容)对其进行验证,因此他们无需提交表单即可知道自己忘记了什么。

===============>>#2 票数:1 已采纳

您几乎完全正确,但是仍有一些地方可以简化它。 常见的事情是在控制器内部创建动作功能,以处理用户可以执行的某些(惊奇,意外)动作。 例如,通常您将拥有带有操作addremoveedit等的Article controller 。通过这种方式,您可以集中处理应用程序公共实体的操作,并防止控制器溢出。 如果您想尽快更改某些内容,则更容易维护,更容易找到,并且可以很好地遵循DRY原理

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

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

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

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

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

===============>>#3 票数:1

使用我的典型项目布局,我可能会遇到以下情况:

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()对数据运行验证逻辑,然后保存到数据库,或者将数据与验证错误消息一起传递回视图。

希望这可以帮助 :)

  ask by good_evening translate from so

未解决问题?本站智能推荐: