ساخت لایهٔ Model


پیش از این توضیح دادیم که به اصطلاح Business Logic یا به عبارتی «آن چیزی که اپلیکیشن به خاطرش توسعه یافته است.» در لایهٔ مدل قرار می‌گیرد و اساساً می‌توان گفت که مدل همچون مغز اپلیکشن است. بخشی از منطق اپلیکیشنی که در حال توسعهٔ آن هستیم به ارتباط با دیتابیس مرتبط است به طوری که قصد داریم مدلی داشته باشیم تا از آن طریق کلیهٔ کاربران سایت را از دیتابیس فراخوانی کرده و در ویویی تحت عنوان users.php نمایش دهیم که در آموزش گذشته ایجاد کردیم.

اما پیش از شروع توسعهٔ لایهٔ مدل، نیاز است تا ماژول جدید ‌Base را در فایل composer.json معرفی نماییم چرا که از این مرحلهٔ آموزش به بعد قصد داریم فایل‌هایی ایجاد نماییم که باید در سایر بخش‌ها استفاده گردند و از همین روی نیاز است تا به صورت خودکار ایمپورت شوند. برای این منظور، فایل composer.json را به صورت زیر تکمیل می‌کنیم:

{
    "autoload": {
        "psr-4": {
            "Core\\": "app/Core",
            "Base\\": "app/Base"
        }
    }
}

همان‌طور که می‌بینیم، مشابه فولدر Core که پیش از این تعریف کرده‌ بودیم، در انتهای خط چهارم یک , قرار داده سپس در خط بعد یک جفت Key/Value به صورتی که در بالا مشاهده می‌شود خواهیم ساخت به طوری که از این پس با استفاده از نِیم‌اِسپیس Base به فولدر Base داخل فولدر app ارجاع خواهیم داد. اکنون به منظور تکمیل فرآیند افزودن نِیم‌اِسپیس Base نیاز است تا مجدد کامند زیر را اجرا نماییم:

/var/www/mvc$ composer dump-autoload -o

از این پس نِیم‌اِسپیس جدید فعال بوده و می‌توانیم از کلیهٔ کلاس‌هایی که داخل پوشهٔ Base می‌سازیم هم در داخل این پوشه و هم در خارج از آن و در کل پروژه استفاده نماییم.

ساخت دیتابیس

ابتدا در محیط phpmyadmin دیتابیسی با نامی دلخواه همچون mvc تعریف می‌کنیم که حاوی جدولی به نام users با اسکمای زیر خواهد بود:

+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| id         | int(11)      | NO   | PRI | NULL    | auto_increment |
| first_name | varchar(255) | NO   |     | NULL    |                |
| last_name  | varchar(255) | NO   |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+

در ادامه، به صورت دستی چند داده وارد جدول users می‌کنیم به طوری که خواهیم داشت:

+----+------------+-----------+
| id | first_name | last_name |
+----+------------+-----------+
|  1 | Behzad     | Moradi    |
|  2 | Sahand     | Imani     |
+----+------------+-----------+

از این پس،‌ شرایط لازم برای ساخت مدل به منظور ارتباط با دیتابیس و فِچ کردن (فراخوانی) داده‌ها از جدول users و نمایش آن‌ها در ویویی تحت عنوان users.php مهیا است (به خاطر داشته باشیم که در حین ساخت دیتابیس، Collation آن را برابر با utf8_general_ci قرار دهیم تا امکان ذخیرهٔ کاراکترهای فارسی را نیز داشته باشیم.)

این بخش از محتوا مخصوص کاربرانی است که ثبت‌نام کرده‌اند.
جهت مشاهدهٔ این بخش از محتوا لاگین نمایید.

ساخت مدل برای فراخوانی لیست کاربران از دیتابیس

در این مرحله از توسعهٔ‌ این وب اپلیکیشن بر پایهٔ‌ معماری MVC،‌ قصد داریم تا مدلی به منظور فِچ کردن لیست کاربران از جدول users ایجاد نماییم. برای این منظور، در روت فولدر Base فولدری تحت عنوان Models ساخته سپس فایلی تحت عنوان User.php حاوی کدهای زیر داخل آن ایجاد می‌نماییم:

<?php
namespace Base\Models;

use Core\Interfaces\UserInterface;

