在MVC中调用类/方法的最佳方法?

时间:2011-11-14 04:09:30

标签: php model-view-controller class frameworks methods

好的,在过去的几周里,我的朋友(brah)和我一直致力于基于MVC的框架。但是,我们不知道加载其他类/方法的最佳方法。

首先,我们使用了“loader”,它允许我们调用我们想要的任何特定类,然后使用相应的方法(Bootstrap::$load->Base_Model()->query())。但是,这种方法似乎并不十分有效,因为几乎每个类/方法(大多数情况下)都必须加载另一个Controller,Model和/或View。这意味着会有很多调用Bootstrap:$load,这使得类更长,更少有条理。

这是主要的Bootstrap类,它在索引中调用,所有内容基本上都是从这里构建的:

class Bootstrap {

    public static $load;

    public function __construct() {

        require_once 'Slave/Base/Loader.php';

        self::$load = new Loader();

        $this->load = self::$load;

    }

    public function build() {

        Bootstrap::$load->Base_Controller();

        Bootstrap::$load->Controller_Pages()->load($_GET['src']);

    }

}

这是我们的加载器的样子,它被设置为Bootstrap中的静态:

class Loader extends Bootstrap {

    public static $classes = array();

    public function __construct() {

        //do nothing

    }

    public function __call($method, $arg = null) {

        if(!is_object($this->classes[$method])) {

            $url = 'Slave/' . str_replace('_', '/', $method) . '.php';

            if(file_exists( $url )) { 

                require_once $url;

                $this->classes[$method] = new $method((count($args) > 0 ? $args : null ) );    

            }else{

                trigger_error( 'Cannot find class "'. $method.'" within "' . $url . '"', E_USER_ERROR );

            }

        }

        return $this->classes[$model];

    }

}

因此,我们决定在每个构造中为Controller,Model和View设置子类,允许我们在User Controller一侧执行类似$this->Model->User->register()的操作。虽然,这也存在问题。如果我们在父类(即Controller)中将子类(即用户控制器)设置为parent::__construct();,则不允许我们在子类中调用$this->User = Bootstrap:$load->Controller_User();

这也意味着必须调用每个类,即使该特定页面不需要。

例如,这就是我们的主要Controller类的样子:

class Base_Controller extends Bootstrap {

    public $Model;

    public $Validate;

    public $View;

    public function __construct() {

        /* Call Other Classes */

        $this->Model = Bootstrap::$load->Base_Model();

        $this->View  = Bootstrap::$load->Base_View();

        /* Call Other Functions */

        $this->Validate = Bootstrap::$load->Controller_Validate();

    }

}

所以要明确,我们希望能够在任何类/方法中做到这样的事情:

$this->Model->query();

$this->Controller->Validate->chars($string);

..或者像这样,因为我们从Controller的角度来看它:

$this->Model->query();

$this->Validate->chars($string);

反对必须执行类似Bootstrap加载器方法的事情:

Bootstrap::$load->Base_Model()->query();

Bootstrap::$load->Controller();

Bootstrap::$load->Controller_Validate()->chars($string);

但无需在Controller,Model和View中设置每个子类。

那么,在MVC中调用方法的最佳方法是什么?任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:3)

您可能需要查看此主题:PHP spl_autoload_register for spl_autoload_register()。 我认为这是你试图在你的Bootstrap类中实现的。