1

ドメインに基づいてDBを切り替え、別のDBから資格情報を選択したいのですが、切り替えることができません。

AppController.php

// Select username, password and database based on domain
$this->Company->find('first', [...]);

if ($company) {
    // Connect to second database, droping connection from first.
    $dataSource = ConnectionManager::getDataSource('default');
    $dataSource->config['login'] = $company['Company']['dbuser'];
    $dataSource->config['password'] = $company['Company']['dbpass'];
    $dataSource->config['database'] = $company['Company']['dbname'];

    /**
     * PROBLEM START HERE:
     * Here, need to use new database settings, and, this case
     * Company table does not exists, but I always get it, so,
     * I think I am connected with the first and not second connection.
     */
    print_r($this->Company->find('first'));
}

どうすればこれを修正できますか?

編集

私は成功せずに試しました:

ConnectionManager::drop('default');
ConnectionManager::create('default', $settings);

print_r(ConnectionManager::create('default', $settings))リターン:

[... lots of things ... ]
[config] => Array
    (
        [persistent] => 
        [host] => localhost
        [login] => login
        [password] => password
        [database] => database
        [port] => 3306
        [datasource] => Database/Mysql
        [prefix] => 
    )
[... more things ... ]

編集2

これでデータベースを切り替えることができますが、CompanyModelは常に古いデータベース設定を取得します。

FooController.php

<?php
App::uses('AppController', 'Controller');

class FooController extends AppController {
    var $uses = array('Foo', 'Company');

    public function index() {
        echo'<pre>';
        print_r($this->Company->find('first')); // Here I get from old settings
        print_r($this->Foo->find('first')); // Here I gete from new settings
        echo'</pre>';

        $this->layout = false;
        $this->render(false);
    }
}

AppController.php

public function beforeFilter() {
    $company = ClassRegistry::init('Company')->find('first');
    $settings = array(
        'datasource' => 'Database/Mysql',
        'persistent' => false,
        'host' => 'localhost',
        'login' => $company['Company']['dbuser'],
        'password' => $company['Company']['dbpass'],
        'database' => $company['Company']['dbname'],
        'prefix' => ''
    );

    ConnectionManager::getDataSource('default')->disconnect();

    ConnectionManager::drop('default');
    ConnectionManager::create('default', $settings);

    ConnectionManager::getDataSource('default')->connect();
}
4

4 に答える 4

1

データベース構成ファイルでデータベースを切り替えることができます。

Config/database.phpファイルを次のように構成します。

<?php
class DATABASE_CONFIG {

    // config for e.g. localhost
    public $default = array(
        'datasource' => 'Database/Mysql',
        'persistent' => false,
        'host' => 'localhost',
        'login' => 'root',
        'password' => 'xxxxx',
        'database' => 'cake',
        'encoding' => 'utf8'
    );

    // DB config specifically for your domain
    public $domain_x = array(
        'datasource' => 'Database/Mysql',
        'persistent' => false,
        'host' => 'localhost',
        'login' => 'username_at_hosting_provider',
        'password' => '087bJ#ytvh&^YU#T',
        'database' => 'blabla_cake',
        'encoding' => 'utf8'
    );

    public function __construct(){
        // switch config depending on domain / env('HTTP_HOST')
        if(env('HTTP_HOST')=='domain_x.com'){
            $this->default = $this->domain_x;
        }
        // otherwise keep $this->default
    }
}

編集:

あなたの質問に答えるのは少し速すぎたようです:それはあなたの質問を実際にはカバーしていません。ごめん!

于 2012-08-14T22:20:36.447 に答える
1

構成を動的に作成し、その場で構成を変更する必要があるようです。これがうまくいくかどうかはわかりませんが、答えにつながる可能性があります。

まず、使用するデータソースの構成を作成する必要があります。このために、ConnectionManager::createを使用できます

次に、構成をオンザフライで変更する必要があります。そのために、Model::setDataSourceを使用できます。

試したことはありませんが、うまくいくようです。問題がある場合は、コメントを残して、回答を更新できるようにしてください。

編集:すべてのモデルでを新しいデータソースに変更する必要があるため、これは機能しない可能性があります。構成ConnectionManager::drop()を削除してから、おそらく新しいデフォルトを使用するために使用できる方法があります。defaultConnectionManager::create('default', array(...));

于 2012-08-14T01:46:47.777 に答える
1

__constructさて、 AppModelで関数を作成するこの問題を修正し、すべてのコードを配置してデフォルトのデータソースを削除し、新しい構成で別のデータソースを作成することができました。このようなもの:

AppModel.php

public function __construct($id = false, $table = null, $ds = null)
{
    App::uses('CakeSession', 'Model/Datasource');

    parent::__construct($id, $table, $ds);

    if ($this->useDbConfig == 'default') {
        // Change the datasource config
        $user = CakeSession::read('Auth.User');
        $this->changeDataSource($user);
    }
}



public function changeDataSource($config)
{ 
    ...
    ...
    ...
    $dados = array();
    $dados['database']   = $config['titulo_bd'];
    $dados['host']       = $config['host_bd'];
    $dados['login']      = $config['login_bd'];
    $dados['password']   = $config['senha_bd'];
    $dados['datasource'] = 'Database/Mysql';
    $dados['persistent'] = false;
    $dados['prefix']     = '';
    $dados['encoding']   = 'utf8';


    ConnectionManager::create('default', $dados);
    ConnectionManager::getDataSource('default')->connect();
}
于 2013-08-29T13:30:39.333 に答える
0

私の場合は非常に似ています。私の場合、2種類の接続があります。1つは、接続構成にConfig/database.phpファイルを使用するデフォルトのコア接続です。2つ目は、ログインしたユーザー用に保存されたデータベースの詳細を使用する動的構成です。したがって、いくつかの特定のアクションでは、デフォルトのデータベース接続とユーザーベースのデータベース接続を切り替える必要があります。これがどうやって生まれたのかです。

デフォルトファイルからユーザーベースのデータベース接続に切り替えるには

try {
  ConnectionManager::getDataSource('default')->disconnect();
  ConnectionManager::drop('default');
  ConnectionManager::create('default', $this->config);
  ConnectionManager::getDataSource('default')->connect();
  $db = ConnectionManager::getDataSource('default');
} catch (MissingDatabaseException $e) {
  $this->Session->setFlash($e->getMessage()); 
}

ここで、$this->configはユーザーベースの接続です。

デフォルトのファイルベースの接続に戻すには、次のようにします。

try {
  ConnectionManager::getDataSource('default')->disconnect();
  ConnectionManager::drop('default');
  $dbconfig = new DATABASE_CONFIG();
  ConnectionManager::create('default', $dbconfig->default);
  ConnectionManager::getDataSource('default')->connect();
  $db = ConnectionManager::getDataSource('default');
}

ここで、$ dbconfig-> default、つまり$ defaultには、Config/database.phpのデフォルトの接続構成が含まれています

于 2015-07-20T11:17:58.840 に答える