کلاس controller اصلی

Main Controller Class

25 بهمن 1399
پروژه ساخت شبکه ی اجتماعی: کلاس controller اصلی

تا این قسمت از دوره آموزش ساخت شبکه اجتماعی، سخت ترین کار (مپ کردن URL و کنترلرها و...) را انجام داده ایم. برای این قسمت به سراغ کدنویسی فایل Controller.php در پوشه libraries می رویم که کنترلر اصلی ما است. از این به بعد هر کنترلری که ایجاد کنیم (حتی قبلی ها مانند Pages.php) این کنترلر را extend می کند چرا که controller.php کنترلر پایه و همان کنترلری است که model و view را بارگذاری می کند.

با نوشتن کلاس controller شروع می کنیم:

class Controller {
    // Load model
    public function model($model){
      // Require model file
      require_once '../app/models/' . $model . '.php';

      // Instatiate model
      return new $model();
    }

در این کد ابتدا تابعی به نام model تعریف کرده ایم تا model مورد نظر ما را بارگذاری کند (مثلا درخواستی برای دریافت post ها ارائه شده است و ما باید model مربوط به پست ها را بارگذاری کنیم). برای انجام این کار باید ابتدا فایلِ آن model را از پوشه models بگیرد. بنابراین آن را require کرده ایم. توجه داشته باشید که این پوشه فعلا خالی است تا بعدا آن را کدنویسی کنیم. در آخر نیز از آن یک نمونه (شیء) می سازیم.

حالا باید view خود را بارگذاری کنیم. بنابراین یک تابع به نام view نیز می نویسیم:

// Load view
    public function view($view, $data = []){
      // Check for view file
      if(file_exists('../app/views/' . $view . '.php')){
        require_once '../app/views/' . $view . '.php';
      } else {
        // View does not exist
        die('View does not exist');
      }
    }

این تابع 2 پارامتر می گیرد؛ پارامتر اول view$ است که همان فایل view ما درون پوشه views خواهد بود. پارامتر دوم نیز data$ است؛ این پارامتر همان داده هایی است که قرار است در آینده به view پاس داده شوند (حالا چه از طریق دیتابیس باشند، چه کدهای نوشته شده به صورت دستی و ...) چرا که ما نیاز داریم به view خود داده هایی ارسال کنیم. از آنجا که ممکن است چندین داده را با هم ارسال کنیم نوع این پارامتر را آرایه تعیین کرده و مقدار پیش فرض آن را یک آرایه خالی قرار داده ایم.

سپس با یک جمله شرطی if چک کرده ایم تا ببینیم آیا فایلِ View درخواستی ما موجود است یا خیر. اگر موجود بود باید آن را require کنیم و اگر موجود نبود با دستور die اجرای برنامه را قطع می کنیم.

نکته: اگر یادتان باشد این کلاس توسط فایل bootstrap.php بارگذاری می شود (آن را در bootstrap.php یک بار require کردیم).

حالا باید به Pages.php یا هر کنترلر دیگری که می سازیم برویم و کلاس آن را extend کنیم. برای Pages.php کد به صورت زیر در می آید:

<?php
  class Pages extends Controller {
    public function __construct(){

    }

    public function index(){
      
    }

    public function about($id){
      echo $id;
    }
  }

حالا بیایید این کد را تست کنیم. برای تست کردن آن تابع index در کد بالا را موقتا به شکل زیر بنویسید:

public function index(){
      $this->view('hello');
    }

به نظر شما با رفتن به آدرس localhost/traversymvc چه پیامی به ما نمایش داده می شود؟ بله! View does not exist به ما نشان داده می شود (این همان پیامی است که به die داده بودیم) چرا که هنوز هیچ فایلی در پوشه Views به نام view.php وجود ندارد.

نکته: برای استفاده از توابع view و model حتما باید کلاس مورد نظر شما، کلاس اصلی Controller را extend کند.

حالا برای اینکه پوشه view خالی نماند باید فایلی به نام index.php در آن بسازیم. داخل آن (بدون هیچ تگ و علامتی) عبارت HOMEPAGE را بنویسید تا آن را تست کنیم. سپس به Pages.php بروید و کدهای تابع index را به شکل زیر ویرایش کنید:

   public function index(){
		
		$this->view('index');
    }

همچنین پارامتر id$ از تابع about را نیز حذف کنید چرا که نیازی به آن نداریم. بنابراین کدهای فایل pages بدین صورت خواهند بود:

<?php
  class Pages extends Controller {
    public function __construct(){

    }