class User implements UserInterface
{
    private $connection;
    private $usersTable = 'users';

    public function __construct($database)
    {
        $this->connection = $database;
    }

    public function fetch()
    {}

    public function fetchById(int $id)
    {}

    public function update(array $data)
    {}

    public function delete(int $id)
    {}
}

پس از تعریف نِیم‌اِسپیس این فایل، هم‌نام با نام این فایل کلاسی تحت عنوان User می‌سازیم که از اینترفیس UserInterface که در آموزش‌های گذشته ساختیم ایمپلیمنت می‌کند و بالتبع کلیهٔ‌ متدهای تعریف‌شده داخل این اینترفیس می‌باید در بدنهٔ این نیز تعریف شوند (با توجه به اینکه از اینترفیس UserInterface داخل این کلاس استفاده نموده‌ایم، مسلماً نیاز به use کردن آن داریم که این کار را در خط چهارم انجام داده‌ایم.)

این کلاس دارای دو پراپرتی تحت عناوین connection$ و usersTable$ از جنس private است؛ به عبارتی، فقط و فقط داخل همین کلاس به آن‌ها دسترسی خواهیم داشت. پراپرتی اول از طریق کانستراکتور مقداردهی خواهد شد بدین شکل که یک پارامتر ورودی تحت عنوان database$ برای کانستراکتور در نظر گرفته‌ایم که در حین ساخت آبجکت از روی کلاس User می‌باید متغیری حاوی کانکشن به دیتابیس را به این کلاس پاس دهیم و بلافاصله این پارامتر در بدنهٔ کانستراکتور به پراپرتی connection$ منتسب خواهد شد. پراپرتی دوم حاوی استرینگ users است به طوری که نام جدولی که قصد داریم به آن کوئری بزنیم را در این پراپرتی ذخیره کرده‌ایم.

با توجه به اینکه در اینترفیس مربوط به این کلاس چهار متد مختلف تعریف کرده‌ایم، طبیعتاً موظف به تعریف کلیهٔ آن‌ها از بدنهٔ کلاس هستیم ولو اینکه نخواهیم از آن‌ها استفاده نماییم (به این کار اصطلاحاً Anti Pattern یا به عبارتی «سَبک غیرحرفه‌ای» توسعهٔ نرم‌افزار گفته می‌شود. در حقیقت، روش توسعهٔ‌ اینترفیس‌ها باید به گونه‌ای باشد که در هر کلاسی که از آن‌ها ایمپلیمنت می‌کنیم، هیچ متدی اضافه نباشد که در همین راستا توصیه می‌کنیم به آموزش درآمدی بر قانون Interface Segregation مراجعه نمایید.)

در این دورهٔ آموزشی صرفاً متد ()fetch را توسعه خواهیم داد و از همین روی کلاس User را به صورت زیر تکمیل می‌کنیم:

<?php
namespace Base\Models;

use Core\Interfaces\UserInterface;

class User implements UserInterface
{
    private $connection;
    private $usersTable = 'users';

    public function __construct($database)
    {
        $this->connection = $database;
    }

    public function fetch()
    {
        $query = "SELECT * FROM $this->usersTable";
        $statement = $this->connection->prepare($query);
        $statement->execute();
        return $statement;
    }

    public function fetchById(int $id)
    {}

    public function update(array $data)
    {}

    public function delete(int $id)
    {}
}

داخل بدنهٔ متد ()fetch ابتدا متغیری تحت عنوان query$ تعریف کرده‌ایم که حاوی یک کد اس‌کیوال ساده است مبنی بر اینکه «تمام دیتای جدول کاربران انتخاب گردد.» پراپرتی connection$ که از این پس حاوی آبجکتی منتسب به کلاس PDO است این امکان را در اختیارمان می‌گذارد تا به متدهای این کلاس دسترسی داشته باشیم. در همین راستا، در ادامه متغیری ساخته‌ایم به نام statement$ که در آن متد ()prepare را روی پراپرتی connection$ فراخوانی کرده سپس به عنوان پارامتر ورودی، متغیر query$ را به آن پاس داده‌ایم و در ادامه متد ()execute را روی متغیر statement$ فراخوانی کرده و در نهایت این متغیر را ریترن کرده‌ایم.


لیست نظرات
کاربر میهمان
دیدگاه شما چیست؟
کاربر میهمان