从当前Controller加载方法

时间:2009-11-27 20:20:50

标签: php class frameworks controller

我有一个我无法弄清楚的问题。

我正在构建一个小框架(练习),现在我正在构建Validator库。一切都很好,除非我试图修复“回调”规则。当dev需要使用Validator lib中不存在的规则时,使用回调规则。

以下是我的表现方式。

在控制器中:

$this->validator->check('req|callback:test', $_POST['module_name'], 'Module Name');

验证员类:

public function check($rules, $input, $fieldname='') {
    $rule = explode('|', $rules);
    foreach ($rule as $r) {
        $request = explode(":",$r,2);
        $method = array_shift($request);
        $parameter = $request;
        array_unshift($parameter,$input);   
        array_push($parameter,$fieldname);
        if (method_exists($this, $method)) {
            call_user_func_array(array($this,$method), $parameter);
        }
  }

protected function callback($input, $key, $fieldname='') {

}

我的问题是,如何使用“当前”控制器。例如,在这种情况下,我需要找到:

UserController::test();

我可以在$ key中找到正确的方法,但这是一种简单的方法来确定哪个控制器正在滚动?

我尝试使用网址:

$controller = ucfirst($uri->uri[1]).'Controller';
$controller::$key();

但那根本不起作用..有什么想法吗?

1 个答案:

答案 0 :(得分:0)

有几种不同的方法可以解决这个问题。

首先,我假设您有一些代码可以转换URI

example.com/foo

进入控制器类名

class FooController

这通常称为“路由”。如果是这样,以某种方式将您的路由器类/方法暴露给验证器和/或整个系统。这将让您随时从URI中获取控制器的名称。

其次,在实例化验证器时,为它提供对特定请求的控制器对象的引用。然后,它只是对get_class_name或反射API的简单调用。

第三,要求将控制器与您对check方法的调用一起传递。