我正在使用 PHP 构建自定义 MVC 框架。我的问题是当我想通过控制器类访问任何模型类时。我见过的一种方法是通过使用 get 和 set 等神奇方法的注册表设计模式,尽管 PHP get 和 set 被一些人认为是不好的做法。我读过有关通过容器完成的依赖注入的内容,但我看不到它有效地工作,因为容器必须调用模型,或者它必须包含模型,这会破坏 MVC 的目的并创建一个巨大的超类。 Singleton 被视为不好的做法。我提到的方法有什么解决方案或改进吗?可能只是我的理解和PHP知识需要提高。
目前我有这个:router.php(通过 GET 变量加载控制器
<?php
class router {
function __construct() {
if (file_exists("controller/".$_GET['url']."Controller.php")) {
function __autoload($controller) {
$controlinclude = "controller/".$controller.".php";
include $controlinclude;
}
$control = $_GET['url']."Controller";
new $control();
}
else {
// throw exception
}
}
}
?>
希望这是有道理的
首先...不要将自动加载脚本放入路由机制中。你正在混合责任。您最好为此创建一个单独的类spl_autoload_register http://php.net/manual/en/function.spl-autoload-register.php.
Neeext .. 不要在构造函数上进行复杂的操作。它使您的代码有些难以测试。也许你应该是这样的:
// you might want to replace $_GET with $_SERVER['QUERY_STRING'] later
$router = new Router( $_GET['url'] );
// where 'default' is the name of fallback controller
$controller_class = $router->get_controller( 'default' );
$method_name = $router->get_action( 'index' );
$model_factory = new ModelFactory( new PDO( ... ) );
$controller = new {$controller_class}( $model_factory );
$controller->{$method_name}();
另外,你应该看看 php命名空间 http://php.net/manual/en/language.namespaces.php。结束课程没有意义...Controller
只是想知道课程将在哪里进行。
好吧......回到模型。
在 Web 开发社区中,对于模型存在相当普遍的误解(我将这种混乱归咎于 RoR)。MVC 中的模型不是类,而是包含大量实例的应用程序层。大多数实例属于两种类型的类之一。具有以下职责:
在半现实世界的情况 () 中,它可能看起来像这样(与上面的代码相关):
class SomeController
{
// ... snip ...
protected $model_factory = null;
// ... snip ...
public function __construct( ModelFactory $factory )
{
$this->model_factory = $factory;
}
// ... snip ...
public function action_foobar()
{
$user = $this->model_factory->build_object( 'User' );
$mapper = $this->model_factory->build_mapper( 'User' );
$user->set_id(42);
$mapper->fetch($user);
if ( $user->hasWarning() )
{
$user->set_status( 'locked' );
}
$mapper->store( $user );
}
// ... snip ...
}
如您所见,没有任何迹象表明数据是如何存储的。用户帐户是新帐户还是已经存在都没有关系。
您可能会发现一些有用的材料
Videos
-
高级面向对象模式 https://vimeo.com/21173483 (slides) http://qafoo.com/talks/11_11_osidays_advanced_oo_patters.pdf
- 整洁代码讲座:不要寻找东西! http://www.youtube.com/watch?v=RlfLCWKxHJ0
- 整洁代码讲座:单元测试 http://www.youtube.com/watch?v=wEhu57pih5w
- 干净代码讲座:全局状态和单例 http://www.youtube.com/watch?v=-FRm3VPhseI
Books:
- 用于开发高质量 PHP 框架和应用程序的实际解决方案 https://rads.stackoverflow.com/amzn/click/com/0470872497
- 企业应用架构模式 https://rads.stackoverflow.com/amzn/click/com/0321127420
- 干净的代码:敏捷软件工艺手册 https://rads.stackoverflow.com/amzn/click/com/0132350882
- SQL 反模式:避免数据库编程的陷阱 https://rads.stackoverflow.com/amzn/click/com/1934356557
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)