2

モデルレイヤーがサービスとモデルに分離されているZendFrameworkアプリケーションを構築しています。コントローラアクションはサービスメソッドを呼び出し、サービスメソッドはモデルメソッドを呼び出します。

例:LanguagesController :: addAction()は、フォームが送信されて有効かどうかを確認します。その場合、フォームデータをService_Language :: add()に渡します。ここで、Model_Language :: add()を呼び出す前に、データにビジネスロジックが適用され、データベースにレコードが効果的に追加されます。

つまり、ほとんどのコントローラーアクションにはサービスクラスのインスタンスが必要であり、サービスクラスのほとんどのメソッドにはモデルクラスのインスタンスが必要です。

私は以前このようにそれをしていました(サービスクラスの例)

class Service_Language
{
    public function add()
    {
        $languageModel = new Model_Language;

        // perform some business logic and add record
    }

    public function edit()
    {
        $languageModel = new Model_Language;

        // perform some business logic and edit record
    }

    public function delete()
    {
        $languageModel = new Model_Language;

        // perform some business logic and delete record
    }
}

煩雑になるだけでなく、コントローラーアクションが複数のServiceメソッドを呼び出すより複雑なアプリケーションでは、同じModelクラスの複数のインスタンスが存在することになります。これは不要です。

同僚から、次の2つのオプションを検討するように言われました。

  • モデルインスタンスをサービスのプロパティに保持します
  • モデルインスタンスをZend_Registryに保持します

最善の解決策は最初の選択肢だと思います。その理由は、Zend_Registryがグローバルコンテナとして機能するためです。ModelインスタンスをControllerアクションで使用できるようにしたくありません。これは、アーキテクチャが悪いためです。これについてどう思いますか?

最初のオプションは次のように実装できます。

class Service_Language
{

    protected $_model = null;

    function setModel()
    {
        $this->_model = new Model_Language();
    }

    function getModel()
    {
        if($this->_model == null)
        {
            $this->setModel();
        }

        return $this->_model;
    }
    public function add()
    {
        $languageModel = $this->getModel();

        // perform some business logic and add
    }
}
4

2 に答える 2

1

あなたの説明から、あなたのサービスクラスは緊密に結合されたモデルを必要としているように思えます。

その場合、あなたのモデルの公開ゲッター/セッターは必要ないと思います-サービスに別のモデルを設定する必要がある状況は現実的にありますか?

その場合、モデルをプロパティに割り当てることは理にかなっています-コンストラクターでこれを行わないのはなぜですか?

class Service_Language
{
    protected $_model = null;

    public function __construct()
    {
        $this->_model = new Model_Language();
    }

    public function add()
    {
        // perform some business logic and add
        $this->_model->add($data);
    }

    public function edit()
    {
        // perform some business logic and add
        $this->_model->edit($data);
    }
} 
于 2012-11-14T04:17:38.053 に答える
0

コンストラクターは良いオプションでしたが、サービスレイヤーのすべてのメソッドがそのジョブを実行するためにモデルインスタンスを持っている必要はないので、私はこのようにすることになりました。私はOOPプログラミングに比較的慣れていないので、これが良い解決策であるかどうか疑問に思っています。どんな考えでも大歓迎です。

class Service_Language
{

    protected $_model = null;

    protected function setModel()
    {
        $this->_model = new Model_Language();
    }

    protected function getModel()
    {
        if($this->_model == null)
        {
            $this->setModel();
        }

        return $this->_model;
    }

    // Function where model is needed
    public function add($data)
    {
        // Perform some business logic

        $this->getModel()->add($data);

        // return something
    }

    // Function where no model is needed
    public function add($data)
    {
        // Perform some business logic

        // return something
    }
}    
于 2012-11-19T00:56:31.673 に答える