【问题标题】:Load method from current Controller从当前控制器加载方法
【发布时间】:2009-11-27 20:20:49
【问题描述】:

我有一个我想不通的问题。

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

这就是我的做法。

在控制器中:

$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();

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

【问题讨论】:

    标签: php class frameworks controller


    【解决方案1】:

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

    首先,我假设您在某个地方有一些代码可以转换为 URI

    example.com/foo
    

    进入控制器类名

    class FooController
    

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

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

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

    【讨论】:

    • 我现在可以工作了,我可以验证来自当前控制器的回调但是,当我尝试设置如下错误消息时:$this->validator->set_error("Callback error message" );它不会保存在验证器类的错误数组中。为什么会这样?
    • 用 call_user_func() 解决了 :) 还是谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-12
    • 2016-12-27
    • 2014-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-08
    相关资源
    最近更新 更多