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