0

我正在使用 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() 方法。现在我传递了这些名称,我想从组件中调用它们。

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

谢谢!

4

2 回答 2

1

看一下CakePHP中 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;
    }
}

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

于 2012-07-09T13:08:11.180 回答
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;
}
//...
于 2012-07-09T13:04:55.833 回答