“每个动作/页面一个班级”的任何模式?

时间:2010-09-21 09:23:24

标签: php model-view-controller design-patterns

MVC是一个非常好的模式,但有时将所有内容都放入Controller的方法中真的很无聊。控制器不断增长,需要时间来摆脱数以千计的代码行。有些人强烈建议尽可能多地使用Model,但我更喜欢保持Model清理(我不会将面向控制器的方法放入Model中)。

想法是将每个Controller的动作放入自己的类......

class Post_Add {}
class Post_Remove {}
class Post_View {}

所有代码,对于我们放入class Post_Parent并将其实例传递给动作构造函数的所有动作类都是通用的。

所以,调用动作看起来像......

$parent = new Post_Parent();
$action = new Post_Add($parent);
$action->run();

那么,我们有什么?

  • 每个动作都在分开的类中,所以 我们可以添加尽可能多的私有方法, vars,我们想要的常数。
  • 所有常用代码都分为 父类(Post_Parent)并且可以 可以从动作类访问。它 非常适合组织ACL等.-

这个想法值得过吗?这有什么类似的设计模式吗?

谢谢。

3 个答案:

答案 0 :(得分:1)

就我个人而言,我认为你所描述的模式从长远来看并不适合你。如果您的控制器已经有“数千个代码行”,那么您就会遇到封装的一般问题,并且每个操作创建一个类只会将您的问题转移到另一个层。

您的控制器应该。您已经通过撰写帖子认出了这一点。控制器应该协调您的视图和模型之间的交互。该模型是您的业务逻辑所在的位置,因此您的控制器应该只有足够的逻辑来确保执行适当的验证,调用正确的业务逻辑,并在业务逻辑处理完成时返回正确的视图。

答案 1 :(得分:0)

我建议稍微备份一下,然后想一想为什么控制器增长如此之多。也许你可以进行重构并将一些共享组件提取到单独的模块中?也许你的逻辑中有一些应该在你的模型或视图中的代码?你使用一个好的模板系统吗?

将控制器拆分成较小的部分并不能解决根本问题,只能在地毯下扫描。

答案 2 :(得分:0)

查看Transaction ScriptPageController模式。事务脚本是最基本的域逻辑模式,适用于小型应用程序。 PageController的目的是处理来自UI的输入。如果你想要它只是一个命令,那没关系。你可以做到

class PostAddController implements RequestHandler {
    public function handle($request) {
       $post = filter_input(INPUT_POST, 'post', FILTER_SANITIZE_SPECIAL_CHARS);
       $model = new PostAddTransactionScript;   
       $model->process($post);
       include 'postAddViewScript.php';
    }
}

PostAddTransactionScript然后将$ postData写入数据库或其应该做的任何事情。上面的简化示例仍然符合MVC,因为它将Model逻辑保留在事务脚本中,并将输入处理保存在表示层中。

您是将输入处理逻辑组织到单个Controller类中还是由许多较小的命令组成。分组职责更有意义,特别是如果您需要在命令之间共享状态或通用功能。

至于你的例子,我宁愿使用Strategy Pattern并让Post_Parent使用Command而不是使用Parent的命令,例如。

$commander = new PostCommander;
$commander->setStrategy(new PostAddCommand);
$commander->handle($_POST);

在任何情况下,我同意其他人的观点,即您的控制器应该很薄,模型应该完成主要工作。