需要一些关于MVC分离的建议

时间:2010-12-22 11:53:12

标签: php zend-framework

我应该注意到我正在使用Zend Framework。虽然这不应该影响具体的答案,但它确实意味着有几个地方我可以实现我的以下方法(动作助手,控制器等)。

问题是我有buildOptions()和parseOptions()方法,该方法根据'标签'获取$ _GET / $ _ POST变量,并构建随后在select查询中使用的规则。一个例子是?modelSort = id& modelOrder = asc

在“模式”在上述明显涉及的特定的模式,并将其作为“标签”让我可以例如也有model2Sort和model2Order所以参数之间没有冲突。

然而,我现在遇到的麻烦是这些方法应该去哪里?他们通常处理请求参数。我一直在阅读很多关于胖模型,瘦控制器的内容。这应该是一个抽象的模型。我的想法是,如果是的话,我会做类似的事情:

(注意,我知道我不会直接这样调用。子类会使用方法)

$ abstractModel-> buildOptions($ PARAMS);

'params'可以是任何东西,比如请求参数$ _GET或$ _POST:

$ abstractModel-> buildOptions($ _ GET);

现在我可以看到模型不是继承处理请求变量而是传递给方法的参数。

么?这种方法属于哪里?型号,控制器?

特别是在Zend上,它应该是抽象模型中的动作助手,插件吗?

欣赏任何建议。

2 个答案:

答案 0 :(得分:3)

嗯,有两种不同的方式来查看MVC。您可以执行Controller-Push(控制器将数据推入视图中)或View-Pull(视图从模型中提取所需数据)。这两种方法都有其优点和缺点。但共同的主题是模型对用户输入是愚蠢的。您应该询问用户请求的内容。这使得在不同视图中重用模型方法变得更加容易(如果需要)。

我个人喜欢View-Pull方法,因为它可以让您轻松地重复使用您的视图(因为您不需要担心需要将哪些数据推入其中)。因此,您的控制器应该处理非显示用户交互(更新表等)。但View应负责与显示相关的用户交互。因此,如果您购买该方法,则视图应该读取排序和分页,并且视图的工作是告诉模型它。我喜欢让我的模型相当轻,以便它们尽可能地重复使用。

但重要的不是你把它放在哪里。这是关于一致性。只要您对应用程序中的分离线保持一致,就不会有问题。问题出现在你在一个地方做一半的时间,另一半在另一个地方做。所以选择一种方法,并坚持下去。

与大多数这种性质的东西一样,很多东西都取决于个人偏好和个人经历。没有一种最好的方法(如果有的话,我们都会这样做)。了解每种方法的优缺点,并自行选择(以便了解支持和反对的原因)。

祝您好运......

答案 1 :(得分:2)

这是我喜欢考虑的方式

Controller:
  Collect user input
  Sanitize input
  Instantiate model
  model->doStuff( cleaned user input )
  Instantitate view
  view->buildPrettyHtml( model )