我正在尝试在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

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

2回复

需要PHP技术架构师的意见

请查看下面的代码。 这是来自现有项目的代码文件之一。 如您所见,它的html,sql,php都混合在一起了……显然很难维护。 此应用程序中大约有55个大小和类型相似的文件。 我想重构此代码,以下是我的目标: 1)易于维护。 2)可以通过添加其他功能轻松扩展
1回复

该代码部分应该放在哪里?

我有一个简单的网站,用户可以在其中上传图片并为其命名。 上载表单应该在没有JavaScript和JavaScript的情况下都可以工作(作为XHR层上的表单)。 我有一个: 表格上传 Model_Post(带有网关/映射器) UploadController
4回复

JavaScript代码应该在哪里?

它应该在View部分中,html在哪里? 如果此javascript代码仅用于一个文件,则将其放在javascript主文件中没有意义,对吗? 谢谢。
5回复

“被动”物体被认为是一种好的设计实践吗?

我发现自己经常创建一个没有公共方法并且是自包含的对象。 它通常处理在其私有方法中传递给其构造函数的参数事件,并且不会引发任何事件或公开任何公共方法。 我称这种类型的对象为“被动”对象 - 没有定义任何公共方法的对象。 所有交互都发生在私有方法和构造函数中传递的参数事件中。 通常它
3回复

从ASP.NET MVC中的模型调用方法是一种好习惯

在过去,在编写代码时,我总是假设模型应该只包含控制器填充的一堆自动属性。 但我最近遇到了这样的代码,想知道它是否对MVC有效: 在这种情况下,像GetBusinessServiceByServiceId这样的方法合法吗? 编辑:此模型用作ASP.NET MVC页面的强类型模型,因
1回复

从Rails模型进行http调用可以吗?

我正在系统与外部Web服务之间进行集成。 在我的系统中,我有一个Customer模型。 客户可以借记,但是此信息(客户的财务状况)在我的数据库中不可用。 我正在与之集成的Web服务中。 我在此模型中创建了一个方法,并将其命名为is_in_debit? 。 在方法实现中,我正在对W
1回复

服务应该直接调用另一个服务或存储库吗?

我正在创建具有许多层的WebApplication(目前重要的是Model,Repository,BusinessLayer) 具有ClassService,ClassRepository和StudentService,StudentRepository,ClassServiceMetho
8回复

新的Web应用程序应该遵循MVC还是MVP模式? [关闭]

请注意,我不是要求选择哪个(MVC或MVP),而是应该将其中一个用于Web应用程序。 我意识到将旧应用程序从其当前设计转换为MVC或MVP模式可能需要做太多工作。 但是,对于一个新的应用程序呢? 看来这些是最流行的架构模式,那么应该选择其中一种吗? 如果没有,还有其他什么模式?
3回复

Backbone.js:应该.render()和.remove()能够互相反转吗?

因为Backbone.js非常灵活,我想知道某些事情的最佳方法。 在这里,我想知道我是否应该构建我的应用程序的视图,以便'.render()'和'.remove()'正确地相互反转。 首先,看起来最干净的方式是将视图传递给要附加的ID或jQuery元素。 如果事情以这种方式完成,调用'
1回复

是否应该为页面元素创建Model和DAO类?

有趣的问题:在用于电影院的MVC Web应用程序中,我具有诸如Film和Showing Model类。 另外,我还有诸如FilmDAO和ShowingDAO类的DAO类,用于从数据库中检索数据。 我的问题是,我应该为不是真正的“ 实体 ”而是页面元素的类创建类吗? 我的意思是像Caro