Heim >Backend-Entwicklung >PHP-Tutorial >Praktisches OOP: Erstellen einer Quiz -App - MVC

Praktisches OOP: Erstellen einer Quiz -App - MVC

Jennifer Aniston
Jennifer AnistonOriginal
2025-02-19 10:40:09721Durchsuche

Practical OOP: Building a Quiz App - MVC

Dieses Tutorial erstellt weiterhin eine Quizanwendung mit einem Bottom-up-Design-Ansatz und dem MVC-Muster (Modell-View-Controller). Teil eins deckte die Erstellung von Quiz- und Fragenunternehmen, eines Platzhalterdaten -Mapper und der Serviceschnittstelle ab. Dieser Teil konzentriert sich auf die Implementierung des Dienstes, der Controller und der Ansichten mithilfe des Slim-Frameworks und schließlich, um den Dummy Mapper durch einen mongoDB-basierten zu ersetzen.

Schlüsselkonzepte:

  • MVC-Architektur: Die Anwendung verwendet das Modell-View-Controller-Muster, wobei die Quiz- und Frage-Entitäten das Modell bilden, die Benutzeroberfläche als Ansicht und den Quizdienst, der den Benutzerinteraktionsfluss definiert (Fluss der Benutzerinteraktion ( Controller).
  • Slim Framework: Slim bietet das Framework für Controller und Ansichten. Die Modularität ermöglicht einen einfachen Austausch durch andere MVC -Frameworks.
  • Datenzugriff: Ein Data Mapper stellt eine Verbindung zu MongoDB her, wobei Datenbankinteraktionen abstrahiert werden. Dies ermöglicht eine einfache Datenbankschaltung.
  • Service -Schicht und Domänenmodell: Die Anwendung verwendet eine Serviceschicht, um die Geschäftslogik zu verkörpern und das Prinzip "Fettmodell, Dünnkontroller" für die Wartbarkeit zu halten.
  • Implementierung Agnostizismus: Der Dienst ist unabhängig von der Benutzeroberfläche und ermöglicht unterschiedliche Frontenden (z. B. Befehlszeile).

Service -Implementierung (QuizAppServiceQuiz)

Die Kerndienstklasse (QuizAppServiceQuiz) ist unten beschrieben. Beachten Sie, dass Sitzungsvariablen zum Einfachheit halber verwendet werden. Eine robustere Lösung würde eine dedizierte Sitzungsmanagementschicht für breitere Anwendungskontexte verwenden.

<code class="language-php"><?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)
}</code>

Der Code für showAllQuizes, startQuiz, getQuestion, checkSolution, isOver, getResult, getCurrentQuiz, getCurrentQuestionId und addResult Methoden bleiben vom Original weitgehend unverändert. Konzentration auf Kernfunktionen.

Slim Framework -Integration

Die schlanke Anwendung ist in index.php initialisiert, wobei Routing und Rendering eingerichtet ist.

<code class="language-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();</code>

Die Ansichten (choose-quiz.phtml, solve-question.phtml, end.phtml) bleiben weitgehend gleich und bearbeiten die Darstellung von Daten.

mongoDB mapper (QuizAppMapperMongo)

Der Mongo Mapper interagiert mit einer MongoDB -Sammlung. Fehlerbehandlung und robustere Datenvalidierung sollten für die Produktionsanwendung hinzugefügt werden.

<code class="language-php"><?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)
}</code>

Denken Sie daran, die HardCoded Mapper -Instanz in index.php durch den Mongo Mapper zu ersetzen, sobald das MongoDB -Setup abgeschlossen ist. Die rowToEntity -Methode übernimmt die Konvertierung von Datenbankzeilen in Quiz- und Fragenobjekte.

Die Schlussfolgerung und die FAQs bleiben weitgehend gleich und betonen die Vorteile des MVC -Musters, des schlanken Rahmens und des Designs für Serviceschichten. Die Codebeispiele sind für Klarheit vereinfacht. Der vollständige, produktionsbereitete Code müsste umfassendere Fehlerbehandlungen, Eingabeträger und Sicherheitsmaßnahmen erfordern.

Das obige ist der detaillierte Inhalt vonPraktisches OOP: Erstellen einer Quiz -App - MVC. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:Essentials von LDAP mit PHPNächster Artikel:Essentials von LDAP mit PHP