2

簡単な質問があります。Zend Framework 1 を使用しており、Data Mapper を使用しています。これが私のコードです:

<?php

// application/model/Pos.php
class Application_Model_Pos extends Zend_Db_Table_Abstract
{
    protected $_name = 'pos';
}

// application/model/MapperAbstract.php
abstract class Application_Model_MapperAbstract
{
    private $_dbTable;

    public function __construct(Zend_Db_Table_Abstract $dbTable)
    {
        $this->_dbTable = $dbTable;
    }

    public function findById($id)
    {
        $select = $this->_dbTable()->select()->where('id = ?', $id)->limit(1);
        $row = $this->_dbTable()->fetchAll($select)->toArray();

        if(!empty($row))
        {
            $this->_createEntity($row);
        }
    }

    protected function _createEntity(array $row);
}

// application/model/PosMapper.php
class Application_Model_PosMapper extends Application_Model_MapperAbstract
{
    public function __construct()
    {
        parent::__construct(new Application_Model_Pos());
    }

    protected function _createEntity(array $row)
    {
       return new Sb_Pos($row['name']);
    }

// application/library/Sb/Pos.php
class Sb_Pos
{
    public function __construct($name)
    {
        $this->_name = $name;
    }
}


?>

このコードを念頭に置いて、テーブルの依存関係をどこで処理すればよいでしょうか? マッパーは別のマッパーについて知る必要がありますか? サービス層は必要ですか?

ご協力いただきありがとうございます。

4

1 に答える 1

2

こんにちは、素晴らしい質問です。私はちょうど最近、MidwestPHP 2013 でこの正確なトピックについてプレゼンテーションを行いました - スライドはここにあります(わかりました - その自己宣伝について申し訳ありません!)

基本的に、あなたの質問に対する簡単な答えは、サービス層が必要だと思うということです。複数の方法でデータを取り込み、マップするオブジェクトを操作する場合、サービスはすべてのマッパーをまとめて描画します。マッパーはデータ オブジェクトのすべてまたは一部を入力できますが、データ ソースを「ジャンプ」することはできません。そのため、特定のオブジェクトがデータを取得するために複数のデータ ソースを必要とする場合は、そのオブジェクトをマッパーからマッパーに渡す必要があります。

ここで ZF でデータベースを使用していると仮定すると、別の方法として、テーブル データ アクセス オブジェクトの依存関係を無視してベース データベース接続を取得し、複雑な結合を構築してすべてのデータを取得することもできます。一部の人々はこれに反対するでしょう - しかし、それは非常に滑りやすい斜面です: どの時点で、これらの個別のテーブルを無視し始め、(パフォーマンスのために) SQL を結合し始めます。お役に立てれば!

于 2013-03-05T15:43:22.973 に答える