رتبه موضوع:
  • 1 رای - 5 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
آموزش کدایگنایتر CodeIgniter
#16
مدل‌ها
Model ها درصورت تمایل میتونن برای کسانی که دوست دارن از ساختار سنتی MVC پیروی کنن، قابل استفاده هستن.

مدل چیه؟
مدل‌ها کلاس‌های PHP هستن که برای کار با اطلاعات در پایگاه داده‌های شما طراحی میشن. برای مثال فرض کنین از کداینگایتر برای مدیریت به وبلاگ استفاده میکنین. ممکنه بخواین یه کلاس مدل داشته باشین که شامل توابعی برای درج، بروزرسانی و استخراج مطالب وبلاگ شما باشه. در اینجا مثالی از چنین کلاس مدلی رو مشاهده میکنین:
<?php

class Blog_model extends CI_Model
{
   public $title;
   public $content;
   public $date;

   public function __construct()
   {
       // Call the CI_Model constructor
       parent::__construct();
   }

   public function get_last_ten_entries()
   {
       $query = $this->db->get('entries', 10);
       return $query->result();
   }

   public function insert_entry()
   {
       $this->title = $_POST['title']; // Please read the below note
       $this->content = $_POST['content'];
       $this->date = time();
       $this->db->insert('entries', $this);
   }

   public function update_entry()
   {
       $this->title = $_POST['title'];
       $this->content = $_POST['content'];
       $this->date = time();
       $this->db->update('entries', $this, array('id' => $_POST['id']));
   }
}

نقل قول:نکته: متدهای مثال بالا از متدهای موجود در کلاس کوئری‌ساز دیتابیس استفاده میکنن. به‌منظور سادگی، در این مثال ما مستقیماً از آرایه‌ی $_POST استفاده کردیم. این موضوع کلاً خوب نیست و روش رایج‌تری که باید بکار بره، استفاده از کتابخانه‌ی ورودی هست: $this->input->post('title')

ساختار داخلی یک مدل
کلاس‌های مدل در مسیر application/models ذخیره میشن و میتونن داخل پوشه‌های فرعی هم درصورت نیاز به نظم بیشتر قرار داده بشن. الگوی اولیه‌ی یه کلاس مدل اینطوریه:
class Model_name extends CI_Model
{

   public function __construct()
   {
       parent::__construct();
   }
}

که باید بجای Model_name اسم کلاستون رو باید بنویسید. اسم کلاس باید با حرف اول بزرگ نوشته بشه و بقیه‌ی حروف کوچک هستن. مطمئن بشین که کلاستون از کلاس پایه‌ی CI_Model مشتق میشه. اسم فایل باید با اسم کلاس یکی باشه. برای مثال اگه کلاس شما دارای چنین محتوایی باشه:
class User_model extends CI_Model
{

   public function __construct()
   {
       parent::__construct();
   }
}

باید فایلش در مسیر application/model/User_model.php ذخیره بشه.

بارگذاری یک مدل
مدل‌های شما معمولاً توسط متدهای داخل کنترلر بارگذاری و فراخوانی میشن. برای بارگذاری یه مدل، از این دستور استفاده میکنیم:
$this->load->model('model_name');

اگه مدل شما توی یه پوشه‌ی فرعی باشه، باید اسم مسیر نسبی اون رو هم اعلام کنین. برای مثال اگه مدل شما در مسیر application/models/blog/Queries.php باشه، با این دستور اون رو بارگذاری میکنین:
$this->load->model('blog/queries');

وقتی که مدل بارگذاری شد، ازطریق یه شئ همنام با اسم کلاستون میتونین بهش دسترسی داشته باشین. برای مثال:
$this->load->model('model_name');
$this->model_name->method();

اگه میخواین مدلتون به یه شئ با اسم دیگه نسبت داده بشه، میتونین از پارامتر دوم متد بارگذاری استفاده کنین:
$this->load->model('model_name', 'foobar');
$this->foobar->method();

در اینجا یه مثال از یه کنترلر رو میبینید که یه مدل رو بارگذاری میکنه و بعد هم از یه ویو استفاده میکنه:
class Blog extends CI_Controller
{

   public function index()
   {
       $this->load->model('blog_model');
       $data['query'] = $this->blog->get_last_ten_entries();
       $this->load->view('blog', $data);
   }
}

بارگذاری خودکار مدل‌ها
اگه احساس میکنین نیاز به این دارین که یه مدل خاص توی کل برنامه شما موجود باشه، میتونین از CodeIgniter بخواین که اون رو درزمان آماده‌سازی اولیه سیستم بطور خودکار بارگذاری کنه. این‌کار با ویرایش فایل application/config/autoload.php و اضافه‌کردن مدل به آرایه‌ی $autoload['model'] انجام میشه.

اتصال به دیتابیس
وقتی که یه مدل بارگذاری میشه، بطور خودکار به دیتابیس متصل نمیشه. گزینه‌های زیر برای اتصال به دیتابیس در دسترس شما هستن:
  • میتونین با کمک متدهای استاندارد دیتابیس که اینجا توضیح داده شده، به دیتابیس وصل بشین (چه داخل کنترلر و چه داخل کلاس مدل)
  • میتونین به متد بارگذاری مدل بگین که بطور خودکار وصل بشه. این‌کار با کمک پارامتر اختیاری سوم و مقدار TRUE انجام میشه. تنظیمات اتصال به دیتابیس توی فایل config/database.php تعریف شده و از همونجا میتونین ویرایش کنین
    $this->load->model('model_name', '', TRUE);
  • میتونین بصورت دستی تنظیمات اتصال رو ازطریق پارامتر سوم بصورت آرایه ارسال کنین:
    $config = array(
        'hostname' => 'localhost',
        'username' => 'myusername',
        'password' => 'mypassword',
        'database' => 'mydatabase',
        'dbdriver' => 'mysqli',
        'dbprefix' => '',
        'pconnect' => FALSE,
        'db_debug' => TRUE,
    );
    $this->load->model('model_name', '', $config);
تشکر شده توسط:
#17
توابع کمکی
این توابع همونطور که اسمشون نشون میده، به شما کمک میکنن کارهایی که میخواین رو انجام بدین. هر فایل Helper به‌سادگی مجموعه‌ای از توابع هست که در یک دسته‌بندی خاص قرار میگیرن. برای مثال توابع کمکی URL وجود داره که به شما در ساختن لینک‌ها کمک میکنه، یا توابع کمکی فرم که به شما توی ایجاد عناصر فرم کمک میکنه، و یا توابع کمکی متن که برای انجام عملیات قالب‌بندی مختلف روی متن مفیده، یا توابع کمکی Cookie که برای نوشتن و خوندن کوکی کاربرد داره، یا حتی توابع کمکی فایل که به شما در کار با فایل‌ها کمک میکنه و...

برخلاف اغلب سیستم‌های دیگه در کدایگنایتر، Helper ها بصورت شئ‌گرا نوشته نشدن، بلکه توابع ساده و رویه‌گرا هستن. هر تابع کمکی یه عمل مشخص انجام میده و هیچ وابستگی به توابع دیگه نداره.

CodeIgniter بطور پیشفرض فایل‌های توابع کمکی رو بصورت خودکار بارگذاری نمیکنه. بنابراین اولین قدم در استفاده از یه Helper بارگذاری اونه. وقتی که بارگذاری شد، بصورت سراسری توی کنترلر و ویوها قابل استفاده میشه.

توابع کمکی معمولاً در مسیر system/helpers یا application/helpers ذخیره میشن. کدایگنایتر اول به پوشه application/helpers نگاه میکنه. اگه این پوشه وجود نداشته باشه یا فایل کمکی داخلش قرار نداشته باشه، CI دنبال فایل کمکی توی پوشه‌ی سراسری system/helpers میگرده.

بارگذاری یه فایل کمکی
بارگذاری یه فایل Helper با کمک متد زیر خیلی ساده است:
$this->load->helper('name');

که در اینجا name اسم فایل کمکی موردنظره که البته پسوند _helper.php رو نمینویسیم. برای مثال، اگه بخوایم فایل کمکی URL رو بارگذاری کنیم که اسمش url_helper.php هست، اینطوری مینویسیم:
$this->load->helper('url');

یه فایل کمکی میتونه هرجایی داخل متدهای کنترلر بارگذاری بشه (یا حتی داخل فایل‌های ویوی شما، هرچند این‌کار روش خوبی نیست). تنها قانونی که وجود داره اینه که قبل از استفاده ازش، باید بارگذاریش کنین. میتونین توابع کمکی خودتون رو توی سازنده‌ی کلاس کنترلر خودتون بارگذاری کنین و با این‌کار، بصورت خودکار توی تمام متدها قابل‌استفاده میشن. همچنین میتونین یه فایل کمکی رو فقط توی یه متد خاص که بهش احتیاج داره بارگذاری کنین.

نقل قول:نکته: بارگذاری فایل‌های کمکی، هیچ مقداری برنمیگردونه. بنابراین سعی نکنید خروجی اون رو توی متغیری ذخیره کنین. فقط به همین‌شکل که مثال زدیم ازش استفاده کنین.

بارگذاری چند فایل کمکی بصورت همزمان
اگه میخواین چند فایل کمکی رو بطور یکجا بارگذاری کنین، میتونین اونها رو توی یه آرایه مشخص کنین. مثل این کد:
$this->load->helper(array('helper1', 'helper2', 'helper3'));

بارگذاری خودکار فایل‌های کمکی
اگه احساس میکنین نیاز دارین یه فایل کمکی خاص توی کل برنامه قابل‌استفاده باشه، میتونین به CodeIgniter بگین که اون رو بصورت خودکار درحین آماده‌سازی اولیه‌ی سیستم، بارگذاری کنه. این‌کار با ویرایش فایل تنظیمات application/config/autoload.php و اضافه‌کردن اسم فایل کمکی به آرایه‌ی $autoload['helper'] انجام میشه.

استفاده از یه فایل کمکی
وقتی که یه فایل Helper رو که حاوی تابع موردنیاز شماست، بارگذاری کردین، مثل توابع استاندارد و عادی PHP میتونین توابع داخلش رو صدا بزنین. برای مثال اگه میخواین یه لینک با کمک متد anchor() توی یکی از ویوهای خودتون بسازین، میتونین اینطوری بنویسین:
<?php echo anchor('blog/comments', 'Click Here'); ?>

که در اینجا Click Here اسم لینک و blog/comments آدرس URI موردنظر برای دسترسی به controller/method دلخواه شماست.

توسعه‌ی Helper ها
برای گسترش یه فایل کمکی، یه فایل توی پوشه‌ی application/helpers با همون اسم فایل کمکی اصلی بسازین ولی قبل از اسمش یه پیشوند MY_ بهش بدین (این مورد قابل تنظیمه. یکم پایینتر رو ببینید).

اگه کاری که میخواین انجام بدین، اضافه‌کردن برخی قابلیت‌ها به فایل کمکی موجود هست - شاید اضافه‌کردن یک یا دو تابع یا ویرایش نحوه‌ی کار یه تابع خاص - دراینصورت بهتره که بجای ویرایش فایل کمکی موجود، اون رو گسترش بدین.

نقل قول:نکته: اصطلاح «گسترش‌دادن» خیلی سطحی استفاده‌شده چون توابع کمکی بصورت رویه‌گرا هستن و درنتیجه نمیشه اونها رو گسترش‌داد چون اصطلاح گسترش‌دادن یا Extend مختص کلاس‌ها و وراثت هست؛ ولی در پشت‌پرده، این قابلیت به شما اجازه میده که توابعی رو به یه فایل کمکی اضافه‌کنید یا توابعش رو با توابع خودتون جایگزین کنین.

برای مثال، اگه میخواین فایل کمکی آرایه‌ها رو ویرایش کنین، باید یه فایل به‌اسم application/helpers/MY_array_helper.php بسازین و توابع خودتون رو اضافه‌کنین یا توابع موجود رو رونویسی کنین:
// any_in_array() is not in the Array Helper, so it defines a new function
function any_in_array($needle, $haystack)
{
   $needle = is_array($needle) ? $needle : array($needle);
   foreach ($needle as $item) {
       if (in_array($item, $haystack)) {
           return TRUE;
       }
   }
   return FALSE;
}

// random_elements() is included in Array Helper, so it overrides the native function
function random_element($array)
{
   shuffle($array);
   return array_pop($array);
}

تنظیم پیشوند دلخواه شما
پیشوند اسم فایل برای گسترش توابع کمکی، مشابه همون پیشوندی هست که برای توسعه‌ی کتابخانه‌ها و کلاس‌های هسته‌ی فریمورک بکار رفته. برای تنظیم پیشوند دلخواه خودتون، فایل application/config/config.php رو باز کنین و دنبال این آیتم بگردین:
$config['subclass_prefix'] = 'MY_';

دقت‌کنید که تمام کتابخانه‌های بومی کدایگنایتر با پیشوند CI_ مشخص‌شدن. بنابراین از این پیشوند استفاده نکنید.

حالا چکار کنید؟
توی فهرست مطالب، لیست تمام فایل‌های کمکی موجود رو میتونین پیدا کنین. روی هرکدوم کلیک کنین تا ببینید چه‌کاری انجام میدن.
تشکر شده توسط:
#18
استفاده از کتابخانه‌های کدایگنایتر
تمام کتابخانه‌های قابل‌استفاده، در مسیر system/libraries قرار گرفتن. در اغلب موارد، برای کار با یکی‌از این کلاس‌ها، باید اون رو داخل یه کنترلر با استفاده از متد زیر، آماده‌سازی کنین:
$this->load->library('class_name');

که class_name اسم کلاسی هست که میخواین ازش استفاده کنین. برای مثال، اگه میخواین کتابخانه‌ی اعتبارسنجی فرم رو بارگذاری کنین، باید اینکار رو انجام بدین:
$this->load->library('form_validation');

به‌محض اینکه یه کتابخانه آماده شد، میتونین از اون به‌شکلی که توی راهنمای استفاده از کلاسش اعلام شده، استفاده کنید. بعلاوه میشه چند کتابخانه رو بصورت همزمان با ارسال یه آرایه برای متد بارگذاری، آماده‌سازی کرد:
$this->load->library(array('email', 'table'));
تشکر شده توسط:
#19
ساخت کتابخانه‌ی جدید
وقتی از اصطلاح «کتابخانه» استفاده میکنیم، معمولاً به کلاس‌هایی اشاره میکنیم که توی پوشه‌ی libraries قرار دارن و در قسمت مرجع کلاس‌های این آموزش درموردشون توضیح میدیم. البته در اینجا، بجای توضیح درمورد کار با کتابخانه‌های موجود، میخوایم بهتون یاد بدیم که چطور کتابخانه‌های دلخواه خودتون رو در مسیر application/libraries بسازین تا یه جداسازی مناسب بین منابع محلی شما و منابع سراسری فریمورک وجود داشته باشه.

بعنوان یک هدیه، CodeIgniter به کتابخانه‌های شما اجازه میده که کلاس‌های بومی خودش رو گسترش بدن (اگه فقط نیاز به اضافه‌کردن یکسری قابلیت به یه کتابخانه‌ی موجود دارین). حتی میتونین با استفاده‌از اسامی دقیقاً مشابه کلاس‌های اصلی، اونها رو با نسخه‌ی موجود در مسیر application/libraries جایگزین کنید.

بطور خلاصه:
  • میتونین کتابخانه‌های کاملاً جدید بسازین
  • میتونین کتابخانه‌های موجود رو گسترش بدین
  • میتونین کتابخانه‌های موجود رو با نسخه‌ی خودتون جایگزین کنین
در اینجا نحوه‌ی هرکدوم از این سه مفهوم رو با جزئیات توضیح میدیم.

نقل قول:نکته: کلاس‌های کار با پایگاه داده‌ها رو نمیشه توسعه‌داد یا با کلاس‌های شخصی خودتون جایگزین کرد. تمام کلاس‌های دیگه قابل توسعه/جایگزینی هستن.

ذخیره‌سازی
کلاس‌های کتابخانه‌ی شما باید در مسیر application/libraries قرار بگیرن چون اینجا جایی هست که کدایگنایتر در زمان بارگذاری، دنبالشون میگرده.

مفاهیم نام‌گذاری
  • اسامی فایل‌ها باید با حروف بزرگ شروع بشن. برای مثال: Myclass.php
  • تعریف کلاس‌ها هم باید با حروف بزرگ شروع بشه. برای مثال: class MyClass
  • اسامی کلاس‌ها و اسم فایل‌ها باید با هم مطابقت داشته باشن
فایل کلاس
کلاس‌ها باید از این الگوی اولیه پیروی کنن:
<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class Someclass
{

   public function some_method()
   {
   }
}

نقل قول:نکته: ما از اسم Someclass فقط بعنوان مثال استفاده کردیم.

استفاده از کلاس شما
داخل هرکدوم از متدهای کنترلر میتونین کلاس خودتون رو با استاندارد زیر بارگذاری کنین:
$this->load->library('someclass');

که در اینجا someclass اسم فایل بدون پسوند .php هست. میتونین اسم فایل رو با حروف بزرگ یا کوچک بنویسید. CodeIgniter اهمیتی نمیده.

وقتی کلاس شما بارگذاری شد، میتونین به کلاستون با نسخه‌ی حروف کوچک دسترسی پیدا کنید:
$this->someclass->some_method(); // Object instance will always be lower case

ارسال پارامتر در زمان بارگذاری کلاس
میتونین بصورت پویا یکسری اطلاعات رو بصورت آرایه توسط متد بارگذاری، برای سازنده‌ی کلاستون ارسال کنید:
$params = array('type' => 'large', 'color' => 'red');
$this->load->library('someclass', $params);

و اگه بخواین از این قابلیت استفاده کنین، باید سازنده‌ی کلاستون رو این‌شکلی بنویسید:
public function __construct($params)
{
   // Do something with $params
}

همچنین میتونین پارامترهای ذخیره‌شده توی یه فایل تنظیمات رو ارسال کنید. کافیه یه فایل تنظیمات همنام با کلاستون بسازین و اون رو در مسیر application/config ذخیره کنید. دقت‌کنید که اگه بصورت پویا پارامترها رو به‌شکلی که الآن توضیح دادیم بفرستین، فایل تنظیمات قابل استفاده نخواهد بود.

استفاده از منابع کدایگنایتر در داخل کتابخانه‌ی شما
برای دسترسی به منابع بومی CodeIgniter در داخل کتابخانه‌ی خودتون، از متد get_intance() استفاده کنید. این متد، شئ والد کداینگایتر رو برمیگردونه. معمولاً توی متدهای کنترلر خودتون، هرکدوم از متدهای موجود در کدایگنایتر رو با کمک $this صدا میزنین:
$this->load->helper('url');
$this->load->library('session');
$this->config->item('base_url');
// etc.

هرچند $this فقط داخل کنترلرها، مدل‌ها یا ویوها قابل استفاده است. اگه بخواین از کلاس‌های CodeIgniter داخل کلاس‌های شخصی خودتون استفاده کنین، میتونین بصورت زیر کار کنید. ابتدا شئ کدایگنایتر رو داخل یه متغیر ذخیره کنین:
$CI =& get_instance();

وقتی که اینکار رو انجام دادین، میتونین از اون متغیر بجای $this استفاده کنید:
$CI->load->helper('url');
$CI->load->library('session');
$CI->load->config->item('base_url');
// etc.

نقل قول:نکته: احتمالاً متوجه شدین که متد get_instance() رو بصورت ارجاعی استفاده کردیم. این خیلی اهمیت داره. قراردادن یه ارجاع به شما کمک میکنه که از شئ اصلی CodeIgniter بجای یه کپی از اون، استفاده کنید.

از اونجا که کتابخانه، یه کلاس هست، بهتره که از مزایای کامل برنامه‌نویسی شئ‌گرا بهره‌مند بشین. بنابراین، اگه میخواین از شئ والد کدایگنایتر در تمام متدها استفاده کنید، میتونین از این روش بهره ببرین:
<?php
class Example_library
{

   protected $CI;

   // We'll use a constructor, as you can't directly call a function
   // from a property definition.
   public function __construct()
   {
       // Assign the CodeIgniter super-object
       $this->CI =& get_instance();
   }

   public function foo()
   {
       $this->CI->load->helper('url');
       redirect();
   }

   public function bar()
   {
       echo $this->CI->config->item('base_url');
   }
}

جایگزینی کتابخانه‌های بومی با نسخه‌های شخصی شما
خیلی ساده، با نامگذاری فایل‌های کلاستون همنام با یک کتابخانه‌ی بومی، میتونین کدایگنایتر رو وادار به استفاده از اون به‌جای نسخه‌ی بومی کنید. برای استفاده از این قابلیت، باید دقیقاً از همون نام فایلی که برای کتابخانه‌ای اصلی بکاررفته استفاده کنید. برای مثال، اگه میخواین کتابخانه‌ی ایمیل بومی رو با نسخه‌ی خودتون جایگزین کنین، باید یه فایل به‌نام application/libraries/Email.php بسازین و اسم کلاستون رو هم CI_Email بگذارین:
class CI_Email
{
   // Your code goes here
}

دقت‌کنید که اغلب کلاس‌های بومی با پیشوند CI_ مشخص‌شدن. برای بارگذاری کتابخانه‌ی خودتون، از همون روش استاندارد استفاده کنید:
$this->load->library('email');

نقل قول:نکته: درحال‌حاضر امکان جایگزینی کلاس‌های کار با پایگاه داده‌ها با نسخه‌ی شخصی وجود نداره.

توسعه‌ی کتابخانه‌های موجود
اگه بخواین یکسری قابلیت‌ها به یه کتابخانه‌ای موجود اضافه کنید - شاید اضافه‌کردن یکی دوتا متد - دراینصورت جایگزین‌کردن کل کتابخانه با نسخه‌ی شخصی خودتون اشتباهه. در اینجا بهتره که خیلی ساده، کلاس موجود رو گسترش بدین. توسعه‌ی کلاس موجود، مشابه جایگزینی اونه، منتها با یکسری تفاوت‌های جزئی:
  • تعریف کلاس باید از کلاس والد مشتق بشه
  • کلاس جدید شما و اسم فایلش باید با پیشوند MY_ نامگذاری بشن (این پیشوند قابل سفارشی‌سازیه که در ادامه توضیح میدیم).
برای مثال، اگه میخواین کلاس بومی Email رو توسعه بدین، باید یه فایل به‌اسم application/libraries/MY_Email.php بسازین و کدتون رو به‌این‌شکل بنویسید:
class MY_Email extends CI_Email
{
   // Your code
}

اگه نیاز به استفاده از سازنده‌ی خاصی توی کلاستون دارین، مطمئن بشین که سازنده‌ی والد رو صدا میزنید:
public function __construct($config = array())
{
   parent::__construct($config);
}

نقل قول:نکته: همه‌ی کتابخانه‌ها پارامترهای یکسانی ندارن (یا ممکنه اصلاً پارامتر نداشته باشن). قبل از توسعه‌ی یه کتابخانه، به کدش یه نگاه بندازین تا نحوه‌ی پیاده‌سازی اون رو یاد بگیرین.

بارگذاری کلاس فرعی شما
برای بارگذاری کلاس فرعی که با گسترش کتابخانه‌های بومی ساختین، از همون روش معمولی استفاده میکنیم. پیشوند رو ذکر نکنید. برای مثال اگه بخوایم مثال بالا رو بارگذاری کنیم، اینطوری مینویسیم:
$this->load->library('email');

وقتی که کلاستون بارگذاری شد، مثل سایر کلاس‌های کتابخانه از متدهاش استفاده میکنید:
$this->email->some_method();

تنظیم پیشوند دلخواه شما
برای استفاده از پیشوند اختصاصی خودتون برای کلاس‌های فرعی، فایل تنظیمات application/config/config.php رو باز کنید و دنبال این عبارت بگردین:
$config['subclass_prefix'] = 'MY_';

دقت‌کنید که تمام کتابخانه‌های پیشفرض CodeIgniter از پیشوند CI_ استفاده میکنن. بنابراین از این پیشوند برای کلاس‌های خودتون استفاده نکنید.
تشکر شده توسط:
#20
استفاده از راه‌اندازهای کدایگنایتر
راه‌انداز یا Driver نوع خاصی از کتابخانه‌هاست که یک کلاس والد و احیاناً هر تعداد دلخواه کلاس فرزند داره. کلاس‌های فرزند دسترسی به کلاس والد دارند ولی به سایر فرزندان هم‌نسل خودشون دسترسی نخواهند داشت. درایورها یک الگوی مدرن در کنترلرهای شما برای کتابخانه‌ها تعریف می‌کنن که از مزایای شکستن به چند کلاس مستقل بهره می‌برن.

Driverها در مسیر system/libraries قرار میگیرن و هرکدوم، پوشه‌ی فرعی اختصاصی خودشون رو دارن که همنام با کلاس والد کتابخانه‌ی مربوطه است. ضمناً در داخل اون پوشه، یه پوشه‌ی فرعی دیگه به‌اسم drivers قرار داره که تمام کلاس‌های فرزند احتمالی رو در بر میگیره. برای استفاده از یه درایور، اون رو ازطریق کنترلر با روش زیر راه‌اندازی می‌کنیم:
$this->load->driver('class_name');

که در اینجا class_name اسم کلاس والد درایور موردنظر شما برای فراخوانیه. برای مثال، اگه بخوایم درایوری به‌اسم Some_parent رو صدا بزنیم، باید اینطوری بنویسیم:
$this->load->driver('some_parent');

متدهای این کلاس رو بعداً میشه اینطوری فراخوانی کرد:
$this->some_parent->some_method();

برای دسترسی به کلاس‌های فرزند یک درایور خاص، نیاز به راه‌اندازی مجزای اونها نیست و مستقیماً میشه با کمک کلاس والد اونها رو صدا زد. برای مثال:
$this->some_parent->child_one->some_method();
$this->some_parent->child_two->another_method();
تشکر شده توسط:
#21
ایجاد درایورهای شخصی
ساختار پوشه‌ها و فایل‌های درایور بصورت زیر باید درنظر گرفته بشه:
  • /application/libraries/Driver_name
    • Driver_name.php
    • drivers
      • Driver_name_subclass_1.php
      • Driver_name_subclass_2.php
      • Driver_name_subclass_3.php

نقل قول:نکته: برای حفظ سازگاری با سیستم‌های فایل حساس به بزرگی و کوچکی حروف (مثل لینوکس و مک)، پوشه‌ی Driver_name باید با حرف اول بزرگ نوشته بشه (مطابق با ساختاری که تابع ucfirst() در PHP ارائه میکنه).

نقل قول:مهم: ساختار درایورها به‌نحوی هست که کلاس‌های فرزند، از کلاس والد مشتق نمیشن و درنتیجه خصوصیات و متدهای کلاس والد درایور رو بهشون ارث نمیرسه.
تشکر شده توسط:
#22
ایجاد کلاس‌های هسته‌ی سیستم
هر زمان CodeIgniter اجرا میشه، یکسری کلاسهای پایه وجود دارن که بطور خودکار بعنوان بخشی از هسته‌ی فریمورک بارگذاری میشن. البته این امکان وجود داره که هرکدوم از کلاس‌های هسته‌ی سیستم رو با نسخه‌ی دلخواه خودتون جایگزین کنین یا حتی اون رو توسعه بدین.


نقل قول:اغلب کاربران هرگز نیاز به انجام این کار پیدا نمیکنن، ولی بهرحال قابلیت جایگزینی یا گسترش کلاس‌های هسته‌ی فریمورک برای کسانی که بخوان به‌شکل قابل‌ملاحظه‌ای هسته‌ی کدایگنایتر رو تغییر بدن، وجود داره. درگیرشدن با کلاس‌های هسته‌ی سیستم پیامدهای زیادی داره؛ بنابراین قبل از هر کاری، مطمئن بشین که میدونین دارین چه‌کاری انجام میدین.


فهرست کلاس‌های سیستم
فهرست زیر شامل فایل‌های هسته‌ی سیستم هست که هربار کدایگنایتر اجرا میشه، فراخوانی میشن:
  • Benchmark
  • Config
  • Controller
  • Exceptions
  • Hooks
  • Input
  • Language
  • Loader
  • Log
  • Output
  • Router
  • Security
  • URI
  • Utf8
جایگزینی کلاس‌های هسته
برای اینکه از کلاس‌های خودتون بجای کلاس‌های پیشفرض استفاده کنین، کلاس خودتون رو در مسیر application/core ذخیره کنین:
application/core/some_class.php

اگه این پوشه وجود نداره، باید بسازینش. هر فایلی که همنام با فهرست بالا باشه، بجای نسخه‌ای که معمولاً بکار گرفته میشه، مورد استفاده قرار میگیره. دقت‌کنید که کلاس شما باید از پیشوند CI_ استفاده کنه. برای مثال، اگه فایل شما Input.php هست، باید اسم کلاس رو CI_Input بگذارین:
class CI_Input
{
   // some code
}

گسترش کلاس‌های هسته
اگه تمام کاری که میخواین انجام بدین، اضافه‌کردن یکسری قابلیت به یه کتابخانه‌ی موجود هست (شاید اضافه‌کردن یک یا دو متد) اونوقت جایگزینی کامل اون کتابخانه با نسخه‌ی اختصاصی خودتون کاملاً اشتباهه. در چنین مواردی بهتره که اون کلاس رو توسعه بدین. گسترش یه کلاس مفهومی نزدیک به جایگزینی اون داره منتها با چند استثنا:
  • تعریف کلاس باید از کلاس والد مشتق بشه.
  • کلاس جدید و فایلش باید با پیشوند MY_ نامگذاری بشن (این مورد همونطور که یکم بعدتر میگیم، قابل تنظیمه).
برای مثال، اگه میخواین کلاس Input اصلی فریمورک رو توسعه بدین، باید یه فایل به اسم application/core/MY_Input.php بسازین و کلاستون رو اینطوری داخلش تعریف کنین:
class MY_Input extends CI_Input
{
   // some code
}

نقل قول:نکته: اگه نیاز به استفاده از سازنده توی کلاس خودتون دارین، مطمئن بشین که سازنده‌ی کلاس والد رو فراخوانی کردین:
class MY_Input extends CI_Input
{
    public function __construct()
    {
        parent::__construct();
    }
}

هر متدی که در کلاس شما همنام با متدهای موجود در کلاس والد تعریف بشه، بجای نسخه‌ی بومی مورد استفاده قرار میگیره (به این قابلیت میگن «رونویسی متد» در شئ‌گرایی). این ویژگی به شما اجازه‌ی تغییر رفتار هسته‌ی CodeIgniter رو میده.

اگه قصد دارین کلاس هسته‌ی Controller رو گسترش بدین، مطمئن بشین که از کلاس خودتون بعنوان کلاس والد کنترلرها استفاده کردین:
class Welcome extends MY_Controller // instead of CI_Controller
{
    // ...
}

تنظیم پیشوند دلخواه شما
برای تنظیم پیشوند اختصاصی خودتون برای کلاس‌های فرزند، فایل application/config/config.php رو باز کنید و دنبال این گزینه بگردین:
$config['subclass_prefix'] = 'MY_';
تشکر شده توسط:
#23
ایجاد کلاس‌های فرعی
در برخی مواقع ممکنه بخواین کلاس‌هایی ایجاد کنید که مستقل از کنترلرهای شما هستن ولی قابلیت استفاده از تمام منابع کدایگنایتر رو داشته باشن. این‌موضوع به‌سادگی قابل انجامه. هر کلاسی که شما در داخل کنترلر خودتون بارگذاری میکنین، میتونه به منابع داخلی CodeIgniter ازطریق فراخوانی تابع get_instance() دسترسی پیدا کنه. این تابع، شئ اصلی کدایگنایتر رو برمیگردونه.

بطور معمول برای فراخوانی هرکدوم از متدهای داخلی کدایگنایتر از $this استفاده میکنیم:
$this->load->helper('url');
$this->load->library('session');
$this->config->item('base_url');
// etc.

البته این $this فقط در داخل کنترلرها، مدل‌ها و ویوها قابل استفاده است. اگه بخواین از کلاس‌های CodeIgniter در داخل کلاس‌های شخصی خودتون استفاده کنید، میتونین این‌شکلی کار کنین:
$CI =& get_instance();

و حالا با کمک متغیر $CI بجای $this کار کنید:
$CI =& get_instance();

$CI->load->helper('url');
$CI->load->library('session');
$CI->config->item('base_url');
// etc.

اگه از get_instance() درون یه کلاس دیگه استفاده میکنین، شاید بهتر باشه که اون رو به یه فیلد نسبت بدین. اینطوری هروقت به شئ اصلی CodeIgniter احتیاج داشتین میتونین از اون فیلد استفاده کنین:
class Example
{
   protected $CI;

   // We'll use a constructor, as you can't directly call a function
   // from a property definition.
   public function __construct()
   {
       $this->CI =& get_instance();
   }

   public function foo()
   {
       $this->CI->load->helper('url');
       redirect();
   }

   public function bar()
   {
       $this->CI->config->item('base_ur');
   }
}

توی مثال بالا، هر دو متد foo() و bar() بعد از ایجاد شئ از کلاس Example میتونن با شئ اصلی کدایگنایتر کار کنن، بدون اینکه نیاز باشه توی هرکدوم از get_instance() استفاده کنین.
تشکر شده توسط:
#24
هوک‌ها - توسعه‌ی هسته‌ی فریمورک
قابلیت هوک‌ها یا قلاب‌های کدایگنایتر، به شما اجازه‌ی ورود به داخل روند کاری فریمورک و دستکاری اون، بدون نیاز به تغییر فایل‌های هسته رو میده. وقتی CodeIgniter اجرا میشه، یکسری مراحل پردازش رو طی میکنه که در بخش چرخه‌ی کاری برنامه درموردش توضیح دادیم. ممکنه مواردی پیش بیاد که شما بخواین یه کاری رو در مرحله‌ی مشخصی از فرایند اجرای برنامه، انجام بدین. برای مثال ممکنه بخواین یه اسکریپت دقیقاً قبل یا بعد از بارگذاری کنترلر شما اجرا بشه یا اینکه بخواین یکی از اسکریپت‌های خودتون رو در جای دیگری فراخوانی کنید.

فعال‌کردن هوک‌ها
قابلیت هوک‌ها رو میشه بطور کلی ازطریق فایل تنظیمات application/config/config.php و گزینه‌ی زیر، تنظیم کرد:
$config['enable_hooks'] = TRUE;

تعریف یک هوک یا قلاب
هوک‌ها در فایل application/config/hooks.php معرفی میشن. هر هوک بصورت یه آرایه با این الگو معرفی میشه:
$hook['pre_controller'] = array(
   'class'    => 'MyClass',
   'function' => 'MyFunction',
   'filename' => 'Myclass.php',
   'filepath' => 'hooks',
   'params'   => array('one', 'two', 'three'),
);

اندیس آرایه به اسم نقطه‌ی هوک موردنظر برای استفاده بستگی داره. توی مثال بالا، نقطه‌ی هوک pre_controller هست. فهرست نقاط هوک رو در ادامه معرفی میکنیم. عناصر زیر باید توی آرایه‌ی انجمنی هوک شما معرفی شده باشن:
  • class اسم کلاسی که میخواین صدا بزنین. اگه ترجیح میدین از روش رویه‌گرا بجای یه کلاس استفاده کنین، این آیتم رو خالی بگذارین.
  • function اسم تابع (یا متد) موردنظر برای فراخوانی.
  • filename اسم فایلی که حاوی کلاس/تابع موردنظر شماست.
  • filepath اسم پوشه‌ی شامل اسکریپت شما. دقت‌کنید که اسکریپت شما باید توی یه پوشه داخل مسیر application/ باشه و درنتیجه مسیر رو باید نسبت‌به اون پوشه بنویسید. برای مثال اگه اسکریپت شما داخل مسیر application/hooks/ هست، خیلی ساده فقط از 'hooks' بعنوان filepath استفاده می‌کنید. اگه اسکریپت شما در مسیر application/hooks/utilities/ قرار داره، باید از 'hooks/utilities' بعنوان filepath استفاده کنید و کارکتر / انتهایی رو ننویسید.
  • params هر پارامتری که میخواین برای اسکریپتتون ارسال بشه. این آیتم اختیاریه.
اگه از PHP نسخه 5.3 یا بالاتر استفاده میکنین، میشه از توابع بی‌نام (یا Closure) هم بعنوان هوک استفاده کنید. بعنوان مثال:
$hook['post_controller'] = function() {
   // do something here
};

فراخوانی متعدد یک هوک
اگه میخواین در یک نقطه‌ی هوک، چند اسکریپت رو اجرا کنید، خیلی ساده باید یه آرایه‌ی چندبعدی بسازین مثل این:
$hook['pre_controller'][] = array(
   'class'    => 'MyClass',
   'function' => 'MyMethod',
   'filename' => 'Myclass.php',
   'filepath' => 'hooks',
   'params'   => array('one', 'two', 'three'),
);

$hook['pre_controller'][] = array(
   'class'    => 'MyOtherClass',
   'function' => 'MyOtherMethod',
   'filename' => 'Myotherclass.php',
   'filepath' => 'hooks',
   'params'   => array('four', 'five', 'six'),
);

به کروشه‌های بعد از اندیس هر آرایه دقت کنید:
$hook['pre_controller'][]

این‌کار به شما اجازه‌ی فراخوانی چند اسکریپت روی یک نقطه‌ی هوک رو میده. ترتیب تعریف شما مشخص‌کننده‌ی ترتیب اجرای اسکریپت‌هاست.

نقاط هوک
فهرست نقاط هوک موجود به این صورته:
  • pre_system قبل از هر کاری درحین اجرای سیستم فراخوانی میشه. فقط کلاس‌های benchmark و hooks در این مرحله بارگذاری شدن و هیچ فرایند مسیریابی یا چیز دیگری اتفاق نیفتاده.
  • pre_controller بلافاصله قبل از فراخوانی کنترلر شما اتفاق میفته. تمام کلاس‌های پایه بارگذاری شدن و مسیریابی و کنترل‌های امنیتی انجام شده.
  • post_controller_constructor بعد از اینکه شئ کلاس کنترلر شما ایجاد شد و قبل از اینکه هر متدی صدا زده بشه، فراخوانی میشه.
  • post_controller بعد از اینکه کنترلر شما کاملاً اجرا شد، فراخوانی میشه.
  • display_override متد _display() رو رونویسی میکنه که برای ارسال خروجی نهایی برای مرورگر کاربر در انتهای اجرای سیستم بکار میره. این‌کار به شما اجازه میده که از روش خاص خودتون برای نمایش خروجی استفاده کنید. دقت‌کنید که نیاز به دسترسی به شئ اصلی کدایگنایتر ازطریق تابع get_instance() دارین و داده‌های نهایی رو میتونین ازطریق فیلد output و متد get_output() بدست بیارین. برای مثال:
    $this->CI =& get_instance();
    $output = $this->CI->output->get_output();
  • cache_override به شما اجازه میده متد دلخواه خودتون رو بجای متد _display_cache() در کتابخانه‌ی خروجی فراخوانی کنید.
  • post_system بعد از اینکه خروجی نهایی برای مرورگر کاربر ارسال شد، در پایان اجرای سیستم فراخوانی میشه.
تشکر شده توسط:
#25
بارگذاری خودکار منابع
کدایگنایتر از قابلیت بارگذاری خودکار بهره می‌بره که اجازه میده کتابخانه‌ها، فایل‌های کمکی و مدل‌ها بصورت خودکار در هربار اجرای سیستم بارگذاری بشن. اگه نیاز به منابع خاصی بصورت سراسری در کل برنامه دارین، باید برای راحتی بیشتر، بارگذاری خودکار اونها رو درنظر داشته باشین. این موارد رو میشه بصورت خودکار بارگذاری کرد:
  • کلاس‌های موجود در پوشه‌ی libraries/
  • فایل‌های کمکی موجود در پوشه‌ی helpers/
  • فایل‌های تنظیمات سفارشی موجود در مسیر config/
  • فایل‌های زبان قرارگرفته در مسیر system/language/
  • مدل‌های موجود در پوشه‌ی models/
برای بارگذاری خودکار منابع، فایل application/config/autoload.php رو باز کنید و آیتم موردنظرتون رو به آرایه‌ی بارگذاری خودکار اضافه‌کنید. دستورالعمل‌های لازم رو توی فایل برحسب نوع هر عنصر میتونین پیدا کنین.


نقل قول:نکته: پسوند .php رو موقع اضافه‌کردن عنصر به آرایه‌ی بارگذاری خودکار اضافه نکنید.


همچنین اگه بخواین CodeIgniter از فایل بارگذاری خودکار Composer استفاده کنه، فقط کافیه متغیر $config['composer_autoload'] رو داخل فایل application/config/config.php با مقدار TRUE یا مسیر قرارگیری اون فایل تنظیم کنید.
تشکر شده توسط:
#26
توابع رایج
کدایگنایتر از چند تابع برای انجام عملیات خودش استفاده میکنه که بصورت سراسری تعریف شدن و همه‌جا در دسترس شما هستن. این توابع نیاز به بارگذاری هیچ کتابخانه یا فایل کمکی خاصی ندارن.

is_php($version)
پارامترها:
  • $version (رشته) - شماره‌ی نسخه‌ی موردنظر
مقدار بازگشتی: TRUE درصورتی که نسخه‌ی PHP درحال‌اجرا حداقل نسخه‌ای باشه که اعلام شده یا FALSE اگه اینطور نباشه.
نوع بازگشتی: منطقی

این تابع تشخیص میده که آیا نسخه‌ی PHP نصب‌شده روی سرور برابر با نسخه‌ی اعلام‌شده یا بالاتر از اون هست یا نه.

مثال:
if (is_php('5.3')) {
   $str = quoted_printable_encode($str);
}

این متد اگه نسخه‌ی PHP نصب‌شده برابر یا بالاتر از نسخه‌ی اعلام‌شده باشه نتیجه‌ی TRUE برمیگردونه و اگه نسخه‌ی PHP نصب‌شده کمتر از نسخه‌ی اعلام‌شده باشه، نتیجه‌ی FALSE میده.



is_really_wriatble($file)
پارامترها:
  • $file (رشته) - مسیر فایل
مقدار بازگشتی: TRUE اگه مسیر قابل نوشتن باشه و FALSE اگه اینطور نباشه.
نوع بازگشتی: منطقی

تابع is_writable() روی سرورهای ویندوز حتی اگه واقعاً نتونین روی فایل بنویسین، نتیجه‌ی TRUE برمیگردونه چون سیستم‌عامل فقط درصورتی به PHP نتیجه‌ی FALSE میده که توی خصوصیات فایل، خاصیت Read-Only فعال شده باشه. این تابع چک میکنه که آیا واقعاً فایل قابل نوشتن هست یا نه و برای این‌کار سعی میکنه یکبار داخلش چیزی بنویسه. معمولاً این تابع فقط توی سیستم‌هایی که اطلاعات اعلام‌شده توسط سیستم‌عامل قابل‌اعتماد نیستن توصیه میشه.

مثال:
if (is_really_writable('file.txt')) {
   echo 'I could write to this if I wanted to';
} else {
   echo 'File is not writable';
}

نقل قول:نکته: باگ PHP شماره‌ی 54709 رو برای اطلاعات بیشتر مطالعه کنید.


config_item($key)
پارامترها:
  • $key (رشته) - کلید عنصر آرایه‌ی تنظیمات
مقدار بازگشتی: مقدار موجود در آرایه‌ی تنظیمات با کلید مربوطه یا NULL درصورت عدم وجود
نوع بازگشتی: ترکیبی

کتابخانه‌ی تنظیمات روش ترجیحی برای دسترسی به اطلاعات تنظیمات محسوب میشه، هرچند تابع config_item() برای استخراج کلیدهای تکی قابل‌استفاده است. مستندات کتابخانه‌ی تنظیمات رو برای اطلاعات بیشتر بخونین.


set_status_header($code, $text = '')
پارامترها:
  • $code (عدد صحیح) - کد وضعیت پاسخ HTTP
  • $text (رشته) - متن سفارشی (اختیاری) برای تنظیم‌کردن درکنار کد وضعیت
مقدار بازگشتی: هیچ
نوع بازگشتی: هیچ

به شما اجازه میده که بصورت دستی یه هدر وضعیت سرور رو تنظیم کنید.

مثال:
set_status_header(401);
// Sets the header as: Unauthorized

اینجا رو برای فهرست کامل هدرها مشاهده کنید.


remove_invisible_characters($str, $url_encoded = TRUE)
پارامترها:
  • $str (رشته) - متن ورودی
  • $url_encoded (منطقی) - (اختیاری) آیا باید کارکترهای URL رمزگذاری‌شده هم حذف بشن یا نه؟
مقدار بازگشتی: متن پاکسازی‌شده
نوع بازگشتی: رشته


این تابع جلوی درج کارکترهای NULL رو بین کارکترهای ASCII میگیره (مثل JavaScript).

مثال:
remove_invisible_characters('Java\0Script');
// Returns: 'JavaScript'


html_escape($var)
پارامترها:
  • $var (ترکیبی) - متغیری که باید خنثی‌سازی (Escape) بشه (رشته یا آرایه)
مقدار بازگشتی: رشته(ها)ی خنثی شده
نوع بازگشتی: ترکیبی

این تابع بعنوان یه اسم مستعار برای تابع بومی خود PHP یعنی htmlspecialchars() کار میکنه، با این مزیت که میتونه یه آرایه از رشته‌ها رو هم بعنوان ورودی دریافت‌کنه و برای جلوگیری از حملات Cross Site Scripting یا همون XSS مفیده.



get_mimes()
پارامترها: ندارد
مقدار بازگشتی: یک آرایه‌ی انجمنی از انواع فایل
نوع بازگشتی: آرایه

این تابع یک ارجاع به آرایه‌ی انواع MIME موجود در application/config/mimes.php رو برمیگردونه.


is_cli()
پارامترها: ندارد
مقدار بازگشتی: درصورتی‌که اسکریپت با رابط خط‌فرمان اجرا شده باشه نتیجه‌ی TRUE و درغیر اینصورت نتیجه‌ی FALSE میده.
نوع بازگشتی: منطقی

این تابع اگه اسکریپت تحت CLI درحال اجرا باشه نتیجه‌ی TRUE و در غیر اینصورت نتیجه‌ی FALSE میده.
نقل قول:این تابع چک میکنه که مقدار PHP_SAPI برابر با 'cli' باشه یا ثابت STDIN تعریف شده باشه.


function_usable($function_name)
پارامترها:
  • $function_name (متنی) - اسم تابع
مقدار بازگشتی: اگه میتونیم از تابع استفاده کنیم، نتیجه‌ی TRUE و درغیر اینصورت نتیجه‌ی FALSE میده
نوع بازگشتی: منطقی

این تابع باکمک function_exists() چک میکنه که تابع وجود داره یا نه و اگه افزونه‌ی Suhosin بارگذاری شده باشه، چک‌میکنه که تابع موردنظر رو غیرفعال نکرده باشه. این تابع برای مواقعی که میخواین چک‌کنین توابع خاصی مثل eval() یا exec() که میتونن خطرناک باشن و باید روی سرورهایی که محدودیت‌های خاصی دارن باید غیرفعال بشن، فعال هستن یا نه.

نقل قول:این تابع در اصل بخاطر این معرفی شده که Suhosin اجرای اسکریپت رو متوقف میکنه درحالی که این یه باگه که از نسخه‌ی 0.9.34 یه رفع‌مشکل براش موجود بوده ولی هنوز منتشر نشده.
تشکر شده توسط: php
#27
توابع مربوط به سازگاری
کدایگنایتر مجموعه‌ای از توابع رو ارائه کرده که به شما اجازه میدن از قابلیت‌هایی که توی نسخه‌های بالاتر PHP یا تحت شرایط خاصی موجود هست، استفاده کنید.

بخاطر پیاده‌سازی اختصاصی این توابع، نیازمندی‌های خاصی برای اونها وجود داره ولی بازم درصورتی‌که تنظیمات PHP شما اونها رو ارائه نمیکنه، سودمند هستن.

نقل قول:نکته: درست شبیه توابع رایج، توابع مربوط به سازگاری هم همه‌جا قابل دسترسی هستن، فقط به این‌شرط که نیازمندی‌های اونها برآورده بشه.

هش پسورد
این مجموعه از توابع سازگاری، پشتیبانی از افزونه‌ی استاندارد PHP به‌اسم Password Hashing رو ارائه میکنن که توی خود PHP از نسخه‌ی 5.5 به بعد قابل استفاده است.

پیشنیازها
  • PHP نسخه‌ی 5.3.7
  • پشتیبانی از CRYPT_BLOWFISH توسط تابع crypt()

ثابت‌ها
  • PASSWORD_BCRYPT
  • PASSWORD_DEFAULT

مرجع توابع

password_get_info($hash)

پارامترها:
  • $hash (رشته) - هش پسورد

خروجی: اطلاعات درباره‌ی پسورد هش‌شده

نوع بازگشتی: آرایه

برای اطلاعات بیشتر، به مستندات PHP درمورد password_get_info() مراجعه کنین.

password_hash($password, $algo, $options = [])

پارامترها:
  • $password (رشته) - متن خام پسورد
  • $algo (عدد صحیح) - الگوریتم هش‌کردن
  • $options (آرایه) - تنظیمات هش‌کردن

خروجی: پسورد هش‌شده یا FALSE درصورت عدم موفقیت

نوع بازگشتی: رشته

برای اطلاعات بیشتر، به مستندات PHP درمورد password_hash() مراجعه کنید.

نقل قول:بجز درصورتی که از Salt شخصی خودتون (که معتبر هم باشه) استفاده کنید، این تابع نیاز به یه منبع CSPRNG داره. هرکدوم از موارد زیر میتونن این نیاز رو برآورده کنن:
  • mcrypt_create_iv() با MCRYPT_DEV_URANDOM
  • openssl_random_pseudo_bytes()
  • /dev/arandom
  • /dev/urandom

password_needs_rehash($hash, $algo, $options = [])

پارامترها:
  • $hash (رشته) - هش پسورد
  • $algo (عدد صحیح) - الگوریتم هش‌کردن
  • $options (آرایه) - تنظیمات هش‌کردن

خروجی: TRUE درصورتی‌که رمز نیاز به هش‌کردن مجدد داشته باشه تا با الگوریتم و تنظیمات مشخص‌شده سازگار بشه و FALSE درغیر اینصورت

نوع بازگشتی: عبارت منطقی

برای اطلاعات بیشتر مستندات PHP رو درمورد password_needs_rehash() مطالعه کنین.

password_verify($password, $hash)

پارامترها:
  • $password (رشته) - متن خام پسورد
  • $hash (رشته) - هش پسورد

خروجی: TRUE اگه رمز با هش مطابقت داشته باشه و FALSE درغیر اینصورت

نوع بازگشتی: عبارت منطقی

برای اطلاعات بیشتر، مستندات PHP رو درمورد password_verify() بخونین.



هش (خلاصه‌ی پیام)
این توابع پشتیبانی از hash_equals() و hash_pbkdf2() رو فراهم میکنن که بدون اونها، فقط از PHP نسخه‌ی 5.6 و 5.5 (به‌ترتیب) قابل استفاده است.

پیشنیازها
  • هیچ

مرجع توابع

hash_equals($known_string, $user_string)

پارامترها:
  • $known_string (رشته) - متن شناخته‌شده
  • $user_string (رشته) - متن ارائه‌شده توسط کاربر

خروجی: TRUE درصورتی‌که رشته‌ها با هم مطابقت داشته باشن و FALSE درغیر اینصورت

نوع بازگشتی: عبارت منطقی

برای اطلاعات بیشتر، به مستندات PHP درمورد hash_equals() مراجعه کنین.

hash_pbkdf2($algo, $password, $salt, $iterations, $length = 0, $raw_output = FALSE)

پارامترها:
  • $algo (رشته) - الگوریتم هش‌کردن
  • $password (رشته) - رمز
  • $salt (رشته) - سالت یا نمک
  • $iterations (عدد صحیح) - تعداد پیمایش موردنیاز برای انجام درحین استخراج
  • $length (عدد صحیح) - طول رشته‌ی خروجی
  • $raw_output (عبارت منطقی) - آیا باید نتیجه بصورت داده‌های باینری خام برگردونده بشه یا نه

خروجی: کلید استخراج‌شده از رمز یا FALSE درصورت عدم موفقیت

نوع خروجی: رشته

برای اطلاعات بیشتر، به مستندات PHP درمورد hash_pbkdf2() رجوع کنید.



رشته‌های حاوی کارکترهای چندبایتی
این مجموعه از توابع سازگاری پشتیبانی محدودی از افزونه‌ی رشته‌های چندبایتی PHP رو ارائه میکنن. به‌دلیل راهکاری محدود جایگزین، فقط چند تابع وجود دارن.

نقل قول:نکته: وقتی که پارامتر مجموعه‌ی کارکترها اعلام نشه، از تنظیمات $config['charset'] استفاده خواهد شد.

پیشنیازها
  • افزونه‌ی iconv

نقل قول:مهم: این پیشنیاز اختیاریه و این توابع همیشه وجود دارن. اگه iconv موجود نباشه، این توابع به رفتار معمولی تک‌بایتی خودشون برمیگردن. ضمناً اگه مجموعه کارکترها رو مشخص کرده باشین، باید توسط iconv پشتیبانی بشه و فرمتش به‌نحوی باشه که توسط iconv شناسایی بشه.

نقل قول:نکته: برای اینکه خودتون پیشنیاز رو روی افزونه‌ی mbstring واقعی بررسی کنین، از ثابت MB_ENABLED استفاده کنید.

مرجع توابع

mb_strlen($str, $encoding = NULL)

پارامترها:
  • $str (رشته) - متن ورودی
  • $encoding (رشته) - مجموعه‌ی کارکترها

خروجی: تعداد کارکترها توی متن ورودی یا FALSE درصورت عدم موفقیت در تشخیص

نوع بازگشتی: عدد صحیح

برای اطلاعات بیشتر، مستندات PHP رو درمورد mb_strlen() بخونین.

mb_strpos($haystack, $needle, $offset = 0, $encoding = NULL)

پارامترها:
  • $haystack (رشته) - متنی که باید داخلش جستجو کنیم
  • $needle (رشته) - بخشی از متن که دنبالش میگردیم
  • $offset (عدد صحیح) - محل شروع جستجو
  • $encoding (رشته) - مجموعه‌ی کارکترها

خروجی: موقعیت کارکتری که $needle پیدا شده یا FALSE درصورت عدم پیداشدن

مقدار بازگشتی: عدد صحیح

برای اطلاعات بیشتر، جزئیات mb_strpos() رو توی مستندات PHP بخونین.

mb_substr($str, $start, $length = NULL, $encoding = NULL)

پارامترها:
  • $str (رشته) - متن ورودی
  • $start (عدد صحیح) - موقعیت اولین کارکتر
  • $length (عدد صحیح) - حداکثر تعداد کارکترها
  • $encoding (رشته) - مجموعه‌ی کارکترها

خروجی: بخشی از $str که با کمک $start و $length مشخص‌شده یا FALSE درصورت عدم موفقیت

نوع بازگشتی: رشته

برای اطلاعات بیشتر به مستندات PHP درمورد mb_substr() مراجعه کنین.



توابع استاندارد
این مجموعه از توابع، پشتیبانی از تعداد محدودی از توابع استاندارد PHP رو که ممکنه توی نسخه‌ی جدیدتری از PHP نسبت‌به نسخه‌ی سرور ارائه شده باشه، فراهم میکنن.

پیشنیازها
  • هیچ

مرجع توابع

array_column($array, $column_key, $index_key = NULL)

پارامترها:
  • $array (آرایه) - آرایه‌ای که قصد داریم اطلاعات رو ازش استخراج کنیم
  • $column_key (ترکیبی) - کلید یا اندیس ستونی که میخوایم نتایج رو از داخلش استخراج کنیم
  • $index_key (ترکیبی) - کلیدی که برای مقادیر بازگشتی باید مورد استفاده قرار بگیره

خروجی: یه آرایه از مقادیر که مشخص‌کننده‌ی یک ستون خاص از آرایه‌ی ورودی هست.

نوع بازگشتی: آرایه

برای اطلاعات بیشتر به مستندات PHP درخصوص array_column() مراجعه کنین.

hex2bin($data)

پارامترها:
  • $data (رشته) - نمایش هگزادسیمال داده‌ها

خروجی: معادل باینری داده‌های ورودی

نوع بازگشتی: رشته

برای جزئیات بیشتر به مستندات hex2bin() مراجعه کنید.
تشکر شده توسط:
#28
مسیریابی
بطور کلی یه ارتباط یک به یک بین هر رشته‌ی URL و ترکیب کنترلر/متد متناسب با اون وجود داره. قسمت‌های مختلف یک URI از الگوی زیر پیروی می‌کنن:
example.com/class/function/id

هرچند در برخی موارد ممکنه بخواین که این ارتباط رو به‌نحو دیگری تعریف‌کنین که یه کنترلر/متد دیگه بجای چیزی‌که ظاهراً با URL مرتبطه، فراخوانی بشه. برای مثال، فرض کنیم شما میخواین URLهاتون شبیه این الگو باشه:
example.com/product/1
example.com/product/2
example.com/product/3
example.com/product/4

بطور طبیعی قسمت دوم URL برای اسم متد رزرو شده ولی توی مثال بالا، داریم ازش بعنوان ID محصول استفاده میکنیم. برای رسیدن به این هدف، کدایگنایتر به شما اجازه میده که کنترل‌کننده‌ی URI رو دستکاری کنین.

تنظیم قواعد مسیریابی شخصی شما
قوانین مسیریابی توی فایل application/config/routes.php تعریف میشن. توی این فایل می‌بینید که یه آرایه به‌اسم $route تعریف شده که به شما اجازه‌میده قوانین مسیریابی شخصی خودتون رو مشخص کنین. مسیرها هم میتونن با شناسه‌های عمومی و هم با عبارات باقاعده تعریف بشن.

شناسه‌های عمومی
یه مسیر که از شناسه‌ی عمومی استفاده میکنه میتونه یه‌چیزی شبیه این باشه:
$route['product/:num'] = 'catalog/product_lookup';

