0

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)
    {

    }
}
4

1 に答える 1

0

関連する 2 つの手順があります。最初に、キャッシュ アダプターはその親クラスを正しい方法で呼び出す必要があります。

class Cache_Adapter_Db extends Cache_Adapter
{
    public function __construct(array $params, Db_Adapter $db)
    {
       parent::__construct($params);
    }
}

2 番目: ファクトリ クラスCacheはより多くのパラメーターを受け入れる必要があります。

class Cache
{
    public static function create($adapter, array $params, $optparams = null )
    {
        $class_name = 'Cache_Adapter_' . $adapter;

        return new $class_name($params, $optparams);   
    }
}

config php は次のようになります。

// config.php
return array(
    'db1' => array(
        'adapter' => 'mysql',
        'params' => array(
            'user' => 'root',
            'connect_timeout' => 5,
        ),
    ),
    'db2' => array(
        'adapter' => 'sqlsrv',
        'params' => array(
            'db' => 'foo',
        ),
        'options' => 'extraoption'
    ),
);

そしてbootstrap.phpで:

$dic->db2 = Site:Db::create(
   $config['db2']['adapter'], 
   $config['db2']['params'],
   $config['db2']['options']
);
于 2012-09-28T12:04:44.160 に答える