ساخت مُدل User


در معماری MVC مُدل این وظیفه را دارا است تا اصطلاحاً Business Logic وب اپلیکیشن را هندل کند و پیش از این هم دیدیم که کامپوننت Api در این پروژه حاوی فولدری تحت عنوان Models است که در حال حاضر خالی می‌باشد. در همین راستا، در این آموزش قصد داریم تا مُدلی تحت عنوان User بسازیم که این وظیفه را دارا است تا پروسهٔ CRUD مرتبط با جدول users را مدیریت کند. برای همین منظور، داخل فولدر Models فایلی می‌سازیم تحت عنوان User.php و آن را به صورت زیر تکمیل می‌کنیم:

<?php
namespace Api\Models;

class User
{
    private $connection;
    private $usersTable = "users";

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

    public function fetchUserById(int $id)
    {
        $query = "
            SELECT
                *
            FROM
                $this->usersTable
            WHERE
                id = ?
        ";
        $statement = $this->connection->prepare($query);
        $statement->execute([$id]);
        return $statement;
    }

    private function emailAlreadyExists(string $email)
    {
        $query = "
            SELECT
                *
            FROM
                $this->usersTable
            WHERE
                email = ?
        ";
        $statement = $this->connection->prepare($query);
        $statement->execute([$email]);
        return $statement->fetchAll(\PDO::FETCH_ASSOC);
    }

    public function create(array $data)
    {
        if ($this->emailAlreadyExists($data['mail'])) {
            return false;
        } else {
            $salt = rand(1000000, 9999999);
            $query = "
                INSERT INTO $this->usersTable
                    (first_name, last_name, email, password, salt)
                VALUES
                    (:first_name, :last_name, :email, :password, :salt);
            ";
            $statement = $this->connection->prepare($query);
            return $statement->execute([
                'first_name' => $data['firstName'],
                'last_name' => $data['lastName'],
                'email' => $data['mail'],
                'password' => md5(sha1($data['pass'] . $salt)),
                'salt' => $salt,
            ]);
        }
    }

    public function login($email, $password)
    {
        $sqlToGetSalt = $this->connection->prepare("SELECT * FROM $this->usersTable WHERE email = ?");
        $sqlToGetSalt->execute([$email]);
        $salt = $sqlToGetSalt->fetchAll(\PDO::FETCH_ASSOC)[0]['salt'];
        $hashedPassword = md5(sha1($password . $salt));

        $query = "
            SELECT
                *
            FROM
                $this->usersTable
            WHERE
                email = ? AND password = ?
        ";
        $statement = $this->connection->prepare($query);
        $statement->execute([$email, $hashedPassword]);
        return $statement;
    }
}

در تفسیر این کلاس می‌توان گفت که ابتدا به ساکن نِیم‌اِسپیس این فایل را مشخص ساخته سپس داخل بدنهٔ کلاس User دو پراپرتی تحت عناوین connection$ و usersTable$ ساخته‌ایم بدین صورت که پراپرتی اول به محض ساخت یک آبجکت از روی این کلاس در داخل کانستراکتور مقداردهی خواهد شد و پراپرتی دوم نیز دارای مقدار پیش‌فرض users است.

بررسی متد ()fetchUserById

همان‌طور که از نام این متد مشخص است، ()fetchUserById این وظیفه را دارد تا بر اساس آی‌دی یا شناسهٔ کاربران، کلیهٔ اطلاعات یک کاربر خاص را از جدول users فراخوانی کند. داخل بدنهٔ این متد ابتدا متغیری تحت عنوان query$ ساخته‌ایم که حاوی کدهای اس‌کیو‌ال است. به محض ساخت یک آبجکت از روی کلاس User، آبجکتی از کلاس Database به پراپرتی connection$ منتسب خواهد شد که پیش از این به معرفی‌اش پرداختیم؛ به عبارت دیگر، این پراپرتی دربرگیرندهٔ کلیهٔ متدهای کلاس PDO خواهد بود.

با در نظر گرفتن توضیحات فوق، متغیر statement$ حاوی متدی تحت عنوان ()prepare است که روی پراپرتی connection$ یا بهتر بگوییم آبجکتی از روی کلاس Database فراخوانی شده و به عنوان پارامتر ورودی این متد نیز متغیر query$ را پاس داده‌ایم و در ادامه متد ()execute را روی متغیر statemet$ فراخوانی کرده‌ایم.

آنچه در ارتباط با این متد حائز اهمیت است اینکه در دستور WHERE مقدار ستون id را برابر با یک ? قرار داده‌ایم و متغیر id$ را نیز به عنوان یکی از اِلِمان‌های یک آرایه به متد ()execute پاس داده‌ایم که در واقع این تضمین ایجاد می‌شود که به نوعی جلوی حملات SQL Injection گرفته شود که در این ارتباط می‌توانید به مقالهٔ‌ ارتباط با دیتابیس در PHP از طریق لایبرری PDO مراجعه نمایید.

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

جمع‌بندی
در این آموزش با نحوهٔ ساخت مُدلی آشنا شدیم که این وظیفه را خواهد داشت تا کلیهٔ تَسک‌های مرتبط با کاربران را هندل کند. در واقع، کارهایی همچون فراخوانی یک کاربر بر اساس شناسه، ثبت کاربر جدید و قابلیت لاگین کردن به سیستم با استفاده از ایمیل و رمزعبور را داخل این مُدل پیاده‌سازی نموده‌ایم به طوری که از این پس به سادگی قادر خواهیم بود تا در کنترلر مربوطه از این مُدل استفاده نماییم که این موضوع را در آموزش بعد مورد بررسی قرار خواهیم داد.


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