使用FrontController的PHP自定义MVC框架

时间:2013-05-26 19:36:24

标签: php model-view-controller

我有点困惑。我想建立自己的框架,只是为了了解一切是如何运作的,而不是我将它用于大项目。

我有一个FrontController类,这个类里面有路由功能。

  1. 设置/获取控制器参数的功能
  2. 从Controller
  3. 设置/获取动作(方法)的功能
  4. 解析请求的URI并返回正确的控制器的函数,如果不存在则返回默认控制器,即IndexController。
  5. 执行以下操作的Run()方法:

    public function run() {
        $method    = new \ReflectionMethod($this->controller, $this->action);
        $numParams = $method->getNumberOfParameters();
    
        //fill missing parameters with null values
        if (count($this->params) != $numParams) {
           $tempArray = array_fill(0, $numParams, null);
           $this->setParams($this->params + $tempArray);
        }
    
        $controller   = new $this->controller;
    
        $userInstance = User::getInstance();
    
        //just creates a model based on the controller name by default its
        //Index.php (model)
        $model        = DB::createModel($this->getControllerName());
    
        //run _before before any function
        $controller->_before($model, $userInstance);
    
        call_user_func_array(array($controller, $this->action), $this->params);
        return;
    }
    

    现在我已经看过教程,他们使用BaseController,然后每个Controller 扩展来自 basecontroller 。我的控制器不会从FrontController扩展。

  6. 我的问题是我需要一个单独的路由类吗?我需要将FrontController拆分为

    1. BaseController
    2. Route.php
    3. Model.php
    4. 因为run()函数实际上将模型和用户对象传递给控制器​​。

1 个答案:

答案 0 :(得分:2)

要记住的一个基本原则是Single Responsibility Principle。精心设计的课程只有一个责任。

所以。您需要将路由和所有其他职责分开。

另请注意,模型必须被视为图层而不是类或对象。模型层是类(数据访问,服务)的集合。实际上,您的User类应该被视为该层的一部分。

Here's an article which can help you understand the MVC pattern a bit better.