ساخت لایبرری

مجتبی پاکزاد کدایگنایتر 3.1.9 در حال تکمیل رایگان

هنگامی که واژه "لایبرری‌ها" را استفاده می‌کنیم، معمولا به کلاس‌هایی اشاره داریم که در دایرکتوری libraries قرار گرفته‌اند و در بخش رفرنس کلاس این راهنما آن‌ها را توضیح می‌دهیم. گرچه، در این پست، به منظور جدا نگهداشتن لوکال ریسورس‌ها و گلوبال ریسورس‌های فریمورک، به جای آن نحوه اینکه چگونه می‌توانید لایبرری خودتان را در دایرکتوری application/libraries بسازید را توضیح می‌دهیم.

به عنوان یک نکته اضافه، اگر فقط نیاز به افزودن چند قابلیت به یک لایبرری موجود دارید، کدایگنایتر اجازه می‌دهد تا با لایبرری‌های خود، کلاس‌های نیتیو (بومی) آن را توسعه دهید. یا تنها با نامگذاری اسامی دقیقا مشابه، می‌توانید آن‌ها (لایبرری‌های خود در دایرکتوری 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" است. نام فایل را می‌توانید با حروف بزرگ یا کوچک بنویسد. کدایگنایتر اهمیتی نمی‌دهد.

هنگامی که کلاس لود شود، با استفاده از شکل حروف کوچک نام کلاس، می‌توانید به آن دسترسی داشته باشید:

$this->someclass->some_method();  // Object instances will always be lower case

ارسال پارامترها در هنگام لود اولیه کلاس

در هنگام لود هر لایبرری، می‌توانید داده‌های مورد نظرتان را به آن لایبرری ارسال کنید. برای اینکار، داده‌ها را به شکل یک آرایه به عنوان پارامتر دوم متد لود لایبرری (load->library) تنظیم کنید. داده‌ها به متد __construct() کلاس لایبرری مورد نظر پاس داده می‌شوند. 

$params = array('type' => 'large', 'color' => 'red');

$this->load->library('someclass', $params);

اگر از این ویژگی استفاده کنید، باید متد constructor  کلاس خود را با توجه به داده‌های مورد انتظارتان بازنویسی کنید:

<?php defined('BASEPATH') OR exit('No direct script access allowed');

class Someclass {

        public function __construct($params)
        {
                // Do something with $params
        }
}

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

استفاده از ریسورس‌های کدایگنایتر داخل کتابخانه شما

برای دسترسی به ریسورس‌های نیتیو کدایگنایتر در داخل کتابخانه خود، از متد get_instance() استفاده کنید. این متد سوپر آبجکت کدایگنایتر را برمی‌گرداند.

اصطلاحات فنی

سوپرآبجکت (Super Object) در کدایگنایتر، آبجکتی (شی) است که با استفاده از آن می‌توان به هر ریسورس لود شده‌ای از کدایگنایتر دسترسی داشت.

معمولا هر متد قابل دسترسی کدایگنایتر را از داخل متد کنترلر، با استفاده از $this می‌توان فراخوانی کرد:

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

گرچه $this، فقط مستقیما داخل کنترلر، مدل یا ویو کار می‌کند. اگر تمایل به استفاده از کلاس‌های کدایگنایتر داخل کلاس‌های سفارشی خود دارید، می‌توانید مراحل زیر را انجام دهید:

ابتدا، آبجکت کدایگنایتر را به یک متغییر تخصیص کنید:

$CI =& get_instance();

هنگامی که آبجکت را به یک متغییر نسبت دادید، می‌توانید از آن متغییر به جای استفاده کنید:

$CI =& get_instance();

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

نکته

اگر کمی دقت کرده باشید، متوجه خواهید شد که انتساب مقدار به متغییر $CI به روش انتساب رفرنسی (=&) بوده است.

$CI =& get_instance();

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

گرچه، از آنجایی که یک لایبرری در واقع یک کلاس است، بهتر است از تمام مزایای اصول شی‌گرایی استفاده کنید. بنابراین، به منظور قادر به استفاده بودن از سوپرآبجکت کدایگنایتر در تمام متدهای کلاس، پیشنهاد می‌کنیم به جای اینکار، انتساب رفرنسی سوپرآبجکت را در متد __construct() و به یک پراپرتی (مثلا $CI) تخصیص دهید:

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');
        }

}

جایگزین کردن لایبرری‌های شما با لایبرری‌های نیتیو

به سادگی و با نامگذاری فایل‌های کلاس، همنام با هر لایبرری نیتیو، کدایگنایتر به جای استفاده از لایبرری نیتیو مجبور به استفاده از لایبرری شما خواهد شد. برای استفاده از این قابلیت، باید کلاس و فایل حاوی کلاس لایبرری را دقیقا همنام با لایبرری نیتیو نامگذاری کنید. برای مثال، برای جایگزین کردن لایبرری خود با لایبرری نیتیو Email، یک فایل در دایرکتوری application/libraries/Email.php بسازید و کلاس را مطابق زیر در آن تعریف کنید:

class CI_Email {

}

توجه کنید که اکثر کلاس‌های نیتیو کدایگنایتر دارای پیشوند CI_ هستند.

برای لود لایبرری خود، باید از متد استاندارد لود استفاده کنید:

$this->load->library('email');

نکته

در حال حاضر، امکان جایگزین کردن لایبرری‌های سفارشی شما با کلاس‌های دیتابیس وجود ندارد.

توسعه لایبرری‌های نیتیو

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

  • در هنگام تعریف کلاس دقت کنید که باید از کلاس والد خود مشتق شود زیرا در واقع کلاس نیتیو را توسعه می‌دهد.
  • نام کلاس جدید شما و نام فایل حاوی آن باید دارای پیشوند MY_ باشند (این پیشوند قابل تنظیم و تغییر است. ادامه را مطالعه کنید.).

برای مثال، برای توسعه کلاس نیتیو Email، باید یک فایل در دایرکتوری application/libraries/MY_Email.php بسازید و کلاس را مطابق زیر در آن تعریف کنید:

class MY_Email extends CI_Email {

}

اگر می‌خواهید از متد __construct() در کلاس خود استفاده کنید، حتما متد والد __construct() را نیز در این متد فراخوانی کنید.

class MY_Email extends CI_Email {

        public function __construct($config = array())
        {
                parent::__construct($config);
                // Your own constructor code
        }

}

نکته

همه لایبرری‌ها دارای پارامتر یا پارامترهای یکسان در متد __construct() خود نیستند. قبل از توسعه یک لایبرری، ابتدا به کدهای کلاس لایبرری مورد نظر خود نگاهی بیاندازید تا ببینید که چگونه باید پیاده‌سازی شود.

لود کلاس‌های فرعی

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

$this->load->library('email');

هنگامی که کلاس لود شد، می‌توانید از آن مشابه سایر لایبرری‌ها استفاده کنید. در مورد کلاس Email، تمام متدها با دستور زیر فراخوانی می‌شوند:

$this->email->some_method();

تنظیم پیشوند لایبرری‌های شما

برای تنظیم پیشوند کلاس فرعی خود، فایل application/config/config.php را باز کنید و به دنبال خط زیر بگردید:

$config['subclass_prefix'] = 'MY_';

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