如何在CakePhp组件中调用回调?

时间:2012-07-09 12:46:18

标签: php cakephp

我正在使用CakePhp 2.2,我有这个简单的控制器,名为 ProvidersController

<?php

class ProvidersController extends AppController {

    public $components = array('Session', 'Social');

    public $layout = false;         

    public function facebook(){ 
    $this->Social->auth('facebook', 'success', 'error');
    $this->render(false);
    }

    public function google(){
     $this->Social->auth('google', 'success', 'error');
     $this->render(false);
    }

    private function success(){

    }

    private function error(){

    }

}

?>

此组件名为 SocialComponent

<?php

class SocialComponent extends Component {

    public function auth($provider, $success, $error){

    }

}

?>

你可以看到我在控制器中创建了success()和error()方法。现在我传递这些名称,我想从组件中调用它们。

我只传递回调的名称,如何从组件中调用它们?

谢谢!

2 个答案:

答案 0 :(得分:1)

看一下CakePHP中的source code of the SecurityComponent,它与blackHoleCallback的情况相同。

他们使用辅助函数SecurityComponent::_callback(),它使用PHP的call_user_func_array()

protected function _callback(Controller $controller, $method, $params = array()) {
    if (is_callable(array($controller, $method))) {
        return call_user_func_array(array(&$controller, $method), empty($params) ? null : $params);
    } else {
        return null;
    }
}

您可以使用相同的模式将回调传递到组件中。

答案 1 :(得分:0)

组件的重点是跨多个控制器的可重用性 - 如果你试图让它访问特定的控制器函数,你应该只使用控制器方法,而不是组件。

但是 - 您可以随时在组件中执行逻辑并传回数据(成功或错误时),然后检查控制器中的结果,并根据这些结果访问您想要的任何方法。

由于您的“成功”或“错误”逻辑在控制器中,我假设您不希望它在组件中...即每次使用组件时它都不同。在这种情况下,您真正​​希望组件执行的只是执行逻辑并让您知道它是如何运行的(返回数据)。

//Controller
//..
public function facebook(){ 
    $results = $this->Social->auth('facebook', 'success', 'error');
    if($results['error']) $this->Social->error();
    $this->render(false);
}

private function success(){ }

private function error(){ }
//...


//Component
//...
public function auth($provider, $success, $error){
    $results = array();
    //do something
    $results['error'] = true;
    return $results;
}
//...