2

私は以前にフレームワークの経験がありましたが、実際にはモデルにはあま​​り触れたことがありませんでした. これがすべてのフレームワークに当てはまるのか、それとも zend だけに当てはまるのかはわかりませんが、現在 Zend Framework を学んでいます。

私はサンプル アプリケーションをくまなく調べ、膨大な記事を読もうとしましたが、何が私を混乱させているのかについての簡潔で明確な答えを見つけることができませんでした。

3つのクラスの関係は?(モデル、モデルマッパー、データテーブル)

という名前のデータベース テーブルがusersあり、3 つのフィールドuserID, userName, userPasswordがあるとします。サンプル コードは何ですか?

この方法でアプリケーションのモデル部分を構築する必要がありますか? データベースからデータを取得し、結果を配列として返す関数しかない場合、それは悪い習慣でしょうか?

これは、ユーザー、ユーザーの画像ギャラリー、およびメッセージ機能を備えた非常に単純なアプリケーションであると考えてください。

前もって感謝します。

4

3 に答える 3

5

簡単なアプリケーションを作成し、ZF に慣れるには、データベース テーブルをデータベース アダプタに結び付ける DbTable モデルを使用することから始めます。これはベスト プラクティスではありませんが、簡単に始めることができます。

Zend_Tool cli を使用すると、コマンドはこの形式
zf create db-table name actual-table-name module force-overwriteになり、次の
ように変換されます。

zf create db-table Users users

db これによりUsers.phpatという名前のファイルが作成され、次の/application/models/DbTable/ようになります。

<?php

class Application_Model_DbTable_Users extends Zend_Db_Table_Abstract
{
    protected $_name = 'users'; //name of table, does not have to match name of class
}

これをコントローラーで使用するのfetchAllは、次のように簡単です。

<?php

class IndexController extends Zend_Controller_Action {

   public function indexAction(){
       $db = new Application_Model_DbTable_Users();//instantiate model
       $result = $db->fetchAll();//perform query, see Zend_Db_Table_Abstract for API
       $this->view->users = $result;//send to view
    } 
} 

この小さなクラスを作成するだけで、選択したデータベース アダプタの機能にアクセスできます。アクセスのニーズをカスタマイズするために、DbTable モデルでメソッドを構築することもできます。

<?php

class Application_Model_DbTable_Users extends Zend_Db_Table_Abstract
{
    protected $_name = 'users'; //name of table, does not have to match name of class

    public function getUser($id) {
       $select = $this->select();//see Zend_Db_Select for info, provides more secure interface for building queries.
       $select->where('id = ?', $id);//can be chained

       $result = $this->fetchRow($select);//returns a row object, if array is needed use ->toArray()
       return $result;
    }
} 

このメソッドは、fetchAll() メソッドと同様の方法で使用されます。

<?php

class IndexController extends Zend_Controller_Action {

   public function indexAction(){
       $id = $this->getRequest()->getParam('id');//assumes the id is set somehow and posted
       $db = new Application_Model_DbTable_Users();//instantiate model
       $result = $db->getUser($id);//perform query, see Zend_Db_Table_Abstract for API
       //$this->view->user = $result;//send to view as object
       $this->view->user = $result->toArray();//send to view as an array
    } 
} 

これで始められることを願っています。マニュアルを読むことを忘れないでください

于 2012-07-22T11:47:10.440 に答える
2

一般に、他の多くのフレームワークとは対照的に、ZendFrameworkは特定のモデルアーキテクチャの使用を強制しません。したがって、アプリケーションに最適なアーキテクチャを自由に使用できます。したがって、オブジェクトリレーショナルマッパーの使用は、多くの可能なアプローチの1つにすぎません。

しかし、特定の質問に答えるには、マッパーが使用される理由は、リレーショナルデータベースに格納されている情報をオブジェクトモデルに1:1で変換できないためです。これは、オブジェクトと相対インピーダンスの不一致と呼ばれ、対応するWikipediaの記事で詳細に説明されています。

messagesサンプルアプリケーションでは、との間の関係を考えてみましょうusers。列が括弧で囲まれた2つのテーブルがあると仮定します。

users (id, username, email, password)
messages (recipient: users.id, sender: users.id, message)

これは「ダム」オブジェクトUserとに対応しますMessage。次に、特定のメッセージをロードします。オブジェクトMessageはメソッドgetRecipient()を提供し、getSender()どちらものインスタンスを返す必要がありますUser。ただし、データベース内の特定の行を読み取ると、必要な他のオブジェクトへのすべての参照を含むオブジェクトではなく、配列が返されます。これがまさにマッパーの出番です。データベースからの「フラット」な結果がオブジェクトに変換され、他のオブジェクトへの必要なすべての参照が利用可能になるように注意します。

最後に、もう1つの重要な機能は、永続性をプレーンモデルから分離することです。ある日、従来のリレーショナルデータベースエンジンからXMLストレージに切り替えたいとしましょう。新しい永続層が必要なオブジェクトを提供できる限り、ビジネスロジックに触れる必要はまったくありません。

于 2012-07-22T09:55:11.433 に答える
0

わかったことを確認したい。

Application_Model_UserApplication_Model_Message変数とそのセッターおよびゲッターメソッドのみを持ちます。基本的に、それらはストレージ モデルです。

Application_Model_MessageMapperまた、 MappersgetSenderApplication_Model_Userdb-table クラスを使用してデータを取得します。

これで、コントローラーで次のようなことができます。

$id = $this->getRequest()->getParam('id'); // I received the message ID
$messageMapper = new Application_Model_MessageMapper(); 
$message = $messageMapper->getMessageByID($id); // this method uses Application_Model_DbTable_Message to fetch data, 
// then creates an object type of Application_Model_Message to set its fields and return.

$sender = $messageMapper->getSender($message);  // returns an instance of Application_Model_User after doing the necessary processes.

したがって、マッパーは db-table クラスと対話し、それらからデータをフェッチし、そのデータをモデル オブジェクトに設定して返します。

これまでのところ、これを正しく理解していますか? もしそうなら、私はプロジェクトに取り組み始め、進むにつれてさらに学びます.

これらの db-table クラスを、多対多の関係に必要なリンクテーブルで使用する方法はまだわかりませんが、ベースを取得すれば最終的には理解できると思います。

私が誤解していたことを指摘してください。

于 2012-07-22T22:02:20.347 に答える