モデルレイヤーがサービスとモデルに分離されている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
}
}