افزودن قابلیت ثبت‌نام کاربران در پروژهٔ RESTful API


با توجه به اینکه به هر میزان کامپوننت‌های این پروژه بیشتر از یکدیگر مجزا باشند مدیریت آن‌ها راحت‌تر است، علاوه بر کنترلر پیش‌فرض این فریمورک به نام DefaultController، کنترلر دیگری به نام UserController خواهیم ساخت که این وظیفه را دارد تا ارتباط مابین کلاینت و مُدل User را برقرار سازد که در همین راستا داخل پوشهٔ Controllers فایلی تحت عنوان UserController.php ساخته و آن را به صورت زیر تکمیل می‌کنیم:

<?php
namespace Api\Controllers;

class UserController extends \Core\BaseController
{
    public function signup()
    {
        if ($this->requestMethod === 'POST') {
            $this->validateRequest();
            $user = new \Api\Models\User((new \Api\Config\Database())->connect());
            $isAdded = $user->create($this->request['request_params']);
            if ($isAdded) {
                $this->returnResponse(201, 'New user added.');
            } else {
                $this->returnResponse(406, 'This email has already been taken.');
            }
        } else {
            $this->throwError(405, 'Method Not Allowed. The only method that is acceptable is POST.');
        }
    }
}

پس از ثبت نِیم‌اِسپیس، با استفاده از کیورد extends دستور داده‌ایم تا کلاس UserController کلیهٔ خصوصیات خود را از کلاس BaseController به ارث ببرد. سپس داخل این کلاس متدی تحت عنوان ()signup ایجاد کرده‌ایم و همان‌طور که در توضیح کلاس Routing دیدیم، به محض آنکه کاربر یوآر‌ال api/v1/signup را وارد سازد، سیستم بر اساس کنترلر و اَکشن در نظر گرفته شده وارد کلاس UserController شده سپس متد ()signup را فراخوانی می‌کند. در عین حال، به منظور کوتاه‌تر شدن نام کلاس‌های مورد استفاده، می‌توان کلاس فوق را به صورت زیر ریفکتور کرد:

<?php
namespace Api\Controllers;

use Api\Config\Database;
use Api\Models\User;
use Core\BaseController;

class UserController extends BaseController
{
    public function signup()
    {
        if ($this->requestMethod === 'POST') {
            $this->validateRequest();
            $user = new User((new Database())->connect());
            $isAdded = $user->create($this->request['request_params']);
            if ($isAdded) {
                $this->returnResponse(201, 'New user added.');
            } else {
                $this->returnResponse(406, 'This email has already been taken.');
            }
        } else {
            $this->throwError(405, 'Method Not Allowed. The only method that is acceptable is POST.');
        }
    }
}

همان‌طور که می‌بینیم، به جای درج نام کامل کلاس‌ها در حین ساخت آبجکت، ابتدا به ساکن کلاس‌های مذکور را خارج از بدنهٔ کلاس UserController به اصطلاح use کرده‌ایم سپس در حین ساخت یک آبجکت جدید از روی هر کدام از کلاس‌ها، صرفاً نام کلاس را درج کرده‌ایم.

داخل متد ()signup ابتدا با استفاده از یک دستور شرطی چک کرده‌ایم ببینیم که آیا مقدار پراپرتی requestMethod$ که از کلاس BaseController به ارث برده‌ایم برابر با متد POST است یا خیر که اگر این گونه بود، وارد بلوک if می‌شویم و در غیر این صورت وارد else شده و با استفاده از متد موجود در BaseController تحت عنوان ()throwError کد وضعیتی همچون 405 به همراه پیامی واضح و گویا مبنی بر اینکه «تنها متد قابل‌قبول POST است.» در معرض دید کاربر قرار می‌دهیم.

چنانچه فرض کنیم که جواب این شرط true باشد، داخل بلوک if ابتدا متد ()validateRequest را فراخوانی می‌کنیم با این توضیح که این متد وظیفه دارد تا بر اساس پارامترهای ارسالی از طرف کلاینت، پراپرتی موجود در کلاس BaseController تحت عنوان requestParams$ را مقداردهی کند.

سپس یک آبجکت جدید از روی کلاس User ساخته و آن را داخل متغیری تحت عنوان user$ ذخیره کرده‌ایم و همان‌طور که در حین ساخت کلاس User دیدیم، کانستراکتور این کلاس نیاز به آبجکتی از روی کلاس Database خواهد داشت که برای همین منظور، به عنوان پارامتر ورودی کلاس User آبجکتی از روی کلاس Database ساخته و متد ()connect آن را فراخوانی کرده‌ایم به طوری که از این پس کلاس User به منظور انجام عملیات CRUD، از یک کانکشن کارا با دیتابیس برخوردار است.

با فراخوانی متد ()create روی آبجکت user$ و پاس دادن ['this->request['request_params$ به آن، نتیجهٔ ثبت یک کاربر جدید در متغیری تحت عنوان isAdded$ ذخیره می‌گردد و در ادامه با استفاده از یک دستور شرطی چک کرده‌ایم ببینیم که آیا مقدار این متغیر برابر با true می‌باشد یا خیر که اگر این گونه بود وارد بلوک if شده و رسپانس 201 مبنی بر ساخت یک ریسورس جدید + پیامی مرتبط را ریترن می‌کنیم و در غیر این صورت نیز وارد بلوک else شده و کد وضعیت 406 مبنی بر عملی نشدن درخواست کلاینت را بازمی‌گردانیم.

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

جمع‌بندی
پس از ساخت UserController، در این آموزش اقدام به پیاده‌سازی اَکشنی تحت عنوان ()signup نمودیم که پس از مراجعه به

اِندپوینت api/v1/signup فراخوانی خواهد شد. همچنین دیدیم که به چه شکل می‌توان اطمینان حاصل کرد که کلاینت حداقل فیلدهای ضروری برای عملی کردن پروسهٔ ثبت‌نام را در درخواست خود بگنجاند. در ادامهٔ تکمیل این کنترلر، در آموزش بعد قصد داریم ببینیم که به چه شکل می‌توان کاربر را به سیستم لاگین کرده و یک JWT برای آن ساخت.


لیست نظرات
کاربر میهمان
دیدگاه شما چیست؟
کاربر میهمان
javad1994ma
javad1994ma
۱۳۹۸/۰۲/۲۹
و خواهش دیگه ای که دارم سورس پروژه رو تا اون قسمت در اختیارمون بذارین.یا میتونین اینجا بذارین یا تو
گیتهاب پوش کنین.تا ما از اون استفاده کنیم
javad1994ma
javad1994ma
۱۳۹۸/۰۲/۲۹
من الان این ادرس رو تو postman میزنم هیچی نشون نمیده .باید چجوری داخل index.php بگیم بره سمت api
javad1994ma
javad1994ma
۱۳۹۸/۰۲/۲۹
تو index.php چی باید بنویسیم