Rumah >pembangunan bahagian belakang >tutorial php >OOP Praktikal: Membina Aplikasi Kuiz - MVC

OOP Praktikal: Membina Aplikasi Kuiz - MVC

Jennifer Aniston
Jennifer Anistonasal
2025-02-19 10:40:09720semak imbas

Practical OOP: Building a Quiz App - MVC

Tutorial ini terus membina aplikasi kuiz menggunakan pendekatan reka bentuk bawah dan corak MVC (model-view-controller). Bahagian Satu meliputi penciptaan entiti kuiz dan soalan, pemetaan data pemegang tempat, dan antara muka perkhidmatan. Bahagian ini memberi tumpuan kepada pelaksanaan perkhidmatan, pengawal, dan pandangan menggunakan rangka kerja yang langsing, dan akhirnya, menggantikan pemetaan dummy dengan satu mongoDB yang berasaskan.

Konsep Utama:

  • MVC Architecture: Aplikasi ini menggunakan corak model-view-controller, dengan entiti kuiz dan soalan yang membentuk model, antara muka pengguna sebagai pandangan, dan perkhidmatan kuiz yang menentukan aliran interaksi pengguna ( Pengawal). Rangka Kerja Slim
  • :
  • Slim menyediakan rangka kerja untuk pengawal dan pandangan. Modularitasnya membolehkan penggantian mudah dengan kerangka MVC yang lain.
  • Akses data:
  • Mapper data menghubungkan ke MongoDB, interaksi pangkalan data abstrak. Ini membolehkan penukaran pangkalan data mudah. ​​ Model Perkhidmatan dan Domain Perkhidmatan: Aplikasi ini menggunakan lapisan perkhidmatan untuk merangkum logik perniagaan, mematuhi prinsip "model lemak, pengawal nipis" untuk mengekalkan.
  • pelaksanaan agnostisisme: Perkhidmatan ini direka untuk bebas daripada antara muka pengguna, yang membolehkan front-ends yang berbeza (mis., Command line).
  • Pelaksanaan Perkhidmatan ()

Kelas Perkhidmatan Teras () terperinci di bawah. Perhatikan bahawa pembolehubah sesi digunakan untuk kesederhanaan; Penyelesaian yang lebih mantap akan menggunakan lapisan pengurusan sesi khusus untuk konteks aplikasi yang lebih luas. QuizAppServiceQuiz

Kod untuk

, QuizAppServiceQuiz,

,
<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>
,

, showAllQuizes, startQuiz, getQuestion, dan checkSolution kaedah tetap tidak berubah dari asal, memberi tumpuan kepada fungsi teras. isOver getResult getCurrentQuiz Integrasi kerangka Slim getCurrentQuestionId addResult

Aplikasi Slim diasaskan dalam

, menyediakan penghalaan dan rendering.

Pandangan (

, index.php,

) kekal sebahagian besarnya, mengendalikan pembentangan data.
<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>

choose-quiz.phtml MongoDB mapper () solve-question.phtml end.phtml

Mapper berinteraksi dengan koleksi MongoDB. Pengendalian ralat dan pengesahan data yang lebih mantap perlu ditambah untuk kegunaan pengeluaran.

<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>

ingat untuk menggantikan contoh HardCoded mapper dalam index.php dengan pemetaan Mongo sebaik sahaja persediaan MongoDB selesai. Kaedah rowToEntity mengendalikan penukaran baris pangkalan data ke dalam kuiz dan objek soalan.

Kesimpulan dan Soalan Lazim tetap sama, menekankan manfaat corak MVC, rangka kerja tipis, dan reka bentuk lapisan perkhidmatan. Contoh kod dipermudahkan untuk kejelasan. Lengkap, kod siap sedia akan memerlukan pengendalian ralat yang lebih komprehensif, pengesahan input, dan langkah keselamatan.

Atas ialah kandungan terperinci OOP Praktikal: Membina Aplikasi Kuiz - MVC. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel sebelumnya:Keperluan LDAP dengan PHPArtikel seterusnya:Keperluan LDAP dengan PHP