2012-07-09 27 views
0

我使用CakePHP 2.2和我有這個簡單的控制器,命名爲ProvidersController如何在CakePhp組件中調用回調?

<?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

a)他們是私人的 - 在這個世界上沒有任何職業,除非這個實際上可以稱爲他們 b)你的組件不應該觸發控制器方法。它應該是相反的方式 – mark 2012-07-09 13:03:56

回答

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; 
} 
//... 
+0

儘管這是將成功/失敗信息返回給控制器的有效解決方案,但問題明確詢問了回調模式中的細節。 – pixelistik 2012-07-09 15:00:42

+0

哇,@pixelistik,你之後投票給我,之後他將它標記爲答案?這似乎有點低,你不覺得嗎?我讀了這個問題,瞭解了他希望達到的目標,並據此做出了回答。如果他認爲我的回答很有幫助,那麼他就是由他來決定的 - 顯然他做到了。我也相信我的答案將有助於99%的人試圖從組件中調用控制器方法,但事實上,他們會更好地執行我上面提出的建議。 – Dave 2012-07-09 15:06:49

+0

我並不是故意要冒犯你。我只是回答這個問題,並解釋了爲什麼我認爲這不是它的答案。我已經多次看到upvoted問題與標記爲正確的問題不同。 – pixelistik 2012-07-09 15:21:07

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; 
    } 
} 

您可以使用相同的模式,以回調的方式傳遞到組件。