6

オブジェクトの例を取り上げuserます。ユーザーは、登録、ログイン、ログアウト、編集(電子メールの変更など)する必要があります。

そのため、一方userでは、さまざまなクラス変数(疑似、電子メールなど)に加えて、ゲッターとセッター、およびデータベースを処理しないいくつかの関数を含むオブジェクトがあります。

一方、DAOさまざまなMySQL / PDOクエリ(レコードの作成、更新、情報の取得など)を介してデータベースを直接処理するオブジェクトであるクラスがあります。

userオブジェクトをオブジェクトと直接相互作用させない理由はありDAOますか?言い換えるとController、既存のインスタンスに関連するデータベースクエリを要求するuser場合(たとえば、登録プロセス中)、userそれ自体が関数を呼び出す関数を呼び出すだけDAOでよいのでしょうか、それとも間にレイヤーがあるべきでしょうか?

コントローラがDAOと対話するために3番目のクラスを呼び出し、userインスタンスを引数として渡す例を見てきました。代わりに、この3番目のレイヤーがuserインスタンスの作成との処理を担当する場合がありますDAODAOを処理するために使用されるすべての関数は、オブジェクト内に存在する可能性があるように思われuserます。私は何が欠けていますか?

4

2 に答える 2

3

MVC 設計パターンに準拠している場合、インスタンスがコントローラーにある理由はありません。Userプレゼンテーション層に漏れるのではなく、モデル層の一部である必要があります。

あなたが「コントローラー」と呼んでいるものは、実際には、データストレージ関連の構造(マッパーリポジトリー、DAO)上のドメインオブジェクト間の相互作用を処理する、モデルレイヤーの一部であるはずのサービスのようです。

基本的に、欠けているのは、懸念事項の正しい分離です。

コントローラーは、ドメイン ビジネス ロジックを処理するのではなく、データを認識またはユーザー管理サービスに渡すだけである必要があります。このサービスは、Userオブジェクトを初期化し、データを検証して、保存を試みる必要があります。コントローラーはこれを認識してはなりません。

このようなもの:

class SomeController
{
     // ---- snip ----

     public function postRegister( $request )
     {
          $accounts = $this->serviceFactory->create('AccountManagement');
          $account->create( $request->getPost('username'),
                            $request->getPost('email'),
                            $request->getPost('password'),
                            $request->getPost('password2') );

          $this->view->setState( View::STATE_POST );
     }

     // ---- snip ----
}

class AccountManagement extends Service
{
     // ---- snip ----

    public function addUser( $username, $email, $password, $repeated_password )
    {

        $user = $this->domainObjectFactory->create( 'User' );

        $user->setNickname( $username );
        $user->setEmail( $email );
        $user->setPassword( $password );
        $user->matchRepeatedPassword( $repeated_password );

        if ( $user->isValid() )
        {
            $dao = $this->DAOFactory->create( 'User' );
            $dao->save( $user );
        }

        // additional code for saving the error state
        // if domain object turns out to be invalid
        // or DAO returns an error
    }

     // ---- snip ----
}

PSこの投稿は関連性があると思われるかもしれません。

于 2012-09-12T20:16:47.040 に答える
2

モデル用のある種のアダプターまたはゲートウェイについて説明していると思います。アダプターを呼び出すクラスがあり (データベースまたは XML データソースとやり取りする場合があります)、結果をモデルのインスタンスに割り当てます (つまり、一致する各ユーザー結果をモデルのインスタンスに割り当てますUser)。

過去に、1 つのアイテムを表すモデルがあり、次に DAO を使用してこれらのアイテムをデータ ソース (データベースなど) に保存および取得し、コントローラーを使用して説明したアプローチを取りました。ロジックを実行します。したがって、非常に基本的なバージョン:

ユーザーDAO.php

class UsersDAO extends DAO
{
    public function save(User $user)
    {
        return is_null($user->id) ? $this->insert($user)
                                  : $this->update($user);
    }

    public function insert(User $user)
    {
        $sql = "INSERT INTO `users` (`username`, `password`)
                VALUES (:username, :password)";

        $stmt = $this->db->prepare($sql);
        $stmt->bindParam(':username', $user->username);
        $stmt->bindParam(':password', $user->password);
        $stmt->execute();
    }
}

ユーザー.php

class User
{
    public $id;
    public $username;
    public $password;
    public $email;
}

ユーザーコントローラー.php

class UserController extends Controller
{
    public function register()
    {
        $usersDao = new UserDAO;

        if ($_POST) {
            $user = new User;
            $user->username = $_POST['username'];
            $user->password = $_POST['password'];

            $userDao->save($user);
        }
    }
}

お役に立てれば。

于 2012-09-12T18:30:07.920 に答える