CakePHP: DataSource on-the-fly (statt in app/Config/database.php) laden

Bei der Verwendung von CakePHP DataSources wäre es manchmal nützlich, wenn man sie nicht erst umständlich in der Datei database.php definieren müsste. Gerade dann, wenn keine Config (Zugangsdaten, API-Keys etc.) für die DataSource nötig ist oder wenn diese erst zur Laufzeit vorgenommen werden soll/kann, ist eine flexiblere Lösung wünschenswert.

Mit folgendem Code wird für das Model MyModel on-the-fly eine DataSource mit dem Namen ‘custom’ vom Typ ‘CustomSource’ erzeugt:

/**
* MyModel
*
* @author Pascal Rilka <rilka@omg.de>
* @since 17.04.2013
*/
class MyModel extends AppModel
{
  public $useTable = false;
  public $useDbConfig = 'custom';

  public function __construct($id = false, $table = null, $ds = null)
  {
    $class = 'CustomSource';

    try
    {
      $ds = ConnectionManager::getDataSource($this->useDbConfig);
    }
    catch(Exception $e)
    {
      if(App::import('Model/Datasource', $class))
        $ds = ConnectionManager::create($this->useDbConfig, array('datasource' => $class));
    }

    if(!$ds)
      throw new MissingConnectionException(compact('class'));

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

Das Äquivalent mit fester Definition in der app/Config/database.php sähe so aus:

class DATABASE_CONFIG
{
  public $custom = array(
    'datasource' => 'CustomSource',
  );
}
class MyTest extends AppModel
{
  public $useTable = false;
  public $useDbConfig = 'custom';
}

 

Leave a Reply

Your email address will not be published. Required fields are marked *