1

私のアプリケーションには、ユーザー、組織、および従業員がいます。それぞれのドメイン オブジェクトと、データベース マッパーがあります。

ユーザーが最初に組織を設定するときに、そのユーザーと組織の組み合わせの従業員レコードを自動的に作成したいと考えています。(レコードのタイプは所有者になります)。基本的に、これは 2 つのデータベース挿入に帰着します。1 つは組織用、もう 1 つは従業員用です。

これについては、次の 2 つの方法があります。

  1. コントローラーは、新しい組織オブジェクトを作成し、マッパー を使用してorgMapper::insert($newOrg)それを永続化できます。それが完了すると、新しい Employee オブジェクトを作成し、employeeMapper::insert($newOwner)永続化のためにマッパー を再び使用できます。
  2. コントローラーは新しい Organization オブジェクトを作成でき、このオブジェクトが残りの作業を行います。を呼び出しorgMapper::insert($this)、返されたキーを使用して、新しい Employee オブジェクトを作成して永続化します。

2 番目のアプローチには多くの利点があるようです。ビジネス ロジック (つまり、新しい各組織の従業員/所有者レコード) がモデルに組み込まれ、コントローラーがよりスリムになります。私がためらう唯一の理由は、これは私のドメインが私のマッパーに依存するようになることを意味するということです.

ドメイン内のファクトリを使用してマッパーを取得するので、すべての結合が 1 つのポイントになります。これは依存関係を受け入れられるものにしますか? それとも、より深い設計上の問題がありますか?

サービス層について少し読んだことがあります。おそらく、これは私が見るべき場所ですか?

PHPとZend Frameworkを使用しています

あなたの考えは大歓迎です。私の猫と私は私たち自身のアイデアを使い果たしました...

4

2 に答える 2

2

私はZFユーザーではないので(そしてそれを避けてきました)、おそらく私の解決策は適用されないでしょう。

データマッパーは、データベース内の1つのテーブルだけで機能することは想定されていません。代わりに、新しいエントリを保存するとき(そして、インスタンスにオブジェクトのコレクションが含まれているOrganizationと思います)、マッパーはEmployeesのすべてのエントリと、それに付随するデータをテーブルに作成する必要があります。OrganizationEmployeeOrganizationEmpoyees

簡単な答え:どちらも、ストレージはマッパーの責任です。

DB構造を誤解し、それが「(..)そのユーザー/組織の組み合わせの従業員レコード」Employeeドメインオブジェクトが完全に分離されていることとどのように関連しているかを誤解した場合Organization、最初のソリューションは受け入れられます。


ドメインオブジェクトとマッパーの上にサービスを追加することに関しては、それは良い考えです。すでにコントローラー内のドメインロジックをリークしているためです。悪いことのようです。

于 2012-06-09T10:54:25.453 に答える
0

このような場合に私が何をするかをお伝えできます。データの山を取得し、そこから複数のオブジェクトを構築する必要があるときはいつでも、混乱全体を別のモデル (おそらくサービス層、私にはわかりません) にダンプし、コントローラーからオブジェクトを整理します。コントローラーを使用してデータを取得し、別の場所 (ビューまたはモデル) に送信するだけです。

たとえば、音楽コレクションからいくつかのデータを保存したいのですが、データは現在csvファイルにあります。私のコントローラーはcsvファイルを解析し、データの各行を配列に入れ、データをオブジェクトにソートしてデータベースに保存するクラスメソッドに転送します。(この方法は予備的なものであり、微調整と調整が必要であることに注意してください)

//FROM class Application_Model_Tag
public function saveTags() {
        //TODO implement instantiation of Domain Models instead of passing arrays to mappers
        $trackMapper  = new Music_Model_Mapper_Track();
        $artistMapper = new Music_Model_Mapper_Artist();
        $albumMapper  = new Music_Model_Mapper_Album();

        if (isset($this->_hash)) {
            //see if track already exists by comparing hashs
            $trackRow = $trackMapper->fetchByColumn('hash', $this->getHash());
            //if track does not exist
            if (is_null($trackRow)) {
                //save the artist
                $artistData = array(
                    'name' => $this->getArtist()
                );
                //see it the artist exists by name
                $artistRow = $artistMapper->fetchByColumn('name', $this->getArtist());
                //does artist exist?
                if (is_null($artistRow)) {
                    $artistRow = $artistMapper->save($artistData);
                }

                //Save the Album Data
                //does the album exist?
                $albumRow = $albumMapper->fetchByColumn('name', $this->getAlbum());
                //if yes
                if (is_null($albumRow)) {
                    $albumData = array(
                        'name'      => $this->getAlbum(),
                        'artist_id' => $artistRow->id,
                        'art'       => $this->getAlbum() . '.jpg',
                        'year'      => $this->getYear()
                    );
                    //get album row
                    $albumRow = $albumMapper->save($albumData);
                }
                //Save track data
                $trackData = array(
                    'title'     => $this->getTitle(),
                    'filename'  => $this->getFilename(),
                    'path'      => $this->getPath(),
                    'format'    => $this->getFormat(),
                    'genre'     => $this->getGenre(),
                    'artist_id' => $artistRow->id,
                    'album_id'  => $albumRow->id,
                    'track'     => $this->getTrack(),
                    'play_time' => $this->getPlay_time(),
                    'hash'      => $this->getHash()
                );
                //save track data
                $trackMapper->save($trackData);
            }
        } else {
            return;
        }
    }

これがお役に立てば幸いです。例の粗雑さをお許しください。

于 2012-06-09T12:24:48.890 に答える