0

Cakephp 2.3.8 を使用して、別のデータソース内で作成したカスタム カウチベース データソースへの接続をセットアップしようとしています。モデルを介してロードされているときに、サイトの残りの部分で適切に機能をロードしようとしているデータソース。接続マネージャーを使用してこのデータソースをロードしたいと考えています。これは私がこれまでに持っているものです:

database.php ファイル:

public $queriesCB = array(  
    'datasource' => 'CouchbaseSource',
    'username'      => 'queries',
    'password'   => '',
    'bucket'        => 'queries', 
    'prefix'    => 'q_',
    'expiry'    => '1814400', //3 Weeks
    'autoConnect' => true, 
    'database'      => NULL , 
    'persistent' => false
    );

他のデータソース内でcouchbaseデータソースをロードしようとしています

$db = ConnectionManager::getDataSource("queriesCB"); 

$db をデバッグすると、次のようになります。

object(CouchbaseSource) {
        description => 'Couchbase DataSource'
        conObject => object(Couchbase) {
                [private] _handle => resource
        }
        config => array(
                'password' => '*****',
                'database' => '*****',
                'prefix' => '*****',
                'datasource' => 'CouchbaseSource',
                'username' => 'queries',
                'bucket' => 'queries',
                'expiry' => '1814400',
                'autoConnect' => true,
                'persistent' => false
        )
        prefix => 'q__'
        connected => false
        cacheSources => true
        configKeyName => 'queriesCB'
        [protected] _baseConfig => array()
        [protected] _descriptions => array()
        [protected] _sources => null
        [protected] _transactionStarted => false
}

これを呼び出そうとすると、エラーが発生します。

$db = ConnectionManager::getDataSource("queriesCB"); 
$db->Get('test');

エラー: 未定義のメソッド CouchbaseSource::Get() を呼び出します。

これはカスタム メソッドです。データソースはすべて、couchbase で最適に動作するようにカスタム化されており、Get メソッドは適切に機能します。Cakephpでこの接続を間違って設定するにはどうすればよいですか?

編集:

mysql データベースへのデフォルトのデータベース構成でテストしましたが、同様に失敗します。ここでの質問は、新しいデータソースを初期化する最良の方法は何でしょうか? そのデータソースがアタッチされたモデルをロードする必要がありますか? 例: データソースがカウチベースのカウチベース モデルがありますか?

編集:これはデータソースの一部です

class CouchbaseSource extends DataSource { 
    public $description = 'Couchbase DataSource';
    public $conObject = NULL;
    public $config = NULL;
    public $prefix = NULL;


public function __construct($config = array()){

    // If no configuration is set we use the default
    $this->config = $config; 

    // Setup the cache string that is used when building the string
    $this->prefix = (isset($this->config['prefix']) ? $this->config['prefix']."_" : "");

    if ($this->config['autoConnect']) {
        $this->connect();
    }

}


public function connect() {
    if ($this->conObject !== true) {
        try {
            $this->conObject = new Couchbase("127.0.0.1:8091", $this->config['username'], $this->config['password'], $this->config['bucket'], $this->config['persistent']);
        } catch (Exception $e) {
            throw new MissingConnectionException(array('class' => $e->getMessage()));
        }
    }
    return $this->conObject;
}


public function query($method, $params, $object) {

    // If not connected... reconnect!
    if(!$this->conObject) {
        $this->connect();
    }

    $apiMethod = $this->__methodToClass($method);
    if (!method_exists($this, $apiMethod)) {
        throw new NotFoundException("Class '{$apiMethod}' was not found");
    } else {
        return call_user_func_array(array($this, $apiMethod), $params);
    }  
}


private function __methodToClass($method) {
    return 'CB' . strtolower(Inflector::camelize($method));
}


public function describe(&$Model) {
    return $this->description;
}

/////////////////////////////////////////////////
// Query Methods
/////////////////////////////////////////////////

public function CBadd($key = NULL, $value = NULL, $expiry = NULL, $persisto = NULL, $replicateto = NULL) {
    return $this->conObject->add($key, $value, $expiry, $persisto, $replicateto);
}
4

1 に答える 1

2

解決策は、couchbasesource からクエリ メソッドを直接呼び出すことです。モデルを介してリンクするのとは異なり、データソースをセットアップする方法を考えると、クエリ情報は自動的に渡されませんでした。私の回避策は、これを簡単に使用することでした。

App::uses('ConnectionManager', 'Model');
$db = ConnectionManager::getDataSource("queriesCB");
debug($db->query('Get', array('test')));
于 2013-08-11T02:33:13.250 に答える