2

私の会社には、配列またはZend_DB_Table_Rowからオブジェクトを作成するためのメソッドsetOptionsを備えたそのようなモデルがあります。

<?php

class Model_Company 
{
    protected $c_id;
    protected $c_shortname;
    protected $c_longname;


    public function __constructor(array $options = null)
    {
        if(is_array($options)) {
            $this->setOptions($options);
        }
    }

    public function setOptions($data)
    {
        if($data instanceof Zend_Db_Table_Row_Abstract) {
            $data = $data->toArray();
        }
        if(is_object($data)) {
            $data = (array)$data;
        }
        if(!is_array($data)) {
            throw new Exception('Initial data must be object or array');
        }
        $methods = get_class_methods($this);
        foreach($data as $key => $value) {
            $method = 'set'.ucfirst($key);
            if(in_array($method, $methods)) {
                $this->{'c_'.$key} = $value;    
            }

        }
        return $this;
    }

また、さまざまなdb / soap/rest用のモデルやアダプターなどのパラメーターを持つ会社のマネージャーがいます

  class Model_CompanyManager 
{
    private $_adapter;
    public function __construct(Model_Company $model,$adapter) 
    {
        $this->_adapter = $adapter;
        $this->_model = $model;
        return $this;
    }   
    /**
     * Save data
     * @var Model_Company $data
     */
    public function save(array $data)
    {
        $data = $this->_model->setOptions($data);
        $this->_adapter->save($data);
    }


}

そしてDBTableのDBTable

class Model_DbTable_Company extends Zend_Db_Table_Abstract
{
    protected $_name = 'company';
    protected $_id = 'c_id';


    public function save(Model_Company $data) 
    {

        try {
            if(isset($data['c_id'])) {
                $this->update($data, 'c_id = :c_id',array('c_id' => $data['c_id']));
            } else {

                $this->insert($data);

            }    
        } catch (Zend_Db_Exception $e) {
            throw new Exception($e->getMessage());
        }
    }


}

モデルのプロパティが保護されており、(配列)$ dataを実行できないため、dbに挿入するにはどうすればよいですか?

$this->_companyManager = new Model_CompanyManager(new Model_Company,new Model_DbTable_Company);
$this->_companyManager->save($values);

次のように、save内にフィールド名を持つ配列を作成する必要はありません。

$data = array(
            'c_shortname' => $company->getShortname(),
            'c_longname' => $company->getLongName(),
            'c_description' => $company->getDescription(),
            'c_salt' => $company->getSalt(),
            'c_password' => $company->getPassword(),
            'c_updated_at' => date('YmdHis')
        );

モデルフィールドの名前などを変更するときは、ここでも変更することを覚えておく必要があるためです...単純なアプローチがありますか、モデルがすべてを維持し、クリーンにするパターン

4

1 に答える 1

2

リフレクションを使用してすべてのオブジェクト プロパティのリストを取得するだけの場合は、get_class_varsを使用できます。最近のバージョンの PHP では、スコープに関係なくすべてのクラス変数が返されます。しかし、通常はData Mapperと呼ばれるこのManagerを使用しているため、モデル オブジェクトがデータベース テーブルに正確に配置されないことが予想されると思います。それ以外の場合は、Zend_Db_Table クラスの table-row-gateway パターンに固執する必要があります。

私は個人的に、ZF アプリケーションと組み合わせた Data Mapper パターンの大ファンです。リレーショナル データベース テーブルに対応するのは、最も単純なアプリだけです。データベース スキーマの前に、より豊富なオブジェクトとモデルとビジネス ロジックの作成を促進します。

マッパーの仕事は、エンティティを永続化レイヤーにマッピングすることです。そのため、マッパーの save() メソッドで、SQL ステートメントの実際の割り当てを処理します (おそらく、テーブルのフィールド名を使用して配列を作成し、値、場合によっては複数のテーブルに保存することもできます) は完全に受け入れられます。

オブジェクトの一部がより単純で、テーブルとの整合性が高い場合 (確かにそうです)、私がやりたいのは、オブジェクトに対して __toArray() メソッドを使用することです。挿入/更新ステートメントの構築に適した表現を返す責任を負うことができます。また、AJAX 経由で提供するために JSON 表現が必要な場合にも役立ちます。get_class_vars 関数または他のリフレクションを使用してください。私は通常、2 つのマッパー基本クラスを持っています。1 つは基本的に Zend_Db_Table と同じことを行う CRUD 関数を備えたもので、もう 1 つはより多くのコードを書く責任がある、より骨格的なものです。それらは共通のインターフェースに従う必要があります。ちょっとしたことで、両方の長所が得られます。

このリンクは、いくつかのアイデアの良いリソースであることがわかりました。

于 2012-10-17T23:16:07.473 に答える