Aus*_*yde 1 php model-view-controller design-patterns
假设我有一个PHP模型 - 视图 - 控制器框架,它将地址映射http://example.com/admin/posts/edit/5到一个看起来像的动作
Posts_Controller::editAction($id)
Run Code Online (Sandbox Code Playgroud)
在文件中 /admin/controllers/posts.php
现在,我所看到的许多现有PHP框架都可以通过类似的方式实现
$module = Router::getModule(); // "admin"
$controller = Router::getController(); // "posts"
$action = Router::getAction(); // "edit"
$params = Router::getParams(); // array(5)
$controller_file = "/".$module."/controllers/".$controller.".php";
$controller_classname = ucfirst($controller)."_Controller";
$method = $action."Action";
require_once $controller_file;
$controller_obj = new $controller_classname();
call_user_func_array(array($controller_obj,$method),$params);
Run Code Online (Sandbox Code Playgroud)
对我来说,这闻起来很糟糕,看起来太"神奇"了:我不相信你应该能够根据字符串动态创建类,然后调用指定为字符串的方法.
我也看到了使用反射来调用动作的替代方法,这些方法也有些不好.
现在想象一下,我有一个更大的模块化CMS,它建立在类似的MVC框架之上,每个"页面"类型都有一个数据库表:博客,静态,相册等...我想这个实现是类似于我之前的例子.
我是唯一一个认为这是坏事的人吗?如果没有,是否应该有一种能够涵盖这种情况的设计模式?
是否有一些好方法可以将包含有关模块,控制器,操作和参数的信息的查询映射到
那使用尽可能少的 "魔法"(字符串到类或反射方法或反射)?
更好的是:如果没有反射,如何在C#或Java中完成?我可以允许连接字符串到达文件位置.
事实上,这里有两个问题.
作为一名PHP开发人员和软件工程师,我可以将其视为主要基于某些MVC框架的Web应用程序开发
1)每种语言都有自己的语法,提供或多或少的表达能力.我同意,为了便于阅读和简化,不应在每行代码上使用一种语言的所有功能.但是在这种情况下,MVC的核心设计和实现我认为没有理由不使用它们,尤其是在最终用户(这种意义上的应用程序开发人员)如果封装得很好的情况下看不到这种魔力的地方.我认为这是一个简化和剥离的片段,因为应该有一些关于其设计的其他注意事项,但是基于字符串名称创建新实例,并且以相同的方式调用函数是PHP世界中的常规方法.
2)我同意这段代码在逻辑上有些神奇,特别是因为它可能为开发人员提供了一般性的承诺.对此有不同的方法,在大多数情况下会降低解决方案的一般性,并提供一些通过命令映射或类似方法直接定义映射的方法(例如DB,如您所说).这种方式魔术掌握在开发者手中.一般来说,这不适合快速开发,因为在您自动解决的情况下设置路由器魔术的映射有很多手动工作.
希望它有所帮助.
干杯,伊万