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

问题描述:

MVC是一个很好的模式,但有时候真的无聊到把一切都变成控制器的方法。控制器不断发展,需要时间来摆脱成千上万的代码行。有些人强烈建议尽可能将模型放入模型中,但我更愿意保持模型清洁(我没有将面向控制器的方法放入模型中)。“每个动作/页面一个类别”的任何模式?

的想法是把每个控制器的行动统一到自己的类...

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等.-

这个想法值得一住吗?有没有类似的设计模式?

谢谢。

看一看在Transaction ScriptPageController模式。事务脚本是最基本的域逻辑模式,适用于小型应用程序。 PageController的目的是处理来自用户界面的输入。如果你希望这是一个单一的命令,那没关系。你可以做

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一致,因为它将事务脚本中的模型逻辑和表示层内的输入处理保持在一起。

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

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

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

在任何情况下,我同意其他人,你的控制器应是薄和模型应该做的主要工作。

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

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

+0

请问,你能告诉我在哪里可以阅读关于“一般问题的封装”?说“封装的一般问题”,你的意思是我应该进行更多的重构,并将多个方法放入分离的类中,以便在所有控制器*享。 – Kirzilla 2010-09-21 10:10:41

+0

我建议阅读以下两个链接作为入门教材:http://en.wikipedia.org/wiki/Encapsulation_(object-oriented_programming)和http://en.wikipedia.org/wiki/Solid_(object-oriented_design )。然后,我会鼓励你阅读更多关于SOLID原则的内容:http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod – 2010-09-21 11:23:30

我建议备份一点,觉得为什么增长这么多的控​​制器。也许你可以做一个重构,并将一些共享组件提取到单独的模块中?也许你的逻辑中有一些代码应该放在你的模型或视图中?你使用了一个好的模板系统吗?

分裂控制器成小块不会解决根本问题,只扫到地毯下。

+0

我使用Smarty作为模板引擎。我的控制器的方法大多包含像$ data = $ model-> getItems()的字符串; $ smarty-> assign(“data”,$ data);而这段代码真的压抑了我...... :( – Kirzilla 2010-09-21 09:58:56