2012-04-13 13 views
1

私は自分のサイトにオブジェクト指向のアプローチを適用しようとしています。オブジェクト指向のページレンダリング

私は次のオブジェクトがあります。

  1. エラー:Hadlesすべてのエラーを、データベース
  2. 致命的なものの上にアプリケーションを殺す:データベース接続、クエリなど
  3. クッキーを処理します。クッキー
  4. を作成し、読み込みセッション:セッション変数の設定と取得、かなりのハンドル セッション
  5. ユーザー:すべてのユーザー情報を処理します(彼は接続していますか?彼のIPアドレスはです)。知られていますか?彼のIDは何ですか?など)
  6. ページ:上記のすべてのオブジェクトを知っており、一般ユーザー

に示されなければならないかを決定 取得変数に基づいて、各オブジェクトは、それより上のオブジェクトを渡されます。

私がやっていることは、ページ全体をレンダリングするpage-> render()関数があることです。

私は、ヘッダー配列、フッター配列、メタタグ配列、およびスクリプト配列を持っています。これらの配列には、レンダリング関数が順番に含まれています。

public function render(){ 
// to simplify im excluding meta tag and script arrays 
    foreach($this->headers as $header){ 
     include $header; 
     } 

    //page sontents here 

    foreach($this->footers as $footer){ 
     include $footer; 
     } 

私の問題は、レンダリング関数が呼び出されたとき、それらがレンダリングされるように、私はビューが含まれていないときに私は、データベースのデータをレンダリングする方法である:関数は次のようになりますか?

例えば、私は次のコードを持って言うことができます:?PAGE->レンダリング()関数が呼び出されたときに、私はそれらをレンダリングするために何ができるか

$result = mysql_query("SELECT SOME ENTRIES FROM DB"); 
while($row = mysql_fetch_assoc){ 
    include "views/show_the_entry.php"; 
    } 

私は全部が間違っていると思いますか?もしそうなら、誰かがそのようなオブジェクト指向の実装の哲学に関するリンクや情報を提供してもらえますか?

+1

フレームワークを探しています。 –

答えて

1

ビューを処理するのに最も一般的な方法は、独自のクラスとしてビューを作成することです。したがって、汎用ビュークラスから始め、テンプレートの名前でインスタンス化します。

$view = new View('show_the_entry'); 

そこから、関連するすべてのデータをクエリから設定できます。

while($row = mysql_fetch_assoc($rs)){ 
    $view->set('row', $row); 
    echo $view->render(); 
} 

は、このアプローチにはいくつかの利点があります:

  • あなたの意見はあなたがテストできる個別のユニットです。 (ただし、あなたはインクルードを "テスト"することもできると思いますが、ちょっとだけ...カウボーイでしょう。)
  • ビューが依存するデータを明示的にビューに渡す必要があります。 includeを使用すると、インクルードされたビューは呼び出し元のスクリプトのすべての変数にアクセスできることを意味します。 Viewクラスを使用すると、渡されたものだけにスコープが分離されます。
  • Viewクラスは、内部でもファイルを::renderに含めることができます(これは私が見た最も一般的な実装です)。しかし、コードアイソレーション、再利用性、およびテスト容易性は、ビューに必要なものだけを使用させ、明示的にそのデータを渡すことで可能になります。
0

この問題で広く使用されているユビキタスパターンは、Model-view-controllerパターンです。
私はそれがあなたが探しているものだと思っていますが、私はそれらの問題がすでに取り組まれているフレームワークを使用することをお勧めします。 Symfony 2、Yui、Zendはすべて、良いフレームワークです。作成する必要があるサイトによって異なります。

+0

私は実際にMVCパターンを実装しようとしていますが、フレームワークを使用すると多くの問題が解決すると思いますが、フレームワークを使用する準備が整うように、私はそれを見ています。それが何であり、そしてなぜそれを理解するか。つまり、私はむしろ他の誰かが作ったものを使う前に、このような問題を解決したいと言われています。 – ppp

1

まず、mysqlをPHPで使用する方法を知りませんでしたが、そのサイトは古いものでした。本当に古い。古代のmysql_*関数で新しいコードを書くべきではありません。彼らはもはや維持されておらず、PHPコミュニティはbegunを非難するプロセスを持っています。代わりに、代わりにPDO pr MySQLiを使用してください。新しいAPIは、実際にはオブジェクト指向です。つまり、あなたの「データベースクラス」ももう時代遅れです。

PDOを学ぶためには、go hereとすることができます.Missiの場合:わかりません。

しかし、このケースでは、MVC-ishの完全なアーキテクチャーを目指すべきだとは思っていません。そして、あなたはフレームワークから離れるべきです。

は、あなたが実際に必要なものa simple way for templatingを実装し、Javaのスタイルを廃止することがありオンクラスツー含ま-それら-すべて ...またはあなたはそれを呼び出すよう:Pageを。

代わりに...このような何か簡単なスクリプトを使用します。

$connection = new PDO('mysql:...'); 

$user = new User($connection); 
if ($user->hasLoggedOn()) 
{ 
    $template = new Template('overview'); 
    $collection = new Entities($connection); 
    $template->bind('list', $collection->getSome()); 
} 
else 
{ 
    $template = new Template('error-page'); 
} 

echo $template->render(); 

をそして、いや、これはビューがテンプレートであることを想定されていないので、MVCまたは何かMVC-などと呼ばすることはできませんが、クラスのインスタンス。プレゼンテーションロジックを処理し、複数のテンプレートを使用します。そのアーキテクチャーパターンのModel2 MVC(Web MVCとも呼ばれる)バージョンの場合、のビューの情報をからの要求情報モデルレイヤーのから要求します。

しかし、すでに言及したように、この場合のMVCの実装は過剰です。また、MVCに入る前に、SOLID principlesDependency Injectionが何であるかを学ぶ必要があります。

+0

私はいくつかの宿題をしなければならないように見える、答えに時間をかけていただきありがとうございます。 – ppp

関連する問題