0

私はCakePhp2.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 に答える