検索
ホームページバックエンド開発PHPチュートリアル実用的なOOP:クイズアプリの構築-MVC

Practical OOP: Building a Quiz App - MVC

このチュートリアルは、ボトムアップデザインアプローチとMVC(Model-View-Controller)パターンを使用して、クイズアプリケーションの構築を続けています。 パート1は、クイズと質問エンティティの作成、プレースホルダーデータマッパー、およびサービスインターフェイスをカバーしました。このパートは、スリムフレームワークを使用してサービス、コントローラー、およびビューの実装に焦点を当て、最後に、ダミーマッパーをMongoDBベースのものに置き換えることに焦点を当てています。

重要な概念:

    MVCアーキテクチャ:
  • アプリケーションは、モデル-View-Controllerパターンを使用し、クイズと質問エンティティがモデルを形成し、ユーザーインターフェイスをビューとして形成し、ユーザーインタラクションフローを定義するクイズサービス(コントローラー)。
  • Slim Framework: Slimは、コントローラーとビューのフレームワークを提供します。 そのモジュール性により、他のMVCフレームワークに簡単に交換できるようになります。
  • データアクセス:データマッパーがMongoDBに接続し、データベースの相互作用を抽象化します。これにより、データベースの切り替えが簡単になります
  • サービスレイヤーおよびドメインモデル:アプリケーションはサービスレイヤーを使用してビジネスロジックをカプセル化し、保守性のための「脂肪モデル、薄いコントローラー」原理を順守しています。
  • 実装Agnostismision:サービスは、ユーザーインターフェイスから独立しているように設計されており、さまざまなフロントエンド(例:コマンドライン)を可能にします。
  • サービス実装(
  • コアサービスクラス(
  • )を以下に詳しく説明します。 セッション変数は単純さのために使用されることに注意してください。より堅牢なソリューションは、より広いアプリケーションコンテキストに専用のセッション管理レイヤーを使用します。

QuizAppServiceQuiz

QuizAppServiceQuiz

<?php
namespace QuizApp\Service;

use QuizApp\Service\Quiz\Result;

// ...

class Quiz implements QuizInterface
{
    // ... (constants remain the same)

    // ... (constructor remains the same)

    // ... (showAllQuizes remains the same)

    public function startQuiz($quizOrId)
    {
        // ... (logic remains largely the same)
    }

    // ... (getQuestion remains largely the same)

    public function checkSolution($solutionId)
    {
        // ... (logic remains largely the same)
    }

    // ... (isOver remains largely the same)

    // ... (getResult remains the same)

    // ... (getCurrentQuiz remains largely the same)

    // ... (getCurrentQuestionId remains the same)

    // ... (addResult remains the same)
}
、および

のコードは、元のものからほとんど変わらないままであり、コア機能に焦点を当てています。showAllQuizes startQuizgetQuestionスリムフレームワーク統合checkSolutionisOver getResultスリムアプリケーションはgetCurrentQuizで初期化され、ルーティングとレンダリングをセットアップします。 getCurrentQuestionId addResultビュー(

)は、ほぼ同じままで、データのプレゼンテーションを処理します。

mongodb mapper(

index.php

<?php
require 'vendor/autoload.php';

session_start();

$service = new \QuizApp\Service\Quiz(
    new \QuizApp\Mapper\HardCoded() //Initially using HardCoded mapper
);
$app = new \Slim\Slim();
$app->config(['templates.path' => './views']);

// Routes (simplified for brevity)
$app->get('/', function () use ($service, $app) {
    $app->render('choose-quiz.phtml', ['quizes' => $service->showAllQuizes()]);
});

$app->get('/choose-quiz/:id', function ($id) use ($service, $app) {
    $service->startQuiz($id);
    $app->redirect('/solve-question');
});

$app->get('/solve-question', function () use ($service, $app) {
    $app->render('solve-question.phtml', ['question' => $service->getQuestion()]);
});

$app->post('/check-answer', function () use ($service, $app) {
    $isCorrect = $service->checkSolution($app->request->post('id'));
    // ... (redirect logic remains the same)
});

$app->get('/end', function () use ($service, $app) {
    $app->render('end.phtml', ['result' => $service->getResult()]);
});

$app->run();

マッパーはmongodbコレクションと相互作用します。 エラー処理とより堅牢なデータ検証を生産用に追加する必要があります。

<?php
namespace QuizApp\Service;

use QuizApp\Service\Quiz\Result;

// ...

class Quiz implements QuizInterface
{
    // ... (constants remain the same)

    // ... (constructor remains the same)

    // ... (showAllQuizes remains the same)

    public function startQuiz($quizOrId)
    {
        // ... (logic remains largely the same)
    }

    // ... (getQuestion remains largely the same)

    public function checkSolution($solutionId)
    {
        // ... (logic remains largely the same)
    }

    // ... (isOver remains largely the same)

    // ... (getResult remains the same)

    // ... (getCurrentQuiz remains largely the same)

    // ... (getCurrentQuestionId remains the same)

    // ... (addResult remains the same)
}

HardCodedマッパーインスタンスをindex.phpのマッパーに置き換えることを忘れないでください。MongoDBセットアップが完了したら。 Mongoメソッドは、データベースの行のクイズと質問オブジェクトへの変換を処理します。 rowToEntity結論とFAQはほぼ同じままであり、MVCパターン、スリムフレームワーク、およびサービスレイヤー設計の利点を強調しています。 コードの例は、明確にするために簡素化されます。 完全な生産準備コードでは、より包括的なエラー処理、入力検証、セキュリティ対策が必要です。

以上が実用的なOOP:クイズアプリの構築-MVCの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
PHPを使用してアップロードできるファイルの最大サイズはどれくらいですか?PHPを使用してアップロードできるファイルの最大サイズはどれくらいですか?Apr 30, 2025 pm 03:35 PM

この記事では、PHPでファイルアップロードサイズの管理を管理し、2MBのデフォルト制限とPHP.ini設定を変更してそれを増やす方法に焦点を当てています。

PHPのめまいの種類とは何ですか?PHPのめまいの種類とは何ですか?Apr 30, 2025 pm 03:34 PM

この記事では、PHP 7.1で導入されたPHPのヌル可能なタイプについて説明し、変数またはパラメーターが指定されたタイプまたはnullのいずれかを可能にします。読みやすさの改善、タイプの安全性、明示的な意図などの利点を強調し、宣言する方法を説明します

unset()とlink()関数の違いは何ですか?unset()とlink()関数の違いは何ですか?Apr 30, 2025 pm 03:33 PM

この記事では、プログラミングのunset()とlink()関数の違いについて説明し、目的とユースケースに焦点を当てています。 unset()はメモリから変数を削除しますが、link()はファイルシステムからファイルを削除します。どちらもEFFECにとって重要です

PHPの特性とは何ですか?PHPの特性とは何ですか?Apr 30, 2025 pm 03:31 PM

PHP特性により、単一の相続財産コンテキストでコードの再利用が可能になり、再利用性や単純化された継承などの利点があります。それらは、クラスの柔軟性とモジュール性を高めるために、従来の継承と効果的に組み合わせることができます。

PHPは複数の継承をサポートしていますか?PHPは複数の継承をサポートしていますか?Apr 30, 2025 pm 03:30 PM

PHPは複数の継承をサポートしていませんが、インターフェイスと特性を代替として使用して、ダイヤモンドの問題などの問題を回避します。

PHPの継承とは何ですか?PHPの継承とは何ですか?Apr 30, 2025 pm 03:29 PM

PHPの継承により、クラスはプロパティとメソッドを継承し、コードの再利用と階層組織を促進することができます。主な利点には、再利用性、抽象化、多型が含まれます。避けるべき一般的な間違いは、相続の過剰使用と無視することです

主なエラータイプは何ですか、そしてそれらはどのように違いますか?主なエラータイプは何ですか、そしてそれらはどのように違いますか?Apr 30, 2025 pm 03:28 PM

この記事では、プログラミングの3つの主要なエラータイプ、構文、ランタイム、および論理エラーについて説明します。彼らの原因、予防戦略、パフォーマンスとユーザーエクスペリエンスへの影響、診断と解決の方法を説明します。

PHPとHTMLはどのように相互作用できますか?PHPとHTMLはどのように相互作用できますか?Apr 30, 2025 pm 03:27 PM

記事では、PHPとHTMLの相互作用、HTMLにPHPを埋め込むためのベストプラクティス、動的HTMLコンテンツ生成、および推奨される開発ツールについて説明します。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

MantisBT

MantisBT

Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター