- جمعه 11 اسفند 1396 ساعت 13:30
- 3.1.9
- در حال تکمیل
- فعال
کنترلرها در کدایگنایتر قلب اپلیکیشن شما هستند. زیرا آنها تصمیم میگیرند که چگونه ریکوئستهای HTTP را هَندل کنند.
کنترلر چیست؟
یک کنترلر به زبان ساده یک فایل کلاس است که به گونهای نامگذاری میشود که از طریق URIها در دسترس است. URI زیر را در نظر بگیرید:
example.com/index.php/blog/
در مثال بالا، کدایگنایتر سعی میکند کنترلری با نام Blog.php را بیابد و آن را لود کند. هنگامی که نام کنترلر با اولین سگمنت URI منطبق بود، آن کنترلر لود خواهد شد.
مثال نمایش Hello world
یک فایل با نام Blog.php ایجاد کنید. کد زیر در این فایل، یک کنترلر ساده با یک اکشن در آن است.
<?php
class Blog extends CI_Controller {
public function index()
{
echo 'Hello World!';
}
}
این فایل باید در دایرکتوری application/controllers ذخیره شود.
حالا URL زیر را در مرورگر خود باز کنید:
example.com/index.php/blog/
اگر پیام Hello World را مشاهده کردید، به معنی این است که کنترلر را به درستی ایجاد کردهاید.
مثال زیر یک نامگذاری معتبر است:
<?php
class Blog extends CI_Controller {
}
اما، کد زیر از نظر نامگذاری کلاس کنترلر، نامعتبر است:
<?php
class blog extends CI_Controller {
}
همیشه اطمینان حاصل کنید که کنترلر شما از یک کنترلر دیگر (مثلا CI_Controller) ارثبری شده است تا متدهای آن را به ارث ببرد.
متدها
در مثال بالا، نام متد index()
است. متد index، اکشن پیشفرض کنترلر است و در صورت خالی بودن سگمنت دوم URI، همیشه لود میشود. روش دیگر نمایش Hello World به صورت زیر است:
example.com/index.php/blog/index/
سگمنت دوم URI، متدی از کنترلر را مشخص میکند که قرار است فراخوانی شود. متد comments را به کنترلر اضافه میکنیم:
<?php
class Blog extends CI_Controller {
public function index()
{
echo 'Hello World!';
}
public function comments()
{
echo 'Look at this!';
}
}
با لود URL زیر، متد comments لود میشود.
example.com/index.php/blog/comments/
حالا باید پیام Look at this را مشاهده کنید.
ارسال سگمنتهای URI به متدهای کنترلر
اگر URI بیش از دو سگمنت داشته باشد، سایر سگمنتها به عنوان پارامترهای متد به آن ارسال میشوند. برای مثال اگر URI زیر را در نظر بگیریم:
example.com/index.php/products/shoes/sandals/123
سگمنتهای سوم و چهارم (sandals و 123)، به متد shoes کنترلر products پاس داده میشوند.
<?php
class Products extends CI_Controller {
public function shoes($sandals, $id)
{
echo $sandals;
echo $id;
}
}
تعریف کنترلر پیشفرض
میتوان در مسیریاب کدایگنایتر، تنظیماتی را برای تعیین کنترلر پیشفرض انجام داد. برای مثال وقتی کنترلر مشخص نشده باشد، یعنی در روت (Root) سایت، کنترلر پیشفرض به ریکوئست پاسخ میدهد. برای تعریف کنترلر پیشفرض، فایل application/config/routes.php را باز کنید و متغییر زیر را به عنوان کنترلر پیشفرض مقداردهی کنید.
$route['default_controller'] = 'blog';
در این مثال، blog نام کلاس کنترلری است که میخواهید به عنوان کنترلر پیشفرض استفاده کنید. حالا اگر فایل index.php را لود کنید، پیام Hello World را مشاهده میکنید.
تغییر در رفتار فراخوانی اکشن
همانطور که قبلا گفته شد، سگمنت دوم URI معمولا، متدی از کنترلر را مشخص میکند که قرار است فراخوانی شود. کدایگنایتر به دولوپرها اجازه بازنویسی (override) این رفتار (behavior) را با استفاده از متد _remap()
میدهد.
public function _remap()
{
// Some code here...
}
_remap()
وجود داشته باشد، صرفنظر از اینکه چه چیزی در URI شما وجود دارد، همیشه فراخوانی میشود. این متد رفتار عادی که مشخص میکند با هر URI چه متدی فراخوانی شود را بازنویسی میکند و به شما اجازه میدهد تا ruleهای مسیریابی خوتان را تعریف کنید.متد فراخوانی شده (که معمولا سگمنت دوم URI است)، به عنوان پارامتر به متد _remap()
پاس داده میشود.
public function _remap($method)
{
if ($method === 'some_method')
{
$this->$method();
}
else
{
$this->default_method();
}
}
هر سگمنت دیگری که در URL وجود داشته باشد، به عنوان پارامتر دوم بهمتد _remap()
ارسال میشود. پارامتر دوم اختیاری است و آرایهای از سگمنتها است. این آرایه میتواند در ترکیب با فانکشن call_user_func_array() استفاده شود تا رفتار پیشفرض کدایگنایتر را شبیهسازی کند. مثال:
public function _remap($method, $params = array())
{
$method = 'process_'.$method;
if (method_exists($this, $method))
{
return call_user_func_array(array($this, $method), $params);
}
show_404();
}
پردازش خروجی
کدایگنایتر کلاسی با نام output دارد که مسئول ارسال اتوماتیک دادههای رندر شده نهایی به مرورگر است. در برخی موارد، ممکن است بخواهید دادههای نهایی را قبل از ارسال به مرورگر مورد پردازش قرار دهید. با افزودن متد _output()
به کنترلر، دادههای خروجی نهایی به این متد ارسال خواهند شد.
_output()
وجود داشته باشد، همیشه به جای نمایش مستقیم دادههای نهایی، این متد توسط کلاس output فراخوانی میشود. خروجی نهایی به عنوان اولین پارامتر این متد، به آن ارسال میشود.برای مثال:
public function _output($output)
{
echo $output;
}
_output()
دادهها را در وضعیت نهایی خود دریافت میکند. دادههای مربوط به بنچمارک و مصرف مموری رندر خواهند شد، اگر قابلیت کش را فعال کرده باشید، فایلهای کش نوشته میشوند و اگر از این قابلیت استفاده کرده باشید، هدرها به مرورگر ارسال خواهند شد، قبل از اینکه به متد _output()
تحویل داده شوند. برای اینکه خروجی کنترلر به درستی کش شود، کد زیر را در متد _output()
بنویسد:
if ($this->output->cache_expiration > 0)
{
$this->output->_write_cache($output);
}
اگر از این قابلیت استفاده کنید، ممکن است زمان اجرای صفحه و آمار مصرف مموری کاملا دقیق و صحیح نباشند، زیرا هر پردازشی که در این متد انجام شود را نادیده میگیرند.متدهای پرایوت (Private methods)
در برخی موارد ممکن است نیاز به مخفی کردن برخی متدها از دسترسی عمومی داشته باشید. به منظور دستیابی به این مهم، تنها کافیست که آن متدها را به صورت private یا protected تعریف کنید، در نهایت این متدها با ریکوئست از طریق URI فراخوانی نخواهند شد. برای مثال اگر متدی مانند مثال زیر داشته باشید:
private function _utility()
{
// some code
}
تلاش برای دسترسی به آن با URI زیر نتیجه ای جز،خطای 404 نخواهد داشت.
example.com/index.php/blog/_utility/
سازماندهی و دستهبندی کنترلرها در سابدایرکتوریها
اگر در حال ساخت اپلیکیشن بزرگی هستید، ممکن است بخواهید کنترلرهای اپلیکیشن خود را با ساختار سلسله مراتبی در ساب دایرکتوری ها دستهبندی کنید. کدایگنایتر به شما اجازه انجام این کار را میدهد. کافیست سابدایرکتوریهای مورد نظر خود را در دایرکتوری application/controllers بسازید و کلاسهای کنترلر اپلیکیشن را در آنها قرار دهید.
application/controllers/products/Shoes.php
برای فراخوانی کنترلر بالا، URL باید چیزی شبیه این باشد:
example.com/index.php/products/shoes/show/123
هر کدام از سابدایرکتوریها ممکن است شامل یک کنترلر پیشفرض باشند که اگر URL فقط دربردارنده نام آن سابدایرکتوری باشد، کنترلر پیشفرض آن فراخوانی خواهد شد. با استفاده از default_controller در فایل application/config/routes.php نام این کنترلر را مشخص کنید. همچنین کدایگنایتر به شما اجازه میدهد تا با استفاده از ویژگی مسیریابی URI، آن ها را ریمپ (Remap) کنید.
متد سازنده کنترلرها
اگر تمایل به استفاده از متد سازنده در هر کدام از کنترلرهای خود دارید، باید کد زیر را در آن قرار دهید:
parent::__construct();
علت نوشتن این خط کد، این است که متد سازنده کنترلر شما،متد همنام کلاس والد خود را بازنویسی میکند، بنابراین باید متد سازنده کلاس والد را در متد سازنده کنترلر خود فراخوانی کنید. مثال
<?php
class Blog extends CI_Controller {
public function __construct()
{
parent::__construct();
// Your own constructor code
}
}
اگر بخواهید برخی پراپرتیها را به صورت پیشفرض مقداردهی کنید، یا وقتی که کلاس فراخوانی میشود یکسری پردازش را انجام دهید، متدهای سازنده بسیار کاربردی هستند. متدهای سازنده مقدار را برنمیگردانند، اما میتوانند بکسری کارها را به صورت پیشفرض انجام دهند.
اسامی رزرو شده متدها
از آنجایی که کلاس کنترلر شما، کنترلر اصلی اپلیکیشن را توسعه (extend) میکند، باید دقت کنید که نام متدهای کنترلر شما با نامهای رزرو شده کنترلر اصلی همنام نباشد تا از بازنویسی متدهای کنترلر اصلی جلوگیری شود.
__construct()
نداشته باشد، آنگاه متد Index::index()
به عنوان متد سازنده و در نقش متد __construct()
ظاهر میشود. این ویژگی به خاطر پسسازگاری با PHP4 است.سایر پستهای داکیومنت
- به کدایگنایتر خوش آمدید
- نصب
- بررسی اجمالی
- شروع به استفاده از کدایگنایتر
- کدایگنایتر در یک نگاه
- فیچرهای کدایگنایتر
- فلوچارت اپلیکیشن
- مدل ویو کنترلر
- اهداف طراحی و معماری
- خودآموز
- مشارکت در کدایگنایتر
- نوشتن مستندات کدایگنایتر در صف ترجمه
- گواهی مبدأ توسعه دهنده 1.1 در صف ترجمه
- مباحث کلی
- URLها در کدایگنایتر
- کنترلرها
- نامهای رزرو شده
- ویوها
- مدلها
- هلپرفانکشنها
- استفاده از لایبرریهای کدایگنایتر
- ساخت لایبرری
- استفاده از درایورهای کدایگنایتر
- ساخت درایور
- ساخت کلاسهای هسته سیستم
- ساخت کلاسهای کمکی
- هوکها - توسعه هسته فریمورک
- بارگذاری خودکار ریسورسها
- فانکشنهای عمومی
- فانکشنهای سازگاری
- مسیریابی URI
- هندل کردن خطاها
- کش کردن صفحات وب
- ارزیابی و تجزیه و تحلیل عملکرد اپلیکیشن
- اجرای کدایگنایتر به وسیله خط فرمان
- مدیریت چندین اپلیکیشن
- هندل کردن محیطهای چندگانه
- سینتکس جایگزین PHP برای فایلهای ویو
- Security در صف ترجمه
- راهنمای کدنویسی در PHP
- لایبرریها در صف ترجمه
- کلاس بنچمارک
- درایور کش در صف ترجمه
- Calendaring Class در صف ترجمه
- Shopping Cart Class در صف ترجمه
- Config Class در صف ترجمه
- Email Class در صف ترجمه
- Encrypt Class در صف ترجمه
- Encryption Library در صف ترجمه
- File Uploading Class در صف ترجمه
- Form Validation در صف ترجمه
- FTP Class در صف ترجمه
- Image Manipulation Class در صف ترجمه
- Image Manipulation Class در صف ترجمه
- Javascript Class در صف ترجمه
- کلاس زبان
- Loader Class در صف ترجمه
- کلاس مایگریشن
- Output Class در صف ترجمه
- Pagination Class در صف ترجمه
- Template Parser Class در صف ترجمه
- Security Class در صف ترجمه
- Session Library در صف ترجمه
- HTML Table Class در صف ترجمه
- Trackback Class در صف ترجمه
- کلاس تایپوگرافی در صف ترجمه
- Unit Testing Class در صف ترجمه
- URI Class در صف ترجمه
- User Agent Class در صف ترجمه
- XML-RPC and XML-RPC Server Classes در صف ترجمه
- کلاس انکود کردن آرشیو Zip در صف ترجمه
- رفرنس دیتابیس در صف ترجمه
- شروع سریع دیتابیس: کد نمونه
- پیکربندی دیتابیس در صف ترجمه
- Connecting to your Database در صف ترجمه
- Queries در صف ترجمه
- Generating Query Results در صف ترجمه
- Query Helper Methods در صف ترجمه
- Query Builder Class در صف ترجمه
- Transactions در صف ترجمه
- Database Metadata در صف ترجمه
- فراخوانی سفارشی فانکشن
- Database Caching Class در صف ترجمه
- Database Forge Class در صف ترجمه
- Database Utility Class در صف ترجمه
- DB Driver Reference در صف ترجمه
- هلپرفانکشنها
- هلپرفانکشن Array
- هلپرفانکشن CAPTCHA در صف ترجمه
- هلپرفانکشن Cookie
- Date Helper در صف ترجمه
- هلپرفانکشن Directory
- Download Helper در صف ترجمه
- Email Helper در صف ترجمه
- File Helper در صف ترجمه
- هلپرفانکشن Form در صف ترجمه
- HTML Helper در صف ترجمه
- Inflector Helper در صف ترجمه
- هلپرفانکشن Language
- هلپرفانکشن Number
- Path Helper در صف ترجمه
- Security Helper در صف ترجمه
- Smiley Helper در صف ترجمه
- هلپرفانکشن String
- Text Helper در صف ترجمه
- Typography Helper در صف ترجمه
- URL Helper در صف ترجمه
- XML Helper در صف ترجمه