       public function index(){
		
		$this->view('index');
    }

    public function about(){
    }
  }

حالا اگر به آدرس localhost/traversymvc برویم عبارت HOMEPAGE را مشاهده خواهیم کرد. همچنین اگر همین کد را برای تابع about نیز بنویسیم:

    public function about(){
		$this->view('index');
    }
  }

و به آدرس localhost/traversymvc/pages/about برویم باید عبارت HOMEPAGE را مشاهده کنیم اما ما می خواهیم کدهای خودمان را بنویسیم. یکی از روش های خوب این است که در پوشه view برای هر controller یک پوشه جداگانه بسازیم بنابراین درون پوشه views یک پوشه به نام pages بسازید و فایل index.php را که خارج از آن است به درون آن منتقل کنید. حالا برای بارگذاری فایل index.php باید تابع index در کلاس Pages را تغییر دهیم چرا که مکانش را تغییر داده ایم:

$this->view('pages/index');

حالا یک فایل دیگر به نام about.php در کنار فایل index.php (درون پوشه views->pages) بسازید و درون آن عبارت ABOUT را بنویسید.

طبیعتا باید کدهای کلاس pages را نیز تغییر دهیم:

$this->view('pages/index');

یعنی قبل از index باید /pages را اضافه کنیم. فایلتان را ذخیره کرده و به آدرس localhost/traversymvc/pages/about بروید. حالا باید پیام ABOUT را ببینیم.

حتی می توانیم پیشرفته تر عمل کنیم. به فایل Pages.php بروید و کد تابع index را بدین شکل تغییر دهید:

public function index(){
      $data = [
        'title' => 'Welcome'
      ];

      $this->view('pages/index', $data);
    }

در این کد یک آرایه به نام data$ تعریف کرده ایم و در قسمت تابع view پارامتر data$ را نیز اضافه کرده ایم. حالا به آدرس view->pages رفته و فایل index.php را باز می کنیم. عبارت HOMEPAGE را پاک کرده و به جای آن کد زیر را بنویسید:

<h1><?php echo $data['title']; ?></h1>

متوجه شدید چه کار کردیم؟ ما از فایل Pages.php تابع view را اجرا کرده و به آن یک آرایه متناظر دادیم (به عنوان پارامتر). سپس از فایل index.php و بر اساس index آرایه به مقدار آن دسترسی پیدا کرده و آن را داخل یک تگ h1 قرار دادیم. اگر الان به آدرس localhost/traversymvc برویم، پیام Welcome را به صورت یک تگ h1 مشاهده خواهیم کرد.

در آینده زمانی که پست ها را در پایگاه داده قرار دادیم می توانیم آن را از پایگاه داده بگیریم، داخل یک متغیر قرار دهیم و در آخر دقیقا مانند همینجا آن ها را به view بدهیم تا برایمان به نمایش در بیاورد.

تا این قسمت برنامه ما از نظر فنی بی نقص است اما هنوز مشکل دارد. با طرحی که ما ریخته ایم باید هر صفحه دارای DOCTYPE و تگ های head و غیره باشد که اصلا کار خوبی نیست. اینطور کدنویسی فقط باعث بالاتر رفتن حجم کدها می شود بنابراین برای حل این مشکل در جلسات بعدی می خواهیم پوشه ای به نام includes داشته باشیم که شامل header و footer سایت ما باشد. سپس آن ها را در view های خودمان require می کنیم تا کدهای تکراری نداشته باشیم.

دانلود فایل پروژه تا این جلسه

تمام فصل‌های سری ترتیبی که روکسو برای مطالعه‌ی دروس سری آموزش ساخت شبکه اجتماعی توصیه می‌کند:
نویسنده شوید
دیدگاه‌های شما (1 دیدگاه)

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

اشکان
11 مرداد 1399
استاد زوارمی ایکاش شما هم همانند استاد جهانگیر پچکم این مقالتون رو رایگان در اختیار مون میزاشتید قطعا مقالات شما ارزش خوندن داره ولی واقعا من به امید این مقالتون مقالات دیگه roxo رو در زمینه php خوندم که بیام در اخر این مقالتون رو بخونم ولی متاسفانه پولی گزاشتید !

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

روکسو
11 مرداد 1399
با سلام و سپاس از شما همراه عزیز روکسو کارشناسان در آکادمی آنلاین روکسو تعیین می‌کنند که برخی از مقالات در بخش مطالب جادویی قرار بگیرند.

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.