1

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

私は次のオブジェクトを持っています:

  1. エラー:すべてのエラーを処理し、致命的なエラーのアプリケーションを強制終了します
  2. データベース:データベース接続、クエリなどを処理します
  3. cookie:cookieを作成して読み取ります
  4. セッション:セッション変数を設定および取得し、セッションをほぼ処理します
  5. ユーザー:すべてのユーザー情報を処理します(彼は接続されていますか?彼のIPはわかっていますか?彼のIDは何ですか?など)
  6. ページ:上記のすべてのオブジェクトを認識し、get変数に基づいて、ユーザーに表示する必要があるものを決定します

通常、各オブジェクトにはその上のオブジェクトが渡されます。

私がやろうとしているのは、ページ全体をレンダリングするための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;
        }

私の問題は、ビューを含めるときではなく、レンダリング関数が呼び出されたときにデータベースデータがレンダリングされるように、データベースデータをどのようにレンダリングする必要があるかです。

たとえば、次のコードがあるとします。

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

page-> render()関数が呼び出されたときにそれらをレンダリングするにはどうすればよいですか?

私は全体が間違っていると思っていますか?もしそうなら、誰かがそのようなOO実装の哲学に関するリンクまたはいくつかの情報を提供できますか?

4

3 に答える 3

1

そもそもphpでmysqlを使う方法をどこで学んだのかわかりませんが、そのサイトは古いものでした。本当に古い。mysql_*古い関数を使って新しいコードを書くべきではありません。それらはもはや保守されておらず、PHP コミュニティはそれらを非推奨にするプロセスを開始しています。代わりに、準備済みステートメントでPDO pr MySQLiを使用する必要があります。新しい API は、実際にはオブジェクト指向です。これは、「データベース クラス」も少し時代遅れであることを意味します。

PDO を学習するには、ここにアクセスしてください。MySQLi については、わかりません。

そうは言っても、この場合、本格的な MVC 風のアーキテクチャを目指すべきだとは本当に思えません。また、フレームワークには近づかないでください。

実際に必要なのは、テンプレート化のための簡単な方法を実装し、Java スタイルのOn-class-to-contain-them-all .. またはあなたがそれを呼び出すように: を廃止することです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 とも呼ばれます) バージョンの場合、Viewのインスタンスはモデル レイヤーのドメイン オブジェクトから情報を要求します。

しかし、すでに述べたように、この場合の MVC の実装はやり過ぎです。また、MVC に飛び込む前に、SOLID の原則依存性注入とは何かを学ぶ必要があります。

于 2012-04-15T22:34:07.837 に答える
1

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

$view = new View('show_the_entry');

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

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

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

  • ビューは、テストできる個別の単位です。(ただし、インクルードを「テスト」することもできると思いますが、それはもう少し...カウボーイです。)
  • ビューが依存するデータは、明示的にビューに渡す必要があります。Usingincludeは、含まれているビューが呼び出しスクリプト内のすべての変数にアクセスできることを意味します。クラスを使用するViewと、渡したものだけにスコープが分離されます。
  • クラスはView、内部的にはファイルを単純に含めることができます::render(これは私が見た中で最も一般的な実装です)。しかし、ビューに必要なものだけを使用させ、そのデータを明示的にビューに渡すようにすることで、コードの分離、再利用性、およびテスト容易性を得ることができます。
于 2012-04-13T15:18:41.667 に答える
0

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

于 2012-04-13T14:52:56.373 に答える