توی یه مسیر، کلید آرایه شامل URI هست که باید مورد مطابقت قرار بگیره، درحالی‌که مقدار آرایه شامل مقصدی هست که باید درصورت مطابقت درخواست با کلید، فراخوانی بشه. توی مثال بالا، اگه کلمه‌ی product توی قسمت اول URL پیدا بشه و یه عدد در قسمت دوم وجود داشته باشه، کلاس catalog و متد product_lookup مورد استفاده قرار میگیرن.

میتونین از عبارات متنی معمولی یا دو نوع شناسه‌ی عمومی استفاده کنین:
(:num) شامل یه قسمت از URL میشه که فقط داخلش عدد وجود داشته باشه و (:any) با قسمتی از URL که شامل هر کارکتری باشه مطابقت پیدا میکنه (بجز کارکتر اسلش / که جداکننده‌ی قسمت‌هاست).

نقل قول:نکته: شناسه‌های عمومی درحقیقت اسامی مستعار برای عبارات باقاعده هستن که :any به الگوی [^/]+ و همچنین :num به الگوی [0-9]+ تبدیل میشه.

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

مسیرها فیلتر نیستن! اینکه ما یه قاعده‌ی مسیریابی مثل 'foo/bar/(:num)' تعریف کرده باشیم، جلوی فراخوانی متد bar از کنترلر Foo رو با مقادیر غیرعددی نمیگیره (اگه بعنوان یه مسیر صحیح وارد شده باشه).

چند مثال
در اینجا چند مثال مشاهده می‌کنید:

$route['journals'] = 'blogs';
اگه URL شامل کلمه‌ی journals در قسمت اولش باشه، به کلاس blogs هدایت میشه.

$route['blog/joe'] = 'blogs/users/34';
اگه URL شامل قسمت‌های blog/joe باشه، به متد users از کلاس blogs هدایت میشه و ID با مقدار 34 تنظیم میشه.

$route['product/(:any)'] = 'catalog/product_lookup';
اگه URL در قسمت اول شامل product باشه و بعدش هر چیزی توی قسمت دوم نوشته بشه، به متد product_lookup از کلاس catalog هدایت میشه.

$route['product/(:num)'] = 'catalog/product_lookup_by_id/$1';
یه URL که در قسمت اول کلمه‌ی product داره و یه عدد در قسمت دوم نوشته شده، به متد product_lookup_by_id از کنترلر catalog هدایت میشه و عدد رو بعنوان پارامتر برای متد ارسال میکنه.

نقل قول:مهم: از اسلش / در ابتدا و انتهای مسیر استفاده نکنید.

عبارات باقاعده
اگه دوست داشته باشین، میتونین از عبارات باقاعده برای تعریف مسیرهاتون استفاده کنین. هر عبارات باقاعده‌ی معتبری مجازه و از سیستم ارجاع به قسمت‌های مشخص‌شده داخل پرانتز استفاده میکنه.

نقل قول:نکته: اگه از پرانتزها برای مشخص‌کردن یک قسمت استفاده کنید، باید از الگوی $ بجای \ برای اشاره بهش استفاده کنید.

یه مسیر RegEx عادی میتونه یه‌چیزی شبیه این باشه:
$route['products/([a-z]+)/(d+)'] = '$1/id_$2';

توی مثال بالا، اگه URI درخواستی یه چیزی مثل products/shirts/123 باشه، متد id_123 از کلاس کنترلر shirts فراخوانی میشه.

باکمک عبارات باقاعده، میتونین حتی چند قسمت رو بصورت یکجا دریافت کنین. برای مثال اگه یه کاربر به بخشی از سایت که با رمز عبور محافظت شده (مخصوص کاربران هست) دسترسی پیدا کنه و بخواین قادر به هدایتش به صفحه‌ی قبلی بعد از لاگین‌کردن باشین، این مثال میتونه براتون سودمند باشه:
$route['login/(.+)'] = 'auth/login/$1';

نقل قول:نکته: توی مثال بالا اگه $1 شامل / هم باشه، همچنان بعنوان پارامترهای مختلف شکسته میشه و بصورت چند پارامتر برای متد Auth::login() ارسال میشه.

برای اون دسته از کسانی که با عبارات باقاعده آشنا نیستن و میخوان یاد بگیرن، سایت regular-expressions.info میتونه نقطه‌ی شروع خوبی باشه.

نقل قول:نکته: میتونین شناسه‌های عمومی و عبارات باقاعده رو توی کلیدها با هم ترکیب کنین.

Callback ها
میتونین اگه خواستین مستقیماً یه تابع برای کنترل مسیر موردنظر بنویسین و دیگه برای کلاس/متد خاصی اون رو نفرستین. برای مثال:
$route['products/([a-zA-Z]+)/edit/(d+)'] = function ($product_type, $id)
{
   return 'catalog/product_edit/' . strtolower($product_type) . '/' . $id;
};

استفاده از فعل‌های HTTP در مسیرها
این امکان وجود داره که از فعل‌های HTTP (متد درخواست) برای مشخص‌کردن قواعد مسیریابی خودتون استفاده کنین. این موضوع بخصوص وقتی که میخواین یه API مبتنی بر REST بسازین، سودمنده. میتونین از افعال استاندارد HTTP (یعنی GET و PUT و POST و DELETE و PATCH) یا موارد دلخواه دیگه (مثل PURGE) استفاده کنید. افعال HTTP به بزرگی و کوچکی حروف حساس نیستن. تنها چیزی که نیاز دارین اینه که فعل موردنظرتون رو بعنوان کلید بُعد دوم آرایه‌ی مسیرتون مشخص کنید. برای مثال:

$route['products']['put'] = 'product/insert';
توی مثال بالا، یه درخواست PUT به آدرس products باعث فراخوانی متد کنترلر Product::inset() میشه.

$route['products/(:num)']['DELETE'] = 'product/delete/$1';
یه درخواست DELETE به URL شامل products در قسمت اول و یه عدد در قسمت دوم باعث فراخوانی متد Product::delete میشه و مقدار عددی واردشده توسط کاربر، بعنوان اولین پارامتر براش ارسال خواهد شد.

البته استفاده از افعال HTTP اختیاریه.

مسیرهای رزرو شده
سه مسیر رزرو شده وجود دارن:
$route['default_controller'] = 'welcome';
این مسیر باعث تغییر کنترلر/متد پیشفرض میشه که درصورتی اجرا خواهد شد که URI شامل هیچ داده‌ای نباشه (مسیر ریشه‌ی سایتتون وارد شده باشه). بعنوان مقدار میتونین ترکیب کنترلر/متد رو وارد کنید و اگه چیزی مشخص نشده باشه، متد index() بعنوان پیشفرض انتخاب میشه. توی مثال بالا Welcome::index() بعنوان ترکیب کنترلر/متد پیشفرض مشخص شده و فراخوانی میشه.

نقل قول:نکته: شما نمی‌تونین از اسم یه پوشه بعنوان بخشی از این تنظیمات استفاده کنین.

اگه بخواین یه صفحه‌ی خطای 404 اختصاصی داشته باشین، میتونین مسیر رزرو شده‌ی زیر رو تنظیم کنین:
$route['404_override'] = '';

این مسیر مشخص‌کننده‌ی متد و کنترلر موردنظر شما برای فراخوانی در مواقعی هست که کنترلر/متد موردنظر درخواست‌شده توسط کاربر وجود نداشته باشه و بجای صفحه‌ی 404 پیشفرض خود CodeIgniter قرار میگیره. توی این مسیر هم نمیتونین از اسم پوشه‌ها استفاده کنید.

البته این مسیر باعث تغییر عملکرد تابع show_404() نمیشه که همچنان صفحه‌ی application/views/errors/error_404.php رو نمایش میده.

$route['translate_uri_dashes'] = TRUE;
همونطور که از مقدار منطقی این مسیر مشخصه، درحقیقت این مورد یه مسیر محسوب نمیشه. این گزینه به شما اجازه میده که بطور خودکار تمام خط‌فاصله‌ها (- یا Dash) رو به کارکتر خط‌زیر (_ یا Underscore) توی اسم متدها و کنترلرها تبدیل کنید. با این‌کار دیگه لازم نیست قواعد مسیریابی خاصی برای این‌گونه تبدیل‌ها بنویسید. این‌موضوع خیلی ضروریه چون خط‌فاصله یه کارکتر مجاز در اسامی متدها و کنترلرها محسوب نمیشه و ممکنه باعث بروز خطا بشه اگه ازش استفاده کنید.

نقل قول:مهم: مسیرهای رزرو شده باید قبل‌از هر مسیر دارای شناسه‌های عمومی و عبارات باقاعده ذکر بشن چون روی تمام مسیرهایی که بعد از اونها اعلام میشن قراره تأثیر بگذارن و درواقع، تنظیمات مسیریابی رو مشخص میکنن.
تشکر شده توسط:
#29
مدیریت خطا
کدایگنایتر به شما اجازه میده که گزارش خطای برنامه رو با کمک توابعی که در ادامه توضیح میدیم، به برنامه‌ی خودتون اضافه کنین. همچنین یه کلاس گزارش خطا وجود داره که به شما اجازه میده پیغام‌های خطا و اشکال‌زدایی رو بصورت فایل‌های متنی ذخیره کنین.

نقل قول:نکته: بطور پیشفرض CodeIgniter تمام خطاهای PHP رو نشون میده. ممکنه بخواین این رفتار رو وقتی که برنامه از فاز توسعه خارج شد، تغییر بدین. میتونین تابع error_reporting() رو در ابتدای فایل اصلی index.php پیدا کنین. غیرفعال‌کردن گزارش خطا باعث نمیشه که فایل‌های گزارش درصورتی که خطایی رخ بده، بروزرسانی نشن.

برخلاف اغلب سیستم‌ها در کدایگنایتر، توابع خطا بصورت رابط‌های عادی رویه‌گرا (Procedural) نوشته‌شدن که باعث میشه بصورت سراسری در کل برنامه قابل استفاده باشن. این روند باعث میشه خطاها بدون اهمیت به محدوده‌ی کلاس/تابع، قابل دسترسی و تولید باشن.

