我正在使用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()方法。现在我传递这些名称,我想从组件中调用它们。
我只传递回调的名称,如何从组件中调用它们?
谢谢!
答案 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;
}
//...