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();
那么,我们有什么?
Post_Parent
)并且可以
可以从动作类访问。它
非常适合组织ACL等.- 这个想法值得过吗?这有什么类似的设计模式吗?
谢谢。
答案 0 :(得分:1)
就我个人而言,我认为你所描述的模式从长远来看并不适合你。如果您的控制器已经有“数千个代码行”,那么您就会遇到封装的一般问题,并且每个操作创建一个类只会将您的问题转移到另一个层。
您的控制器应该瘦。您已经通过撰写帖子认出了这一点。控制器应该协调您的视图和模型之间的交互。该模型是您的业务逻辑所在的位置,因此您的控制器应该只有足够的逻辑来确保执行适当的验证,调用正确的业务逻辑,并在业务逻辑处理完成时返回正确的视图。
答案 1 :(得分:0)
我建议稍微备份一下,然后想一想为什么控制器增长如此之多。也许你可以进行重构并将一些共享组件提取到单独的模块中?也许你的逻辑中有一些应该在你的模型或视图中的代码?你使用一个好的模板系统吗?
将控制器拆分成较小的部分并不能解决根本问题,只能在地毯下扫描。
答案 2 :(得分:0)
查看Transaction Script和PageController模式。事务脚本是最基本的域逻辑模式,适用于小型应用程序。 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);
在任何情况下,我同意其他人的观点,即您的控制器应该很薄,模型应该完成主要工作。