Zend Framework 1の後に、データベースとキャッシュレイヤーを次のように設計しました。
class Cache
{
public static function create($adapter, array $params)
{
$class_name = 'Cache_Adapter_' . $adapter;
return new $class_name($params);
}
}
abstract class Cache_Adapter
{
public function __construct(array $params)
{
}
}
class Cache_Adapter_File extends Cache_Adapter
{
// ...
}
使用例:
// config.php
return array(
'cache' => array(
'adapter' => 'file',
'params' => array(
'path' => '/path',
),
),
);
// bootstrap.php
$dic->cache = Cache::create($config['cache']['adapter'], $config['cache']['params']);
各キャッシュアダプタは異なるパラメータを持つことができるため、このアプローチは優れています。たとえば、ファイルキャッシュには、キャッシュファイルを保存するディレクトリへのパスが必要です。
次に、データベースにデータを格納するためのキャッシュアダプターを作成したいと思いました。スカラーパラメーター配列の代わりに、データベース抽象化クラスの依存関係が必要であることに気付きました。
現在、データベース接続は依存性注入コンテナに登録されています。
// config.php
return array(
'db1' => array(
'adapter' => 'mysql',
'params' => array(
'user' => 'root',
'connect_timeout' => 5,
),
),
'db2' => array(
'adapter' => 'sqlsrv',
'params' => array(
'db' => 'foo',
),
),
);
// bootstrap.php
$dic->db1 = Site:Db::create($config['db1']['adapter'], $config['db1']['params']);
$dic->db2 = Site:Db::create($config['db2']['adapter'], $config['db2']['params']);
そこで、スカラー構成パラメーター配列に加えて、0個以上の特定の依存関係をキャッシュアダプターに渡す方法を尋ねたいと思いました。これはconfig.phpで実行できます。
class Cache_Adapter_Db extends Cache_Adapter
{
// Instead of abstract Cache_Adapter::__construct(array $params)
// something like this is needed:
// public function __construct(array $params, Db_Adapter $db)
public function __construct(array $params)
{
}
}