1

最初にいくつかの背景。最近、Zend_Db_Table ベースのソリューションからエンティティ ベースのソリューション (Doctrine) に変更しました。私たちのアプリケーションが成長するにつれて、テーブル クラスはますます醜くなりました。一部のテーブルでは、ENUM 列を使用して文字列ベースのキーを格納し、静的メソッドを使用して人間が判読できる文字列に変換しました。このようなもの:

public static function getProductType($productKey)
{
    if (!array_key_exists($productKey, self::$productTypes)) {
        return null;
    }
    return self::$productTypes[$productKey];
}

public static function getProductTypes()
{
    return self::$productTypes;
}

エンティティ ベースのシステムに移行するにあたり、可能な限り静的メソッドを避けるようにしました。キーから値への変換をビュー ヘルパーに移動し、1 日で終了しました。最終的に、JSON オブジェクトでそれらを返す必要があり、プレゼンテーション レイヤーの外側で発生した (つまり、ビュー ヘルパーに直接アクセスできない) ため、これでは不十分であることがわかりました。

これらのタイプの方法の適切な場所に関する理論を誰かが持っていますか? キーから人間が読める値への変換を行うための別のオブジェクトを作成するか、エンティティ オブジェクトに静的メソッドを実装する必要がありますか?

4

1 に答える 1

0

私の理論では、これはモデル自体で行う必要があります。しかし、複雑なモデルを扱うときは、そのモデルの特別な「プレゼンテーション」を処理する別のクラスを作成したいことがあります。モデルを引数として取り、プレゼンテーション ロジックをカプセル化します。

したがって、あなたの例を使用すると、おそらく次のようになります。

class Model_Product
{
    public static function getAllTypes()
    {
        return array(/* key-value pairs */);
    }

    //returns non human readable value
    public function getType()
    {
        return $this->_type;
    }
}

class Model_Product_Presenter
{
    protected $_model;

    public function __construct(Model_Product $model)
    {
        $this->_model = $model; 
    }

    //returns human readable value
    public function getType()
    {
        $types = $this->_model->getAllTypes();

        if (!array_key_exists($this->_model->type, $types)) {
            return null;
        }
        return $types[$this->_model->type];
    }

    public function getDateCreated($format = "Y-m-d")
    {
        return date($format,$this->_model->timestamp);
    }
}

さらに進んで、ベース プレゼンター クラスを作成して、タイムスタンプを日付に変換したり、数値をフォーマットしたりするなど、一般的なタスクを定義することができます。

更新: 製品タイプのリストへの匿名アクセスについては、静的メソッドを介して製品モデルの責任にすることに害はないと思います。すべての静的メソッドが悪いわけではありません。私の意見では、グローバル定数を宣言するため、この目的での静的メソッドの使用は問題ありません。

より複雑なシナリオでは、この責任を Model_ProductType などの別のクラスに委任します。以下は、本番環境でのこのような複雑なモデルの例です。

https://github.com/magento/magento2/blob/master/app/code/core/Mage/Catalog/Model/Product/Type.php

于 2012-07-02T18:50:24.640 に答える