کدایگنایتر یه کد وضعیت هم در زمانی که بخشی از پروژه دستور exit() رو صدا بزنه، برمیگردونه. این کد وضعیت با کد وضعیت HTTP فرق میکنه و بعنوان یه پیام برای سایر پردازش‌هایی که دارن صحت اجرای اسکریپت PHP رو بررسی میکنن ارسال میشه تا بفهمن اجرای اسکریپت با موفقیت انجام شده یا نه. این مقادیر توی فایل application/config/constants.php تعریف شدن. باوجود اینکه کدهای وضعیت بیشترین کاربرد رو در تنظیمات CLI دارن، برگردوندن کد وضعیت مناسب به سرور کمک میکنه تا روند اجرای اسکریپتتون و وضعیت سلامت پروژه رو بررسی کنه.

این توابع به شما اجازه‌ی تولید خطا میدن:

show_error($message, $status_code, $heading = 'An Error Was Encountered')

پارامترها:
  • $message (ترکیبی) - پیام خطا
  • $status_code (عدد صحیح) - کد وضعیت پاسخ HTTP
  • $heading (رشته) - عنوان صفحه‌ی خطا

نوع بازگشتی: هیچ

این تابع یه پیغام خطا با کمک قالب خطای تعریف‌شده در مسیر زیر نمایش میده:
application/views/errors/html/error_general.php

البته اگه برنامه ازطریق خط‌فرمان اجرا شده باشه، از قالب خطای زیر استفاده میکنه:
application/views/errors/cli/error_general.php

پارامتر اختیاری $status_code مشخص میکنه که چه کد وضعیت خطای HTTP خاصی باید همراه با خطا ارسال بشه. اگه $status_code کمتر از 100 باشه، کد وضعیت خطای HTTP برابر با 500 خواهد بود و کد خطای exit بصورت $status_code+EXIT__AUTO_MIN تنظیم میشه. اگه مقدارش بعد از محاسبه، بیشتر از EXIT__AUTO_MAX بشه یا پارامتر $status_code مقدار 100 یا بیشتر داشته باشه، کد وضعیت exit با مقدار EXIT_ERROR تنظیم میشه. برای جزئیات بیشتر، میتونین فایل application/config/constants.php رو بررسی کنین.



show_404($page = '', $log_error = TRUE)

پارامترها:
  • $page (رشته) - نشانی URI
  • $log_error (منطقی) - آیا گزارش خطا ثبت شود؟

نوع بازگشتی: هیچ

این تابع پیغام خطای 404 رو برحسب اینکه برنامه ازطریق مرورگر یا خط‌فرمان اجرا شده باشه، طبق یکی‌از قالب‌های زیر نمایش میده:
application/views/errors/html/error_404.php
application/views/errors/cli/error_404.php

این تابع انتظار داره که رشته‌ای که براش ارسال شده، مسیر فایل صفحه‌ای باشه که پیدا نشده. کد وضعیت exit در زمان استفاده از این تابع با مقدار EXIT_UNKNOWN_FILE تنظیم میشه. دقت‌کنید که کدایگنایتر بطور خودکار پیغام‌های 404 رو در زمانی که کنترلر موردنظر در درخواست پیدا نشه، نمایش میده.

بطور خودکار در CodeIgniter فراخوانی‌های show_404() توی گزارش خطا ثبت میشن. اگه پارامتر دوم رو با FALSE مقداردهی کنین، ثبت خطا توی فایل گزارش خطاها انجام نمیشه.



log_message($level, $message)

پارامترها:
  • $level (رشته) سطح گزارش (error یا debug یا info)
  • $message (رشته) پیغام موردنظر برای ثبت در گزارش

نوع بازگشتی: هیچ

این تابع به شما اجازه میده که پیغام موردنظرتون رو داخل فایل گزارش ثبت کنید. باید یکی‌از مقادیر تعریف‌شده در توضیحات پارامتر رو مشخص کنید تا نوع گزارش مشخص بشه و خود پیغام گزارش رو هم بعنوان پارامتر دوم تعریف کنید.

مثال:
if ($some_var == '') {
    log_message('error', 'Some variable did not contain a value.');
} else {
    log_message('debug', 'Some variable was correctly set.');
}

log_message('info', 'The purpose of some variable is to provide some value.');

سه نوع پیام وجود داره:
  1. پیام خطا (Error) : شامل خطاهای واقعی مثل خطاهای PHP یا خطاهای کاربر میشه.
  2. پیام اشکال‌زدایی (Debug) : این پیام‌ها برای کمک به اشکال‌زدایی برنامه درنظر گرفته شدن. برای مثال اگه یه کلاس آماده‌سازی شده باشه، میتونین این‌موضوع رو بعنوان یه توضیح برای اشکال‌زدایی ثبت کنید تا بعداً اگه خطایی رخ داد، ببینید که برنامه تا کجا پیش رفته بوده و در چه مرحله‌ی به مشکل برخورد کرده.
  3. پیام توضیحی (Informational) : این پیام‌ها کمترین سطح اولویت رو دارن و خیلی ساده، یکسری اطلاعات رو درمورد فرایندی که درحال انجام هست اعلام میکنن.

نقل قول:نکته: برای اینکه واقعاً فایل گزارش ثبت بشه، پوشه‌ی logs/ باید قابل نوشتن باشه. بعلاوه باید توی فایل تنظیمات application/config/config.php سطح آستانه (Threshold) رو برای گزارش‌گیری تعریف کنین. برای مثال ممکنه بخواین فقط خطاهای سطح Error ثبت بشن و دو نوع دیگه توی فایل ذخیره نشن. در اینصورت باید threshold رو روی مقدار 'error' تنظیم کنین. اگه بهش مقدار 0 بدین، کلاً گزارش‌گیری غیرفعال میشه.
تشکر شده توسط:
#30
کش‌کردن صفحات وب
کدایگنایتر به شما اجازه میده که صفحاتتون رو توی حافظه‌ی سیستم سرور ذخیره یا اصطلاحاً Cache کنین تا به حداکثر کارآیی و راندمان در پروژه برسین.

با وجود اینکه CodeIgniter خیلی سریعه، حجم داده‌های پویایی که توی صفحاتتون نشون میدین، مستقیماً با منابع سرور، حافظه و پردازنده‌ی اون در ارتباطه که روی سرعت بارگذاری صفحاتتون اثر میگذاره. باکمک Cache کردن صفحات، چون در وضعیت نهایی نمایششون ذخیره میشن، میتونین به بیشترین سرعتی که تقریباً معادل صفحات ثابت (Static) خواهد بود، دست پیدا کنین.

سیستم کش چطور کار میکنه؟
کش‌کردن رو میشه بصورت جداگانه برای صفحات فعال کرد و میتونین مدت‌زمانی که یه صفحه باید بصورت کش‌شده باقی بمونه و بعد دوباره بروزرسانی بشه رو مشخص کنین. وقتی که یه صفحه برای اولین‌بار بارگذاری میشه، فایل کش توی مسیر application/cache ایجاد میشه و توی درخواست‌های بعدی، فایل کش استخراج شده و برای مرورگر کاربری که اون صفحه رو درخواست کرده ارسال میشه. اگه مدت‌زمان اعتبار کش منقضی بشه، فایل کش حذف میشه و مجدداً قبل‌از ارسال محتوای جدید صفحه برای مرورگر کاربر، ذخیره میشه.

فعال‌کردن کش
برای فعال‌کردن کش، این کد رو توی متدهای کنترلرتون قرار بدین:
$this->output->cache($n);

که در اینجا پارامتر $n عددی هست که تعداد دقیقه‌های اعتبار صفحه‌ی کش‌شده رو مشخص میکنه. دستور بالا میتونه هرجایی توی یه متد نوشته بشه و ترتیبش توی دستورات، تأثیری در نتیجه نداره. بنابراین میتونین هرجایی که ازنظر منطقی معنای بیشتری توی کدتون داشته باشه قرارش بدین. وقتی که این دستور توی متد مشاهده بشه، نتیجه‌ی نهایی متد (که یک صفحه از سایت شما به‌حساب میاد)، کش میشه.

نقل قول:مهم: بخاطر روشی که کدایگنایتر محتوای خروجی رو ذخیره میکنه، کش‌کردن فقط درصورتی کار میکنه که شما خروجی قابل‌نمایش برای کاربر رو با کمک یک ویو توی کنترلرتون نمایش بدین.

اگه تنظیماتی رو که روی خروجی نهایی اثر میگذارن تغییر بدین، باید محتوای فایل‌های کش رو بصورت دستی پاک کنین.

نقل قول:نکته: برای اینکه فایل‌های کش قابل نوشتن باشن، باید مجوز نوشتن رو به پوشه‌ی application/cache/ توی سرورتون بدین.

حذف فایل‌های کش
اگه دیگه نمیخواین از یه فایل کش استفاده کنین (یعنی دیگه نمیخواین یه صفحه‌ی خاص رو کش کنین)، میتونین دستور فعال‌کردن کش رو از متدش توی کنترلر حذف کنین و با این‌کار بعد از گذشتن مدت‌زمان اعتبار کش، از بین میره و دوباره ساخته نمیشه.

نقل قول:نکته: برداشتن دستور فعال‌کردن کش باعث حذف فوری کش نمیشه و باید بطور عادی منقضی بشه (مگه اینکه خودتون دستی فایل کش رو هم از مسیر application/cache حذف کنین).

البته اگه نیاز به حذف دستی یه کش خاص داشته باشین، میتونین از متد delete_cache() کمک بگیرین:
// Deletes cache for the currently requested URI
$this->output->delete_cache();

// Deletes cache for /foo/bar page
$this->output->delete_cache('/foo/bar');
تشکر شده توسط:




کاربران در حال بازدید این موضوع: 9 مهمان