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

如何在CakePhp组件中调用回调?,php,cakephp,Php,Cakephp,我使用的是CakePhp 2.2,我有一个简单的控制器,名为ProvidersController: <?php class ProvidersController extends AppController { public $components = array('Session', 'Social'); public $layout = false; public function facebook(){ $this->

我使用的是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(){

    }

}

?>
<?php

class SocialComponent extends Component {

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

    }

}

?>

而这个名为SocialComponent的组件:

<?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(){

    }

}

?>
<?php

class SocialComponent extends Component {

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

    }

}

?>

如您所见,我在控制器中创建了success()和error()方法。现在我传递这些名称,我想从组件中调用它们

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


谢谢大家!

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

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

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

看看CakePHP中的,它与blackHoleCallback的情况相同

他们使用一个使用PHP的帮助函数


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

a)它们是私有的-除了这个非常相同的类之外,地球上没有任何类可以实际调用它们b)您的组件不应该触发控制器方法。这应该是另一种方式虽然这是一种有效的解决方案,可以将成功/失败信息返回控制器,但问题明确地询问了回调模式中的一个细节。哇,@pixelistik,在他将其标记为答案后,你否决了我?这似乎有点低,你不觉得吗?我读了这个问题,理解了他希望实现的目标,并据此作出了回答。他是否认为我的回答有用取决于他自己——显然他是这么认为的。我也相信我的回答会帮助99%试图从组件调用控制器方法的人,而实际上,他们最好还是按照我上面的建议去做。我不是有意冒犯你。我只是想问一下这个问题,并解释了为什么我认为这不是问题的答案。而且我已经看到过很多次投票结果与被标记为正确的问题不同。@pixelistik-正如我提到的,这个答案将帮助99%的人找到这个问题(这显然对OP有所帮助)。这是一个可靠而有用的答案。在你更好地理解StackOverflow的目的之前,请不要对自己投太多的票(帮助他人,因为他们可能知道或可能不知道实现某件事情的最佳方法,也可能不会在你眼中“完美地”表达他们的问题。)