Redirect فایل‌ها و آماده‌سازی Core

Redirect Files and Prepare Core

25 بهمن 1399
پروژه ساخت شبکه ی اجتماعی: redirect فایل ها و آماده سازی Core

redirect شدن همه فایل ها به index.php

در حال حاضر اگر در مرورگر خود آدرس صفحات دیگر را تایپ کنیم (مثلا آدرس localhost/traversymvc/public/test) به صفحه ای با خطای Object not found برخورد می کنیم. ما نمی خواهیم این مورد اتفاق بیفتد. بنابراین یک فایل htaccess. دیگر در پوشه public ایجاد کرده و کد زیر را در آن کپی می کنیم:

<IfModule mod_rewrite.c>
  Options -Multiviews
  RewriteEngine On
  RewriteBase /traversymvc/public
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule  ^(.+)$ index.php?url=$1 [QSA,L]
</IfModule>

خط اول این کد (ifModule) به دنبال ماژولی در php به نام mod_rewrite می گردد که معمولا به طور پیش فرض فعال است. خط RewriteEngine نیز موتور بازنویسی را روشن می کند. دستور RewriteBase نیز root پروژه را مشخص می کند (بدون در نظر گرفتن localhost). خط های بعدی این کد می گویند اگر فایلی درخواست داده شد که در پوشه public وجود نداشت، بر اساس قانون RewriteRule کار خواهد کرد؛ ما را به index.php میبرد. اگر فایل درخواست داده شده در پوشه public وجود داشته باشد هم همان فایل را بارگذاری می کند.

از آنجا که فایل index.php نقطه شروع برنامه ما است باید فایل های پوشه app را در آن require کنیم. قبلا گفته بودیم که پوشه app حاوی قسمت front-end ما است و کاربر برای دیدن محتوای سایت به آن نیاز دارد. معمولا دو روش برای require کردن این فایل ها وجود دارد:

  • فایل ها را مستقیما در index.php وارد کنیم. این روش کمی شلوغ و به هم ریخته است.
  • فایل ها را در همان فایل bootstrap.php وارد کرده و سپس bootstrap.php را در index.php وارد کنیم. ما این روش را انتخاب می کنیم.

بنابراین کد زیر را به فایل index.php اضافه می کنیم:

<?php
  require_once '../app/bootstrap.php';

دانلود فایل ها تا این بخش

آماده کردن Core و فایل Bootstrap.php

در حال حاضر اگر به آدرس localhost/traversymvc برویم باز هم لیست دیرکتوری ها را مشاهده می کنیم:

نمایش دیرکتوری traversymvc

این مسئله نه تنها غیرایمن است بلکه اصلا ظاهر زیبایی ندارد. بنابراین با استفاده از یک فایل htaccess. دیگر باید آن را خنثی کنیم. در پوشه traversymvc (در کنار پوشه های app و public) یک فایل htaccess. بسازید و کد زیر را در آن کپی کنید:

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteRule ^$ public/ [L]
  RewriteRule (.*) public/$1 [L]
</IfModule>

الان اگر به آدرس localhost/traversymvc برویم مستقیما به index.php منتقل خواهیم شد.

حالا به پوشه libraries بروید. روشی که ما برای استفاده از برنامه به کار گرفته ایم نیازمند این است که تمامی فایل هایی که کلاس هستند با حروف بزرگ آغاز شوند بنابراین controller به Controller و فایل های Core و Database نیز به همین ترتیب خواهند بود.

حالا در فایل bootstrap باید کتابخانه ها را require کنیم:

<?php
  // Load Libraries
  require_once 'libraries/core.php';
  require_once 'libraries/controller.php';
  require_once 'libraries/database.php';

فایل core یک کلاس php است و کار های زیر را انجام می دهد:

  • URL ها را می سازد.
  • Controller اصلی را load می کند.
  • دارای فرمت controller/method/params/ است.

برای شروع کلاسی به نام Core ایجاد می کنیم. ابتدا خصوصیتی به نام currentController را می نویسیم:

class Core {
    protected $currentController = 'Pages';

این controller پیش فرض ما است. اگر هیچ controller دیگری نباشد ما از کنترلر pages استفاده خواهیم کرد. کنترلرهای بعدی ما currentMethod و params هستند:

class Core {
    protected $currentController = 'Pages';
    protected $currentMethod = 'index';
    protected $params = [];

از بین اینها currentController و currentMethod با تغییر URL، تغییر می کنند بنابراین به متدی نیاز داریم که URL را دریافت کند. بنابراین می گوییم:

public function getUrl(){
      echo $_GET['url'];   
    }

فعلا آن را echo کرده ایم اما بعدا با آن کار داریم. حالا اگر یک constructor نیز بسازیم کد ما به شکل زیر در می آید:

class Core {
    protected $currentController = 'Pages';
    protected $currentMethod = 'index';
    protected $params = [];

    public function __construct(){
      $this->getUrl();
    }

    public function getUrl(){
      echo $_GET['url'];   
    }
  }

اگر با این کد در مرورگر آدرسی به همراه پارامتر url تایپ کنید (مثلا localhost/traversymvc/index.php?url=test) اتفاقی نمی افتد چرا که هنوز هیچ نمونه ای از کلاس Core نساخته ایم و تا زمانی که نمونه ای ساخته نشود نیز constructor اجرا نمی شود و تبعا getUrl نیز اجرا نخواهد شد. برای ساخت این شیء به فایل index.php در پوشه public می رویم و کدهای زیر را در آن می نویسیم:

// Init Core Library
  $init = new Core;

حالا اگر به آدرس localhost/traversymvc/index.php?url=test بروید کلمه test برایتان به نمایش در می آید چرا که پارامتر ارسالی به url بود.

نکته: شما باید کار با سوپر گلوبال های GET و POST و ارسال پارامترها را بلد باشید. این موارد از مسائل پایه ای PHP است و ما در این دوره آن ها را آموزش نمی دهیم. در صورت نیاز به سری آموزشی برنامه نویسی PHP مراجعه کنید.

نکته جالب اینجاست که اگر یادتان باشد در فایل htaccess. بالا خطی به شکل زیر داشتیم:

RewriteRule  ^(.+)$ index.php?url=$1 [QSA,L]

این خط کاری می کند که نیازی به نوشتن پارامترها به صورت url=test? نداشته باشیم. به طور مثال اگر در مرورگر خود به جای آدرس localhost/traversymvc/index.php?url=test به آدرس آدرس localhost/traversymvc/test بروید همان نتیجه را مشاهده می کنید!

بنابراین می توانیم بگوییم localhost/traversymvc/posts/add/1 و عبارت posts/add/1 به ما برگردانده می شود. در قسمت بعد می خواهیم posts/add/1 را از هم جدا کنیم و با استفاده از آن ها کنترلر را تنظیم کنیم.

دانلود فایل ها تا این بخش

امیدوارم از این قسمت لذت برده باشید.

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

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

اردلان تقی زاده
18 اردیبهشت 1399
با سلام زمانی که شروع به نوشتن کد فایل Core.php می کنید تک پی.اچ.پی را باز نکردید(یعنی کد زیر). البته در بقیه ی فایل ها در این صفحه تگ پی.اچ.پی را باز کرده اید ولی در این مورد این کار انجام نگرفته که این هنگام اجرا مشکل ایجاد می کند. class Core { protected $currentController = 'Pages';

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