تالار گفتمان nCIS.ir

نسخه‌ی کامل: آموزش جامع Yii2
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
توی این تاپیک قصد دارم مرحله به مرحله شما رو با Yii2 آشنا کنم. این آموزش درواقع ترجمه مستندات رسمی سایت Yii هست. سعی میکنم مطابق معمول، با بیان ساده و روان و خودمونی مطالب رو بگم و تجربیات شخصی خودم رو هم بهش اضافه کنم تا بتونین ارتباط بهتری با این آموزشها برقرار کنید.
Yii چیه؟
Yii یه فریمورک PHP مبتنی بر اجزاء (Component-Based) و با کارآیی (Performance) بالا برای ساخت سریع برنامه های تحت وب مدرن هست. اسم Yii (با تلفظ Yee یا [:ji]) به معنای «ساده و انقلابی» توی زبان چینی هست. همچنین میتونه بعنوان مخفف !Yes It Is هم محسوب بشه.

Yii برای چه کاری بهترینه؟
Yii یه فریمورک برنامه نویسی وب عمومیه، معناش اینه که میتونه برای توسعه همه نوع برنامه وب با استفاده از PHP بکار گرفته بشه. بخاطر معماری مبتنی بر اجزاء و پشتیبانی قدرتمندش از کَش کردن، بطور خاص برای توسعه برنامه های مقیاس بزرگ مثل پورتالها، انجمنها، سیستمهای مدیریت محتوا (CMS)، پروژه های تجارت الکترونیک، وب سرویسهای RESTful و امثال اینها، مناسبه.

Yii در قیاس با بقیه فریمورکها چطوره؟
اگه با یه فریمورک دیگه آشنایی دارین، ممکنه بدونین Yii در مقایسه با اون چطوره؟
  • مثل اغلب فریمورکهای PHP، فریمورک Yii الگوی معماری MVC رو پیاده سازی میکنه و ساختار کدها رو بر مبنای اون ایجاد میکنه.
  • Yii از این فلسفه پیروی میکنه که کدها باید به شکل ساده و هوشمندانه پیاده سازی بشن. Yii هیچوقت سعی نمیکنه چیزی رو که وجود داره، دوباره طراحی کنه، فقط بخاطر اینکه از یه الگوی طراحی خاص پیروی کنه.
  • Yii به شدت قابل توسعه است. میتونید تقریباً هر تکه از کد هسته رو سفارشی کنید یا تغییر بدین. حتی میتونید از معماری یکپارچه افزونه های Yii برای استفاده یا توسعه افزونه های قابل توزیع مجدد استفاده کنید.
  • کارآیی بالا همیشه مهمترین هدف Yii بوده.

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

نسخه های Yii
Yii درحال حاضر دو نسخه اصلی داره: 1.1 و 2.0 که نسخه 1.1 نسل قبلی هست و درحال حاضر توی وضعیت نگهداری و پشتیبانی هست. نسخه 2.0 یه بازنویسی کامل از Yii محسوب میشه که اون رو با آخرین فناوریها و پروتکلها مثل Composer و PSR و فضاهای نام و Trait و... سازگار کرده. نسخه 2.0 نماینده نسل فعلی فریمورک هست و بیشترین تلاش تیم توسعه رو در چند سال آینده به خودش اختصاص میده. این راهنما بطور خاص مربوط به نسخه 2.0 هست.

نیازمندهای و پیشنیازها
نسخه 2.0 نیازمند PHP نسخه 5.4.0 یا بالاتره. میتونید جزئیات بیشتری از نیازمندیهای هرکدوم از قابلیتها رو با اجرای برنامه بررسی کننده نیازها که با هر نسخه از Yii ارائه میشه، بدست بیارین.

استفاده از Yii نیازمند آگاهی پایه از برنامه نویسی شئ گرا (OOP) هست و Yii یه فریمورک کاملاً شئ گراست. Yii 2.0 از آخرین ویژگیهای PHP مثل namespace و trait استفاده میکنه. درک این مفاهیم به شما توی برقراری ارتباط راحتتر با Yii 2.0 کمک میکنه.
ارتقا از نسخه 1.1
تفاوتهای خیلی زیادی بین نسخه های 1.1 و 2.0 فریمورک Yii وجود داره چون فریمورک کاملاً توی 2.0 بازنویسی شده. درنتیجه، ارتقاء از نسخه 1.1 به راحتی ارتقاء توی نسخه های فرعی نیست. توی این قسمت تفاوتهای اصلی بین دو نسخه رو پیدا میکنید.

اگه از نسخه 1.1 قبلاً استفاده نکردین، میتونید با خیال راحت از این بخش بگذرین و مستقیماً «شروع به کار» رو بخونید.

لطفاً دقت کنید که Yii 2.0 قابلیتهای جدید بیشتری نسبت به چیزهایی که توی این فهرست خلاصه پوشش داده شده، معرفی کرده. شدیداً پیشنهاد میکنیم که کل این آموزش رو برای یادگیری همه اونها بخونید. مواردی وجود دارن که یکسری قابلیتها که قبلاً مجبور بودین خودتون پیاده سازی کنید، حالا جزو کد هسته فریمورک شده باشن.

نصب
Yii 2.0 از مدیر بسته PHP یعنی کامپوزر استفاده میکنه. نصب هسته فریمورک و افزونه ها الآن ازطریق Composer انجام میشه. لطفاً به بخش نصب Yii برای فهمیدن روش نصب Yii 2.0 مراجعه کنید. اگه میخواین افزونه جدیدی بسازین یا افزونه قبلی خودتون رو برای 1.1 به افزونه سازگار با 2.0 تبدیل کنید، به بخش «ساخت افزونه» توی آموزش مراجعه کنید.

نیازمندیهای PHP
Yii 2.0 نیاز به PHP 5.4 یا بالاتر داره که نسبت به نسخه 5.2 که موردنیاز Yii 1.1 بود، یه رشد خیلی بزرگ محسوب میشه. درنتیجه، تفاوتهای زیادی توی سطح زبان برنامه نویسی وجود داره که باید بهش دقت کنید. خلاصه ای از تغییرات اصلی با توجه به نسخه جدید PHP رو مشاهده میکنید:
  • فضاهای نام (namespace)
  • توابع بی نام
  • دستور زبان کوتاه آرایه [...elements...] بجای (...array(...elements
  • تگ کوتاه شده echo یعنی <?= توی فایلهای view استفاده میشه. این قابلیت از نسخه 5.4 به بعد امن محسوب میشه.
  • کلاسها و رابطهای SPL
  • نسبت دهی تأخیری ایستا (Late static bindings)
  • تاریخ و زمان
  • خصیصه ها (Traits)
  • intl توی Yii 2.0 از افزونه intl توی PHP برای پشتیبانی از قابلیتهای چند زبان سازی استفاده شده.

فضاهای نام
آشکارترین تغییر توی Yii 2.0 استفاده از namespace هاست. تقریباً تمامی کلاسهای پایه دارای فضای نام شدن. برای مثال yiiwebRequest. پیشوند C دیگه توی اسامی کلاسها استفاده نمیشه. الگوی نامگذاری الان از ساختار پوشه ها پیروی میکنه. برای مثال، yiiwebRequest نشون میده که فایل کلاس موردنظر، web/Request.php توی پوشه فریمورک Yii هست.

(شما میتونین از هر کلاس هسته فریمورک بدون ضمیمه کردن فایل کلاس مربوطه، به لطف بارگذاری خودکار کلاسها در Yii استفاده کنید).

جزء و شئ
Yii 2.0 کلاس CComponent نسخه 1.1 رو به دو کلاس شکسته: yiibaseObject و yiibaseComponent. کلاس Object یه کلاس پایه سبک هست که اجازه تعریف خصوصیات اشیاء رو با کمک دستیابهای getter و setter میده. کلاس Component از کلاس Object مشتق شده و از رویدادها و رفتارها پشتیبانی میکنه.

اگه کلاس شما نیاز به ویژگی رویدادها یا رفتار نداره، باید از کلاس Object بعنوان کلاس پایه اون استفاده کنید. این مورد بیشتر برای کلاسهایی که نماینده ساختمانهای داده ساده هستن بکار میره.

تنظیم کردن شئ
کلاس Object یه راه یکدست برای تنظیم کردن اشیاء معرفی میکنه. هر کلاس فرعی از کلاس Object باید سازنده خودش رو (درصورت وجود) به شکل زیر تنظیم کنه تا بتونه به شکل صحیح تنظیم بشه:
class MyClass extends yiibaseObject
{
    public function __construct($param1, $param2, $config = [])
    {
        // ... initialization before configuration is applied
        parent::__construct($config);
    }

    public function init()
    {
        parent::init();
        // ... initialization after configuration is applied
    }
}

توی کد بالا، آخرین پارامتر سازنده باید یه آرایه از تنظیمات رو بگیره که شامل زوجهای key => value برای مقداردهی اولیه عناصر در انتهای سازنده هست. میتونید متد ()init رو بازنویسی کنید تا آماده سازیهایی رو انجام بده که باید بعد از تنظیم کردن شئ، انجام بشن.

با پیروی از این مفهوم، میتونید اشیاء رو با کمک یه آرایه تنظیمات، بسازین و تنظیم کنید:
$object = Yii::createObject([
    'class' => 'MyClass',
    'property1' => 'abc',
    'property2' => 'cde',
], [$param1, $param2]);

جزئیات بیشتر درمورد تظنیم کردن شئ رو توی بخش تنظیمات میتونید پیدا کنید.

رویدادها
توی Yii 1.1 رویدادها با تعریف یه متد با پیشوند on (مثل onBeforeSave) تعریف میشدن. توی Yii 2.0 میتونین از هر اسمی برای رویداد استفاده کنید. برای تولید یه رویداد میتونید از متد ()trigger استفاده کنید:
$event = new yiibaseEvent;
$component->trigger($eventName, $event);

برای نسبت دادن یه کنترل کننده به یه رویداد، از متد ()on استفاده کنید:
$component->on($eventName, $handler);
// To detach the handler, use:
// $component->off($eventName, $handler);

پیشرفتهای خیلی زیادی توی قابلیتهای رویدادها ایجاد شده. برای جزئیات بیشتر، بخش رویدادها رو توی آموزش بخونید.

اسامی مستعار مسیر
Yii 2.0 استفاده از اسامی مستعار مسیر (Path Aliases) رو به مسیر هر دو مورد فایلها/پوشه ها و URL ها گسترش داده. همچنین Yii 2.0 الان نیاز داره که یه اسم مستعار با کارکتر @ شروع بشه تا اون رو از مسیرهای فایلها/پوشه ها یا URL های معمولی متمایز کنه. برای مثال، اسم مستعار yii@ به مسیر نصب Yii اشاره میکنه. اسامی مستعار توی اغلب جاها توی کد هسته Yii پشتیبانی شدن. برای مثال، YiicachingFileCache::$cachePath میتونه هم اسم مستعار مسیر و هم مسیر معمولی یه پوشه رو قبول کنه.

یه اسم مستعار مسیر به شدت وابسته به فضای نام کلاس هست. پیشنهاد میشه که یه اسم مستعار مسیر برای هر فضای نام ریشه درست بشه. اینطوری به شما اجازه میده که از بارگذاری خودکار کلاس Yii بدون هرگونه تنظیم اضافه استفاده کنید. برای مثال، از اونجا که yii@ به مسیر نصب Yii اشاره میکنه، کلاسی مثل yiiwebRequest رو میشه بطور خودکار بارگذاری کرد. اگه از یه کتابخانه جانبی مثل Zend Framework استفاده میکنید، ممکنه یه اسم مستعار مسیر به اسم Zend@ تعریف کنید که به محل نصب اون فریمورک اشاره میکنه. وقتی اینکار رو انجام دادین، میتونید هر کلاسی رو توی اون کتابخانه فریمورک Zend هم بطور خودکار بارگذاری کنید.

جزئیات بیشتر درمورد اسامی مستعار مسیر رو توی بخش «اسامی مستعار» بخونید.

ویوها (View)
بزرگترین تغییر توی Yii 2 اینه که متغیر خاص this$ توی ویو دیگه به کنترلر یا ویجت جاری اشاره نمیکنه. this$ الان به یه شئ از کلاس View اشاره میکنه که مفهوم جدیدی هست که توی نسخه 2.0 معرفی شده. شئ ویو از نوع yiiwebView هست که نماینده بخش View از الگوی MVC محسوب میشه. اگه میخواین به کنترلر یا ویجت توی یه ویو دسترسی داشته باشین، میتونید از this->context$ استفاده کنید.

برای نمایش یه ویو داخل یه ویوی دیگه باید از ()this->render$ استفاده کنید نه ()this->renderPartial$. فراخوانی متد render هم باید مستقیماً و صراحتاً با کمک echo برای نمایش خروجی همراه بشه چون متد ()render خروجی رو بعنوان نتیجه برمیگردونه، بجای اینکه مستقیماً نمایش بده. برای مثال:
echo $this->render('_item', ['item' => $item]);

درکنار استفاده از PHP بعنوان زبان اصلی قالب، Yii 2.0 از پشتیبانی رسمی دو موتور قالب محبوب هم بهره میبره: Smarty و Twig. موتور قالب Prado دیگه پشتیبانی نمیشه. برای استفاده از این موتورهای قالب، باید کامپوننت برنامه به اسم view رو با خاصیت تنظیم کردن View::$renderers پیکربندی کنید. برای اطلاعات بیشتر به بخش موتورهای قالب مراجعه کنید.

مدل ها (Model)
Yii 2.0 از کلاس yiibaseModel بعنوان مدل پایه استفاده میکنه، شبیه CModel توی 1.1. کلاس CFormModel کاملاً حذف شده. بجاش توی Yii 2 شما باید از کلاس yiibaseModel یه کلاس مشتق کنید تا یه کلاس مدل فرم بسازین.

Yii 2.0 یه متد جدید به اسم ()scenarios معرفی کرده تا سناریوهای پشتیبانی شده رو مشخص کنید، و بگین که توی هر سناریو کدوم فیلدها نیاز به اعتبارسنجی دارن، میتونن امن درنظر گرفته بشن یا نه. برای مثال:
public function scenarios()
{
    return [
        'backend' => ['email', 'role'],
        'frontend' => ['email', '!role'],
    ];
}

توی کد بالا، دو سناریو به اسامی backend و frontend معرفی شدن. برای backend هر دو فیلد email و role امن هستن و میتونن بصورت انبوه مقداردهی بشن. برای frontend فیلد email میتونه بصورت انبوه مقداردهی بشه درحالی که برای role اینطور نیست. ضمناً هر دو فیلد email و roleباید با کمک قوانین اعتبارسنجی، تأیید اعتبار بشن.

متد ()rules همچنان برای مشخص کردن قوانین اعتبارسنجی بکار میره. دقت کنید که بخاطر معرفی متد ()scenarios دیگه ولیدیتور unsafe وجود نداره.

در اغلب موارد، نیاز به بازنویسی ()scenarios ندارین، اگه متد ()rules بطور کامل سناریوهایی که وجود دارن رو پوشش بده و نیازی به مشخص کردن فیلدهای unsafe وجود نداشته باشه.

برای کسب اطلاعات بیشتر درباره مدل به بخش مدل ها مراجعه کنید.

کنترلرها (Controller)
Yii 2.0 از کلاس yiiwebController بعنوان کلاس پایه کنترلر استفاده میکنه که شبیه CController توی Yii 1.1 هست. کلاس yiibaseAction هم کلاس پایه برای کلاسهای عملیاتی (action) هست.

بیشنریم تأثیر این تغییرات توی کد شما اینه که یه اکشن توی کنترلر باید خروجی که میخواین نمایش بده رو بعنوان نتیجه برگردونه نه اینکه مستقیماً echo کنه:
public function actionView($id)
{
    $model = appmodelsPost::findOne($id);
    if ($model) {
        return $this->render('view', ['model' => $model]);
    } else {
        throw new yiiwebNotFoundHttpException;
    }
}

برای جزئیات بیشتر درباره کنترلر، به بخش مربوط به کنترلرها مراجعه کنید.

ویجت ها (Widget)
Yii 2.0 از yiibaseWidget بعنوان کلاس پایه ویجت استفاده میکنه که شبیه CWidget توی Yii 1.1 هست.

برای پشتیبانی بهتر از فریمورک توی IDEها، Yii 2.0 یه دستور زبان جدید برای استفاده از ویجتها معرفی کرده. متدهای ایستای ()begin و ()end و ()widget معرفی شدن تا به شکل زیر از اونها استفاده کنید:
use yiiwidgetsMenu;
use yiiwidgetsActiveForm;

// Note that you have to echo the result to display it
echo Menu::widget(['items' => $items]);

// Passing an array to initialize the object properties
$form = ActiveForm::begin([
    'options' => ['class' => 'form-horizontal'],
    'fieldConfig' => ['inputOptions' => ['class' => 'input-xlarge']],
]);
// form input fields here
ActiveForm::end();

برای جزئیات بیشتر به بخش ویجت ها مراجعه کنید.

زمینه ها (Theme)
تم توی 2.0 کاملاً متفاوت کار میکنه. تم ها الآن برمبنای یه مکانیزم نگاشت مسیر کار میکنن که یه مسیر فایل ویوی منبع رو به یه مسیر فایل ویوی تم تبدیل میکنه. برای مثال، اگه نگاشت مسیر یه تم این باشه:
['/web/views' => '/web/themes/basic']

اونوقت نسخه داخل تم برای فایل ویوی web/views/site/index.php/ میشه web/themes/basic/site/index.php/ و به همین دلیل، تم ها الان میتونن به هر فایل ویو نسبت داده بشن، حتی اگه ویو خارج از چهارچوب کنترلر یا ویجت رندر بشه (فراموش نکنید که کلاس View هم متد ()render رو داره).

همچنین دیگه کامپوننتی به اسم CThemeManager وجود نداره و بجاش، theme یه فیلد قابل تنظیم از کامپوننت view توی برنامه شده.

برای اطلاعات بیشتر به بخش ساخت تم مراجعه کنید.

برنامه های کنسول (خط فرمان)
برنامه های کنسول الآن بعنوان کنترلر سازماندهی میشن، شبیه برنامه های وب. کنترلرهای کنسول باید از کلاس yiiconsoleController مشتق بشن که شبیه CConsoleCommand توی نسخه 1.1 هست.

برای اجرای یه دستور کنسول باید از الگوی yii <route> استفاده کنید که <route> نماینده یه مسیر کنترلر هست (مثل sitemap/index). پارامترهای بدون نام اضافه بعنوان پارامترهایی که باید به اکشن مربوطه توی کنترلر ارسال بشن درنظر گرفته میشن درحالی که پارامترهای دارای نام برمبنای تعریفی که توی متد ()options اعلام میشه تفسیر خواهند شد.

Yii 2.0 از تولید خودکار اطلاعات راهنمای دستورات براساس بلاکهای کامنت اکشنها پشتیبانی میکنه.

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

بین المللی سازی (I18N)
Yii 2.0 قالب بندی کننده داخلی تاریخ و اعداد رو بخاطر استفاده از ماژول intl توی PHP حذفذ کرده.

ترجمه پیامها با کمک کامپوننت i18n انجام میشه. این کامپوننت مدیریت مجموعه ای از منابع پیام رو بعهده داره که به شما اجازه میده از چند منبع پیام مختلف براساس دسته بندی پیامها استفاده کنید.

برای جزئیات بیشتر به بخش بین المللی سازی مراجعه کنید.

فیلترهای اکشن
فیلدهای اکشن الآن ازطریق رفتارها پیاده سازی میشن. برای تعریف یه فیلتر سفارشی جدید، باید کلاس yiibaseActionFilter رو گسترش بدین. برای استفاده از یه فیلتر، کلاس فیلتر رو به کنترلر بعنوان یه رفتار نسبت بدین. برای مثال، اگه میخواین از فیلتر yiifiltersAccessControl استفاده کنین، باید چنین کدی توی کنترلر بنویسید:
public function behaviors()
{
    return [
        'access' => [
            'class' => 'yiifiltersAccessControll',
            'rules' => [
                ['allow' => true, 'actions' => ['admin'], 'roles' => ['@']],
            ],
        ],
    ];
}}

به بخش فیلترکردن برای جزئیات بیشتر مراجعه کنید.

دارایی ها (Assets)
Yii 2.0 یه مفهوم جدید به اسم Asset Bundle رو معرفی کرده که جایگزین مفهوم بسته اسکریپت که توی Yii 1.1 وجود داشت شده.

یه بسته دارایی مجموعه ای از فایلها (مثل Javascript و CSS و تصویر و...) است که توی یه پوشه قرار دارن. هر بسته دارایی نماینده با یه کلاس که از yiiwebAssetBundle مشتق شده نشون داده میشه. با ثبت یه بسته دارایی ازطریق متد ()register کلاس AssetBundle اون دارایی رو بعنوان یه بسته در اختیار وب میگذارین. برخلاف Yii 1.1، صفحه ای که بسته رو ثبت کرده بطور خودکار شامل ارجاع به فایلهای Javascript و CSS که توی اون بسته معرفی شده خواهد بود.

برای جزئیات بیشتر بخش مدیریت دارایی ها رو مطالعه کنید.

کمک کننده ها
Yii 2.0 کلاسهای کمک کننده ایستای پرکاربردی زیادی رو معرفی کرده. شامل:
برای جزئیات بیشتر به بخش نگاه کلی به کمک کننده ها مراجعه کنید.

فرم ها
Yii 2.0 مفهوم field رو برای ساخت یه فرم با کمک yiiwidgetsActiveForm معرفی کرده. یه فیلد، یه نگه دارنده شامل یه برچسب، یه عنصر ورود اطلاعات، یه پیغام خطا و/یا یه متن راهنما هست. یه فیلد بعنوان یه شئ از کلاس ActiveField تعریف میشه. با استفاده از فیلدها میتونید یه فرم رو به شکل تمیزتری نسبت به قبل بسازین:
<?php $form = yiiwidgetsActiveForm::begin(); ?>
<?= $form->field($model, 'username'); ?>
<?= $form->field($model, 'password')->paswordInput(); ?>
<div class="form-group">
    <?= Html::submitButton('Login'); ?>
</div>
<?php yiiwidgetsActiveForm::end(); ?>

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

ساخت کوئری (Query Builder)
توی نسخه 1.1، ساخت کوئری توی کلاسهای مختلفی مثل CDbCommand و CDbCriteria و CDbCommandBuilder پراکنده شده بود. Yii 2.0 یه کوئری دیتابیس رو بعنوان یه شئ از کلاس Query نشون میده که میتونه با کمک کلاس QueryBuilder در پشت پرده تبدیل به یه دستور SQL بشه. برای مثال:
$query = new yiidbQuery();
$query->select('id, name')
      ->from('user')
      ->limit(10);

$command = $query->createCommand();
$sql = $command->sql;
$rows = $command->queryAll();

از همه بهتر اینکه از این روشهای ساخت کوئری میتونید وقتی با ActiveRecord کار میکنید، هم استفاده کنید.

برای جزئیات بیشتر به بخش ساخت کوئری نگاه کنید.

اکتیو رکورد (Active Record)
Yii 2.0 تغییرات خیلی زیادی توی ActiveRecord معرفی کرده. دوتا از آشکارترین تغییراتش شامل ساخت کوئری و مدیریت کوئریهای رابطه ای هست.

کلاس CDbCriteria که توی نسخه 1.1 وجود داشت با yiidbActiveQuery توی Yii 2 جایگزین شده. این کلاس از yiidbQuery مشتق شده و بخاطر همین تمام متدهای ساخت کوئری رو به ارث برده. میتونید از متد ()find توی اکتیورکورد برای شروع ساخت یه کوئری استفاده کنید:
// to retrieve all *active* customers and order them by their ID:
$customers = Customer::find()
    ->where(['status' => $active])
    ->orderBy('id')
    ->all();

برای تعریف یه رابطه، کافیه یه متد getter بنویسین که یه شئ ActiveQuery برمیگردونه. اسم فیلد مربوط به رابطه توسط متد getter تعریف میشه. برای مثال، کد زیر یه رابطه به اسم orders تعریف میکنه (توی 1.1 باید رابطه ها رو توی یه مکان مرکزی ()relations تعریف میکردین) :
class Customer extends yiidbActiveRecord
{
    public function getOrders()
    {
        return $this->hasMany('Order', ['customer_id' => 'id']);
    }
}

حالا میتونید از customer->orders$ یا ()customer->getOrders$ برای دسترسی به سفارشهای یه مشتری استفاده کنید. حتی میتونید کد زیر برای دنبال کردن کوئری رابطه ای با شرط جدید هم استفاده کنید:
$orders = $customer->orders->andWhere('status=1')->all();

وقتی از بارگذاری حریصانه استفاده میکنید، Yii 2.0 کاملاً متفاوت با 1.1 عمل میکنه. توی 1.1 از کوئری JOIN برای انتخاب رکوردهای اصلی و وابسته استفاده میشد. توی Yii 2.0 دو کوئری جداگانه بدون استفاده از JOIN استفاده میشه: اولی برای استخراج رکوردهای اصلی و دومی برای انتخاب رکوردهای وابسته با فیلترکردن براساس کلیدهای اصلی رکوردهای اصلی.

بجای برگردوندن اشیاء ActiveRecord، میتونید از متد ()asArray استفاده کنید تا تعداد زیادی از رکوردها رو برگردونید. این کار باعث میشه نتایج کوئری بصورت آرایه های معمولی برگردونده بشن که به میزان زیادی زمان CPU و حافظه موردنیاز رو در زمانی که تعداد رکوردهای بازگشتی خیلی زیاده، کاهش میده. مثال:
$customers = Customer::find()->asArray()->all();

یه تغییر دیگه اینه که شما نمیتونید مقادیر پیشفرض فیلدها رو ازطریق فیلدهای public تعریف کنید. اگه میخواین چنین کاری انجام بدین،باید اونها رو توی متد init کلاس مدل موردنظرتون انجام بدین:
public function init()
{
    parent::init();
    $this->status = self::STATUS_NEW;
}

یه سری مشکلات وقتی که سازنده کلاس ActiveRecord رو توی 1.1 بازنویسی میکردین وجود داشت. این مشکلات دیگه توی نسخه 2.0 وجود ندارن. دقت کنید که وقتی پارامتری رو به سازنده اضافه میکنید، احتمالاً لازمه متد ()instantiate کلاس ActiveRecord رو هم توی مدل خودتون بازنویسی کنید.

تغییرات خیلی زیاد و پیشرفتهای دیگه توی اکتیورکورد وجود داشته. به بخش ActiveRecord برای جزئیات بیشتر مراجعه کنید.

رفتارهای ActiveRecord
توی نسخه 2.0 کلاس پایه CActiveRecordBehavior رو حذف کردیم. اگه میخواین یه رفتار توی اکتیورکورد بسازین، باید اون رو مستقیماً از yiiBaseBehavior مشتق کنید. اگه کلاس رفتار نیاز به پاسخ به یکسری رویداد از مالک خودش داشته باشه، باید متد ()events رو به شکل زیر بازنویسی کنید:
namespace appcomponents;

use yiidbActiveRecord;
use yiibaseBehavior;

class MyBehavior extends Behavior
{
    // ...

    public function events()
    {
        return [
            ActiveRecord::EVENT_BEFORE_VALIDATE => 'beforeValide',
        ];
    }

    public function beforeValidate($event)
    {
        // ...
    }
}

کاربر و رابط احراز هویت (User و IdentityInterface)
کلاس CWebUser توی نسخه 1.1 الآن با yiiwebUser جایگزین شده و دیگه کلاس CUserIdentity وجود نداره. بجاش، شما باید رابط yiiwebIdentityInterface رو پیاده سازی کنید که خیلی برای استفاده، سرراست تره. قالب پروژه Advanced یه مثال ازش داره.

برای اطلاعات بیشتر به بخشهای Authentication و Authorization و قالب پروژه Advanced مراجعه کنید.

مدیریت URL
مدیریت آدرسهای وب توی Yii 2 شبیه نسخه 1.1 هست. یه پیشرفت بزرگ این بوده که مدیریت URL الان از پارامترهای اختیاری هم پشتیبانی میکنه. برای مثال اگه یه رول بصورت زیر تعریف کنید، اونوقت هم از post/popular و هم از post/1/popular پشتیبانی میکنه. توی Yii 1.1 باید دوتا رول برای اینکار مینوشتین:
[
    'pattern' => 'post/<page:d+>/<tag>',
    'route' => 'post/index',
    'defaults' => ['page' => 1],
]

به بخش مستندات مدیر URL برای جزئیات بیشتر مراجعه کنید.

یه تغییر مهم توی مفهوم نامگذاری مسیرها این بوده که اسامی camelCase و PascalCase برای کنترلرها و اکشنها تبدیل به ID هایی با حروف کوچک و خط تیره بعنوان جداکننده میشن. برای مثال، اگه اسم کنترلر شما CategoryManagementController باشه، ID کنترلر بصورت category-management خواهد بود. قسمت مربوط به ID های کنترلر و ID های اکشن رو برای جزئیات بیشتر مطالعه کنید.

استفاده از Yii 1.1 و 2.x با هم
اگه یه کد قدیمی Yii 1.1 دارین و میخواین از اون درکنار Yii 2.0 استفاده کنید، به بخش استفاده از Yii 1.1 و 2.0 با هم مراجعه کنید.
نصب Yii
میتونید Yii رو به 2 روش نصب کنید. با استفاده از مدیر بسته Composer یا با دانلود یه فایل فشرده. روش اول رو بیشتر توصیه میکنیم چون به شما اجازه نصب افزونه های جدید یا بروزرسانی Yii رو هم به سادگی اجرای یه خط دستور میده.

نصب استاندارد Yii منجر به دانلود و نصب هر دو مورد فریمورک و قالب پیشفرض پروژه میشه. یه قالب پروژه درواقع یه پروژه Yii هست که یکسری امکانات اولیه (مثل لاگین، فرم تماس با ما و...) رو پیاده سازی کرده. کد این پروژه به روش توصیه شده و پیشنهادی نوشته شده. بنابراین، میتونه بعنوان یه نقطه شروع خوب برای پروژه های شما عمل کنه.

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

اطلاعات: قالب Basic برای توسعه 90٪ برنامه های وب مناسبه. تفاوت اصلیش با قالب Advanced در روش سازماندهی اونهاست. اگه با Yii تازه کار هستین، شدیداً توصیه میکنیم به قالب Basic بچسبین و رهاش نکنین (بخاطر سادگی و درعین حال کاربردهای مناسب و کارآمدش).

نصب ازطریق کامپوزر
اگه تا حالا کامپوزر رو نصب نکردین، میتونید با مستندات راهنمای سایت getcomposer.org اینکار رو انجام بدین. توی لینوکس و Mac OS X دستورات زیر رو استفاده کنید:
curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer

اگه curl رو هم نصب ندارین، برحسب سیستم عاملتون نصبش کنید. برای مثال توی Ubuntu باید از دستور زیر استفاده کنید:
sudo apt-get install curl

برای ویندوز، برنامه Composer-Setup.exe رو دانلود و نصب کنید.

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

اگه کامپوزر رو قبلاً نصب کردین، مطمئن بشین که از نسخه بروزرسانی شده استفاده میکنید. میتونید کامپوزر رو با دستور composer self-update بروزرسانی کنید.

حالا که کامپوزر نصبه، میتونید Yii رو با اجرای دستورات زیر توی مسیر ریشه وب سرور خودتون نصب کنید. اول این دستور رو برای نصب افزونه Asset توی کامپوزر اجرا کنید:
composer global require "fxp/composer-asset-plugin:1.0.0"

این دستور رو یکبار فقط باید اجرا کنید.

حالا برای نصب پروژه با قالب Basic دستور زیر رو بنویسید:
composer create-project yiisoft/yii2-app-basic basic 2.0.4

و برای نصب پروژه با قالب Advanced :
composer create-project yiisoft/yii2-app-advanced advanced 2.0.4

توی دو دستور بالا، basic و advanced قبل از عدد 2.0.4 اسم پوشه ای هست که میخواین پروژه رو داخل اون ایجاد کنید. عدد آخر هم نسخه فریمورک Yii که میخواین پروژه براساس اون ایجاد بشه رو مشخص میکنه.

نقل قول:نکته: درطی نصب ممکنه از شما یه توکن Github درخواست بشه. این موضوع عادیه چون کامپوزر میخواد وابستگیهای بسته ها رو از داخل Github پیدا کنه. اگه اینطور بود، توی همون پنجره یکی دو خط قبل از جایی که باید توکن رو وارد کنید، یه لینک به سایت Github گذاشته شده. اون رو کپی کنید و توی مرورگر باز کنید. با شناسه Github خودتون وارد بشین (اگه ندارین یکی قبلش بسازین) و بعد، فقط اولین گزینه رو توی صفحه ای که باز میشه انتخاب کنید و روی دکمه Generate Token کلیک کنید. کد توکن که به شما داده میشه رو کپی کنید و جلوی جایی که باید Token رو وارد میکردین، Paste کنید و Enter بزنید تا روند نصب تکمیل بشه.

نقل قول:ترفند: اگه میخواین آخرین نسخه درحال توسعه Yii رو نصب کنید، میتونید از دستور زیر استفاده کنید که گزینه stability رو اضافه میکنه:
composer create-project --prefer-dist --stability=dev yiisoft/yii2-app-basic basic

نصب ازطریق فایل فشرده
نصب ازطریق فایل فشرده شامل سه مرحله است:
  1. دانلود فایل فشرده از http://www.yiiframework.com/download
  2. خارج کردن از حالت فشرده داخل یه پوشه توی ریشه وب سرور
  3. ویرایش کردن فایل config/web.php و واردکردن یه کلید خصوصی برای cookieValidationKey توی تنظیمات (این کار اگه با کامپوزر کار کنید، بطور خودکار انجام میشه).

سایر گزینه های نصب
آموزش بالا درمورد نصب Yii بود که یه پروژه Basic هم میساخت که بطور کامل کار میکرد. این روش، نقطه شروع خوبی برای اکثر پروژه هاست، چه کوچک و چه بزرگ. بطور خاص برای شما که میخواین Yii رو یاد بگیرین خیلی مناسبه.

اما روشهای دیگری هم برای نصب هست:
  • اگه میخواین فقط هسته فریمورک رو نصب کنید و کل برنامه رو میخواین از اول خودتون بسازین، میتونید آموزش ساخت برنامه از ابتدا رو دنبال کنید.
  • اگه میخواین یه برنامه جامعتر داشته باشین که برای محیطهای توسعه تیمی مناسبتره، میتونین نصب قالب Advanced رو درنظر داشته باشین.

بررسی نصب
بعد از نصب، توی مرورگرتون این آدرس رو باز کنید:
http://localhost/basic/web/index.php

این آدرس فرض میکنه که شما پروژه رو توی مسیری به اسم basic و مستقیماً داخل ریشه وب سرورتون ایجاد کردین و وب سرور روی سیستم خودتون یعنی localhost درحال اجراست.

[attachment=137]

شما باید تصویر بالا رو توی مرورگر ببینید. اگه پیغام !Congratulations رو ندیدین، چک کنید آیا PHP شما نیازمندیهای Yii رو داره یا نه. میتونید حداقل نیازمندیها رو با یکی از روشهای زیر بررسی کنید:
  • اجرای مسیر http://localhost/basic/requirements.php توی مرورگر
  • اجرای دستورات زیر توی خط فرمان:
    cd basic
    php requirements.php

شما باید PHP خودتون رو برای تأمین نیازهای حداقلی که مشخص شدن تنظیم کنید. مهمترینش اینه که PHP نسخه 5.4 یا بالاتر داشته باشین. باید افزونه PDO و راه اندازهای مناسب مثل pdo_mysql برای MySQL) درصورتی که برنامه شما نیاز به پایگاه داده ها داره، نصب باشه.

تنظیم وب سرورها
نقل قول:اطلاعات: اگه فقط دارین Yii رو تست میکنین تا یاد بگیرین و نمیخواین اون رو توی سرور واقعی نصب کنین، میتونین این بخش رو نادیده بگیرین.

برنامه نصب شده براساس روش بالا باید بدون مشکل روی وب سرور Apache یا Nginx توی ویندوز، Mac OS X یا لینوکس با استفاده از PHP 5.4 یا بالاتر کار کنه. Yii 2.0 با HHVM فیسبوک هم سازگاره. هرچند، یه سری موارد جزئی وجود داره که HHVM با PHP بومی و اصلی کمی متفاوت عمل میکنه و درنتیجه باید وقتی از HHVM استفاده میکنید، دقت بیشتری داشته باشین.

توی سرور واقعی، ممکنه نیاز به تنظیم وب سرور داشته باشین تا برنامه بتونه به درستی با URLهایی مثل http://www.example.com/index.php بجای http://www.example.com/basic/web/index.php کار کنه. چنین تنظیماتی، ریشه وب سرور شما رو به پوشه basic/web هدایت میکنن. همچنین ممکنه بخواین index.php رو هم از URL مخفی کنید که توی بخش مسیریابی و ساخت URL توضیح داده شده. توی این قسمت، توضیح میدیم که چطور Apache یا Nginx رو تنظیم کنید تا به این اهداف برسین.

نقل قول:اطلاعات: با قراردادن basic/web بعنوان ریشه وب، جلوی دسترسی کاربران به کدهای خصوصی برنامه و اطلاعات حساسی که توی پوشه های مجاور basic/web قرار دارن رو میگیرین. جلوگیری از دسترسی به این پوشه ها یه ارتقاء ایمنی محسوب میشه.

نقل قول:اطلاعات: اگه برنامه شما روی یه هاست اشتراکی قرار داره که مجوز دستکاری تنظیمات وب سرورش رو ندارین، بازم میتونین ساختار برنامه رو برای امنیت بیشتر تنظیم کنید. قسمت محیطهای هاست اشتراکی رو برای جزئیات بیشتر بخونید.

تنظیمات توصیه شده Apache
از تنظیمات زیر توی فایل httpd.conf یا داخل تنظیمات هاست مجازی خودتون استفاده کنید. دقت کنید که باید path/to/basic/web رو با مسیر واقعی basic/web جایگزین کنید:
# Set document root to be "basic/web"
DocumentRoot "path/to/basic/web"

<Directory "path/to/basic/web">
    # Use mod_rewrite for pretty URL support
    RewriteEngine On
    # If a directory or a file exists, use the requst directly
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    # Otherwise forward the request to index.php
    RewriteRule . index.php [L,NC,QSA]
</Directory>

البته اگه میخواین روی کامپیوتر خودتون توی localhost اسم web رو از آدرس حذف کنید، یکم باید بیشتر زحمت بکشین. اول از همه این فایل htaccess. رو توی پوشه basic بگذارین:
# prevent directory listings
Options -Indexes
IndexIgnore */*

# follow symbolic links
Options FollowSymlinks
RewriteEngine on
RewriteRule ^(.+)?$ web/$1

بعد این فایل htaccess. رو توی پوشه web بسازین:
RewriteEngine on
# If a directory or a file exists, use the request directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Otherwise forward the request to index.php
RewriteRule . index.php [L,NC,QSA]

حالا فایل config/web.php رو ویرایش کنید و این کدها رو داخلش قرار بدین:
<?php
use yiiwebRequest;
$baseUrl = str_replace('/web', '', (new Request)->getBaseUrl());
// ...
$config = [
    // ...
    'components' => [
        'request' => [
            'cookieValidationKey' => '...',
            'baseUrl' => $baseUrl,
        ],
        // ...
        'urlManager' => [
            'baseUrl' => $baseUrl,
            'class' => 'yiiwebUrlManager',
            'showScriptName' => false,
            'enablePrettyUrl' => true,
            'rules' => [],
        ],
    ],
    // ...
];
// ...
return $config;

تنظیمات پیشنهادی Nginx
برای استفاده از Nginx باید PHP رو بصورت FPM SAPI نصب کنید. ممکنه بخواین از تنظیمات Nginx زیر استفاده کنید و path/to/basic/web رو با مسیر واقعی basic/web جایگزین کنید و بجای mysite.local هم اسم واقعی هاست سرور رو بنویسید:
server {
    charset utf-8;
    client_max_body_size 128M;

    listen 80; ## listen for ipv4
    #listen [::]:80 default_server ipv6only=on; ## listen for ipv6

    server_name mysite.local;
    root        /path/to/basic/web;
    index       index.php;

    access_log  /path/to/basic/log/access.log;
    error_log   /path/to/basic/log/error.log;

    location / {
        # Redirect everything that isn't a real file to index.php
        try_files $uri $uri/ /index.php?$args;
    }

    # uncomment to avoid processing of calls to non-existing static files by Yii
    #location ~ .(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
    #    try_files $uri =404;
    #}
    #error_page 404 /404.html;

    location ~ .php$ {
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
        fastcgi_pass   127.0.0.1:9000;
        #fastcgi_pass unix:/var/run/php5-fpm.sock;
        try_files $uri =404;
    }

    location ~ /.(ht|svn|git) {
        deny all;
    }
}

وقتی از این تنظیمات استفاده میکنین، باید cgi.fix_pathinfo=0 رو هم توی php.ini تنظیم کنید تا از فراخوانیهای غیرضروری ()stat توی سیستم جلوگیری بشه.

ضمناً دقت کنید که وقتی از HTTPS استفاده میکنید، باید ;fastcgi_param HTTPS on رو هم اضافه کنید تا Yii بتونه به درستی تشخیص بده که یه اتصال، امن هست یا نه.
اجرای برنامه
بعد از نصب Yii یه برنامه اجرایی Yii دارین که میتونه با URLهای http://hostname/basic/web/index.php یا http://hostname/index.php برحسب اینکه چطور تنظیمش کردین، اجرا بشه.

توی این قسمت از آموزش، قابلیتهای داخلی برنامه، اینکه کدها چطور سازماندهی شدن و روش مدیریت درخواستها توسط برنامه رو بطور کلی توضیح میدیم.

نقل قول:اطلاعات: برای سادگی، توی این آموزش فرض شده که شما basic/web رو بعنوان ریشه وب سرور تعریف کردین و URL رو برای دسترسی به برنامه خودتون، http://hostname/index.php یا چیزی شبیه اون قرار دادین. درصورتی که آدرس دهی شما فرق میکنه، توضیحات رو مطابق با آدرس دهی خودتون درنظر بگیرین.

دقت کنید که برخلاف خود فریمورک، بعد از نصب قالب پروژه، همه چیزش متعلق به شماست و آزاد هستین که کدها رو اضافه یا حذف کنید و تمام بخشهای اون رو برحسب نیازتون تغییر بدین.

کاربردها
برنامه basic که نصب شده، چهار صفحه داره:
  • صفحه اصلی که وقتی آدرس http://hostname/index.php رو باز میکنید، ظاهر میشه.
  • صفحه About یا درباره ما
  • صفحه Contact که یه فرم تماس با ما نشون میده که به کاربران اجازه میده ازطریق ایمیل با شما در تماس باشن.
  • و صفحه Login که فرم لاگین رو نشون میده که برای اعتبارسنجی و ورود کاربران بکار میره. ورود با نام کاربری و رمز عبور admin رو امتحان کنید. میبینید که منوی اصلی لاگین تبدیل به Logout میشه.

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

شما باید یه نوار هم در پایین پنجره مرورگر ببینید. این یه ابزار رفع اشکال سودمنده که توسط Yii ارائه شده و اطلاعات اشکال زدایی زیادی مثل پیغامهای گزارش، وضعیت پاسخ سرور، کوئریهای دیتابیس که اجرا شدن و... رو در اختیار شما میگذاره.

نقل قول:اطلاعات: اگه این نوار رو ندیدین، مطمئن بشین که پوشه basic/runtime مجوز نوشتن داره.

علاوه بر برنامه وب، یه اسکریپت کنسول (خط فرمان) به اسم yii هم وجود داره که توی پوشه ریشه برنامه (basic) قرار داره. این اسکریپت میتونه کارهای پشت پرده و مربوط به نگهداری از برنامه رو انجام بده که توی بخش برنامه کنسول توضیح داده خواهد شد.

ساختار برنامه
مهمترین پوشه ها و فایلها توی برنامه شما (با فرض اینکه پوشه ریشه برنامه basic هست)، اینهاست:
basic/                  مسیر پایه برنامه (Base Path)
    composer.json       توسط کامپوزر استفاده میشه و اطلاعات بسته رو توضیح میده
    config/             شامل تنظیمات برنامه و سایر تنظیمات هست
        console.php     تنظیمات برنامه کنسول
        web.php         تنظیمات برنامه وب
    commands/           کلاسهای دستورات کنسول رو نگهداری میکنه
    controllers/        کلاسهای کنترلر
    models/             کلاسهای مدل
    runtime/            شامل فایلهایی که توسط فریمورک در زمان اجرا تولید میشه، مثل گزارشات و فایلهای کَش هست
    vendor/             شامل بسته های نصب شده توسط کامپوزر شامل خود فریمورک هست
    views/              فایلهای ویو
    web/                ریشه وب برنامه که شامل فایلهایی هست که ازطریق وب قابل دسترسیه
        assets/         شامل فایلهای دارایی منتشر شده توسط فریمورک مثل جاوااسکریپت و سی اس اس هست
        index.php       اسکریپت ورودی یا راه انداز برنامه
    yii                 اسکریپت خط فرمان فریمورک

بطور کلی، فایلهای فایلهای برنامه رو میشه به دو نوع تقسیم کرد: اونهایی که توی پوشه basic/web هستن و اونهایی که توی بقیه پوشه ها هستن. دسته اول مستقیماً توسط HTTP (یعنی توی مرورگر) مورد دسترسی قرار میگیرن درحالی که دسته دوم رو نمیشه (و نباید) مستقیماً در معرض دسترسی کاربران قرار داد.

Yii الگوی طراحی و معماری MVC رو پیاده سازی میکنه که توی ساختار پوشه های بالا نشون داده شده. پوشه models شامل تمام کلاسهای مدل، پوشه views شامل همه اسکریپتهای ویو، و پوشه controllers هم تمام کلاسهای کنترلر هست.

تصویر زیر نشون دهنده ساختار ثابت یه برنامه است:

[attachment=142]

هر برنامه یه اسکریپت ورودی web/index.php داره که تنها اسکریپت PHP قابل دسترسی ازطریق وب توی برنامه محسوب میشه. اسکریپت ورودی، درخواست کاربر رو میگیره و یه شئ برنامه میسازه تا اون رو مدیریت کنه. شئ برنامه درخواست رو با کمک اجزا یا کامپوننت ها تفسیر میکنه و اون رو به عناصر MVC ارسال میکنه. از ویجت ها توی ویوها برای کمک به ساخت عناصر پویا و پیچیده رابط کاربری استفاده میشه.

چرخه حیات درخواست
تصویر زیر نشون میده که برنامه، چطور یه درخواست رو مدیریت میکنه:

[attachment=144]

  1. یه کاربر درخواست به اسکریپت ورودی web/index.php میده.
  2. اسکریپت ورودی، تنظیمات برنامه رو بارگذاری میکنه و یه شئ برنامه میسازه تا درخواست رو مدیریت کنه.
  3. برنامه مسیر درخواستی رو با کمک کامپوننت درخواست تفسیر میکنه.
  4. برنامه یه شئ کنترلر میسازه تا به درخواست جواب بده.
  5. کنترلر یه شئ اکشن میسازه و فیلترهای مربوط به اکشن رو اجرا میکنه.
  6. اگه هر فیلتری شکست بخوره، اکشن لغو میشه.
  7. اگه تمام فیلترها با موفقیت رد بشن، اکشن اجرا میشه.
  8. اکشن یه مدل داده رو بارگذاری میکنه که احتمالاً از دیتابیس هست.
  9. اکشن یه ویو رو رندر میکنه و اطلاعات دریافتی از مدل رو در اختیارش میگذاره.
  10. خروجی بدست اومده تحویل کامپوننت پاسخ داده میشه.
  11. کامپوننت پاسخ، خروجی رندرشده نهایی رو به مرورگر کاربر ارسال میکنه.
سلام کردن
توی این قسمت توضیح میدیم که چطور یه صفحه «سلام» توی برنامه خودتون بسازین. برای رسیدن به این هدف، ما یه کنترلر و اکشن و یه ویو میسازیم.
  • برنامه درخواست صفحه رو به اکشن میفرسته
  • و اکشن ویو رو رندر میکنه که پیغام سلام رو به کاربر نشون میده.

توی این آموزش این سه چیز رو یاد میگیرین:
  1. چطور یه اکشن برای پاسخ به درخواستها بسازین
  2. چطور یه ویو برای تولید محتوای پاسخ آماده کنید، و
  3. چطور یه برنامه درخواستها رو برای اکشنها ارسال میکنه.

ایجاد اکشن
برای «سلام» گفتن، یه اکشن به اسم say میسازین که پارامتر message رو از درخواست میخونه و همون پیام رو به کاربر نشون میده. اگه توی درخواست، پارامتر message تعریف نشده باشه، اکشن پیام «سلام» رو بعنوان پیشفرض نمایش میده.

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

اکشنها باید داخل کنترلرها تعریف بشن. برای سادگی بیشتر، اکشن say رو داخل کنترلر SiteController که از قبل وجود داره میسازین. این کنترلر توی مسیر controllers/SiteController.php قرار گرفته. کد مربوط به اکشن اینه:
<?php

namespace appcontrollers;
use yiiwebController;

class SiteController extends Controller
{
    // existing code

    public function actionSay($message = 'Hello')
    {
        return $this->render('say', ['message' => $message]);
    }
}

توی کد بالا، اکشن say بصورت یه متد به اسم actionSay توی کلاس SiteController تعریف شده. Yii از پیشوند action برای تفاوت گذاشتن بین متدهای اکشن و متدهای معمولی توی کلاس کنترلر استفاده میکنه. اسمی که بعد از action میاد، بعنوان id اکشن شناخته میشه.

وقتی میخواین اکشنها رو نامگذاری کنین، باید بدونید که Yii چطور با id اکشن برخورد میکنه. id اکشن همیشه با حروف کوچک شناسایی میشه. اگه لازم باشه id اکشن از چند کلمه تشکیل شده باشه، با خط فاصله - از هم جدا میشن (مثل create-comment). اسم متد اکشن از روی id اکشن با حذف خطهای فاصله و تبدیل حرف اول هر کلمه به حروف بزرگ و اضافه کردن پیشوند action بدست میاد. برای مثال، id اکشن create-comment معادل متد اکشن به اسم actionCreateComment هست.

متد اکشن مثال ما یه پارامتر message$ داره که مقدار پیشفرضش Hello هست (درست به همون شکلی که مقدار پیشفرض پارامترها رو توی توابع یا متدهای عادی PHP تعریف میکنید). وقتی برنامه یه درخواست دریافت کنه و تشخیص بده که اکشن say مسئول پاسخدهی به اون هست، این پارامتر رو با پارامتر همنامش که توی درخواست میبینه، مقداردهی میکنه. به عبارت دیگه، اگه توی درخواست، پارامتر message وجود داشته باشه و مقدارش Goodbye باشه، متغیر message$ توی اکشن هم همون مقدار رو خواهد داشت.

توی متد اکشن، ()render رو برای رندرکردن یه فایل ویو به اسم say صدا زدیم. پارامتر message هم برای ویو ارسال شده تا بتونیم توی ویو ازش استفاده کنیم. نتیجه رندرکردن توسط متد اکشن برگردونده میشه. این نتیجه توسط برنامه دریافت میشه و به کاربر نهایی توی مرورگر (بعنوان بخشی از یه صفحه کامل HTML) نمایش داده میشه.

ایجاد ویو
ویوها اسکریپتهایی هستن که شما مینویسین تا یه محتوای پاسخ رو تولید کنن. برای «سلام» یه فایل ویو به اسم say میسازیم که پارامتر message رو که از متد اکشن دریافت کرده، نمایش بده:
<?php use yiihelpersHtml; ?>

<?= Html::encode($message); ?>

ویوی say باید توی مسیر views/site/say.php ذخیره بشه. وقتی متد ()render رو صدا میزنید، دنبال یه فایل PHP به صورت views/ControllerID/ViewName.php میگرده.

دقت کنید که توی کد بالا، پارامتر message قبل از نمایش، HTML-Encode میشه. این کار از اون جهت که پارامتر رو از کاربر گرفتیم، ضروریه تا جلوی حملات XSS رو که باعث میشن سایت درمقابل درج کدهای مخرب Javascript توی پارامتر آسیب پذیر بشه، بگیریم.

طبیعتاً میتونید محتوای بیشتری توی فایل ویوی say بگذارین. محتوا میتونه شامل تگهای HTML، متن خام و حتی دستورات PHP باشه. درحقیقت فایل ویوی say فقط یه اسکریپت PHP هست که توسط متد ()render اجرا میشه. محتوایی که توی اسکریپت ویو نمایش داده میشه، بعنوان نتیجه پاسخ به برنامه برگردونده میشه. برنامه هم این خروجی رو بعنوان نتیجه به کاربر نشون میده.

امتحان کنید
بعد از ایجاد اکشن و ویو، میتونید صفحه رو با واردکردن آدرس زیر اجرا کنید:
http://hostname/index.php?r=site/say&message=Hello+World

البته اگه از urlManager استفاده کرده باشین، احتمالاً باید این آدرس رو فراخوانی کنین:
http://hostname/site/say/message/Hello+World

یا توی سیستم شخصی خودتون:
http://localhost/basic/site/say/message/Hello+World

[attachment=146]

URL به یه صفحه که پیغام Hello World رو نشون میده منتهی خواهد شد. صفحه شما از همون هدر و فوتری که بقیه صفحات سایت دارن، استفاده میکنه.

اگه پارامتر message و مقدارش رو توی URL وارد نکنید، خواهید دید که صفحه فقط کلمه Hello رو نمایش میده. علتش اینه که message بعنوان پارامتر برای متد ()actionSay ارسال شده و وقتی نادیده گرفته بشه، مقدار پیشفرض Hello بجاش استفاده میشه.

نقل قول:اطلاعات: صفحه جدید از همون هدر و فوتر بقیه صفحات استفاده میکنه چون متد ()render بطور خودکار محتوای ویوی say رو توی layout که توسط کنترلر مشخص شده قرار میده که در این مورد، توی مسیر views/layouts/main.php قرار داره.

پارامتر r توی URL بالا نیاز به کمی توضیح داره. r مخفف route یا مسیر هست که یه شناسه یکتا در کل برنامه است که به یه اکشن اشاره میکنه. قالب مسیر بصورت ControllerID/ActionID هست. وقتی برنامه یه درخواست رو دریافت میکنه، این پارامتر رو چک میکنه و از قسمت ControllerID برای فهمیدن اینکه از کدوم کلاس کنترلر باید شئ بسازه تا درخواست رو مدیریت کنه، استفاده میکنه. بعد کنترلر از قسمت ActionID برای تشخیص اینکه کدوم اکشن باید کار رو انجام بده استفاده میکنه. توی این مثال، مسیر site/say به کنترلر SiteController و اکشن say اشاره میکنه و درنتیجه، متد ()SiteController::actionSay برای پاسخ به درخواست، فراخوانی خواهد شد.

نقل قول:اطلاعات: مشابه اکشنها، کنترلرها هم ID هایی دارن که اونها رو از همدیگه توی برنامه تفکیک میکنه. ID کنترلرها از همون قواعد نامگذاری ID اکشنها پیروی میکنه. اسم کلاس کنترلر از روی ID اون، با حذف خطهای فاصله و تبدیل کردن حرف اول کلمات به حروف بزرگ و اضافه کردن پسوند Controller بدست میاد. برای مثال، ID کنترلر post-comment معادل کلاس کنترلر PostCommentController هست.

جمع بندی
توی این قسمت، با بخشهای کنترلر و ویو از الگوی MVC آشنا شدین. یه اکشن رو بعنوان بخشی از یه کنترلر ساختین تا به یه درخواست مشخص جواب بده. همچنین یه ویو ساختین تا محتوای خروجی رو تولید کنه. توی این مثال ساده، از مدل استفاده نشد چون تنها داده موردنیاز توسط پارامتر message تأمین میشد.

همچنین یاد گرفتین که مسیرها که بعنوان پلی بین درخواستهای کاربر و اکشنهای کنترلر هستن، توی Yii به چه شکل تفسیر میشن.

توی قسمت بعدی یاد میگیرین چطور یه مدل بسازین و یه صفحه جدید که شامل یه فرم HTML هست تولید کنین.
کار با فرمها
توی این قسمت میخوایم درباره روش ساخت یه صفحه جدید با کمک یه فرم برای گرفتن اطلاعات از کاربران توضیح بدیم. صفحه ای که میخوایم طراحی کنیم، یه فرم نشون میده برای گرفتن نام و ایمیل. بعد از گرفتن این اطلاعات از کاربر، صفحه اونها رو برای تأیید نشون میده.

برای رسیدن به این منظور، درکنار ایجاد یه اکشن و دو ویو، یه مدل هم میسازیم.

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

ساخت مدل
داده هایی که از کاربر دریافت میشن رو توی یه کلاس مدل به اسم EntryForm میگذاریم که توی مسیر models/EntryForm.php ذخیره میشه. لطفاً به بخش بارگذاری خودکار کلاسها توی مستندات برای جزئیات بیشتر درمورد مفهوم نامگذاری فایلهای کلاسها مراجعه کنید.
<?php

namespace appmodels;
use Yii;
use yiibaseModel;

class EntryForm extends Model
{
    public $name;
    public $email;

    public function rules()
    {
        return [
            [['name', 'email'], 'required'],
            ['email', 'email'],
        ];
    }
}

کلاس EntryForm از کلاس yiibaseModel مشتق شده که کلاس پایه ای هست که توسط Yii ارائه شده و بطور کلی برای نگهداری اطلاعات فرمها بکار میره.

نقل قول:اطلاعات: yiibaseModel بعنوان والد کلاسهای مدلی که با جداول دیتابیس مرتبط نیستن استفاده میشه. yiidbActiveRecord معمولاً والد کلاسهای مدلی هست که به جداول پایگاه داده مربوط میشن.

کلاس EntryForm شامل دو فیلد عمومی name و email هست که برای نگهداری داده هایی که کاربر وارد میکنه بکار میرن. همچنین یه متد به اسم ()rules داره که مجموعه ای از قوانین رو برای اعتبارسنجی داده ها برمیگردونه. قوانینی که توی کد بالا تعریف شدن میگن که:
  • هر دو فیلد name و email ضروری هستن و باید حتماً توی فرم تکمیل بشن.
  • فیلد email باید یه آدرس ایمیل معتبر باشه.

اگه یه شئ از کلاس EntryForm داشته باشین که با ورودیهای کاربر پر شده باشه، میتونید متد ()validate اون رو صدا بزنید تا دستورات اعتبارسنجی داده ها رو اجرا کنه. اگه خطایی توی اعتبارسنجی رخ بده، فیلد hasErrors از مدل مقدار true میگیره و میتونین با کمک فیلد errors یا متد ()getErrors که یه آرایه است، بفهمین چه خطاهایی وجود داشته.
<?php
$model = new EntryForm();
$model->name = 'nCIS';
$model->email = 'invalidEmail';
if($model->validate()) {
    // Good!
} else {
    // Failure!
    // print_r($model->errors);
}

ساخت اکشن
توی مرحله بعدی نیاز به ساخت یه اکشن entry توی کنترلر site داریم که از مدل جدید استفاده میکنه. روند ساخت و استفاده از اکشنها رو توی قسمت قبل توضیح دادیم.
<?php

namespace appcontrollers;

use Yii;
use yiiwebController;
use appmodelsEntryForm;

class SiteController extends Controller
{
    // existing code

    public function actionEntry()
    {
        $model = new EntryForm();

        if($model->load(Yii::$app->request->post()) && $model->validate()) {
            // valid data received in $model
            // do something meaningful here about $model
            return $this->render('entry-confirm', ['model' => $model]);
        } else {
            // either the page is initially displayed or there is some validation error
            return $this->render('entry', ['model' => $model]);
        }
    }
}


اکشن entry اول یه شئ از کلاس EntryForm میسازه. بعد سعی میکنه اون رو با اطلاعات POST_$ که به کمک متد ()yiiwebRequest::post توی Yii قابل دسترسی هست. اگه مدل با موفقیت پر شد (یعنی کاربر فرم رو سابمیت کرده باشه)، اکشن متد ()validate رو صدا میزنه تا مطمئن بشه مقادیری که وارد شدن معتبر هستن یا نه.

نقل قول:اطلاعات: عبارت Yii::$app به شئ برنامه اشاره میکنه که بصورت سراسرای و با الگوی Singleton قابل دسترسیه. همچنین برای دسترسی به کامپوننتهایی مثل request و response و db و... بعنوان یه مکان مرکزی خدمات عمل میکنه تا بتونید به کارآیی موردنظر دسترسی پیدا کنید. توی کد بالا، کامپوننت request از شئ برنامه برای دسترسی به داده های POST_$ بکار رفته.

اگه همه چیز خوب پیش رفته باشه، اکشن یه ویو به اسم entry-confirm رو رندر میکنه تا ارسال موفقیت آمیز داده ها رو به کاربر اعلام کنه. اگه داده ای سابمیت نشده باشه یا داده ها خطایی داشته باشن، ویوی entry رندر میشه که فرم HTML رو همراه با خطاهای اعتبارسنجی احتمالی نشون میده.

نقل قول:نکته: توی این مثال ساده ما فقط صفحه تأیید رو بعد از ارسال داده های معتبر نمایش میدیم. در عمل شما باید از متدهای ()refresh یا ()redirect برای برای جلوگیری از مشکلات سابمیت شدن مجدد فرم استفاده کنید.

ساخت ویوها
درنهایت باید دو فایل ویو به اسامی entry-confirm و entry بسازیم. این ویوها توسط اکشن entry به شکلی که گفته شد، رندر میشن.

ویوی entry-confirm به سادگی نام و ایمیل واردشده رو نمایش میده. این ویو رو توی مسیر views/site/entry-confirm.php ذخیره کنید:
<?php use yiihelpersHtml; ?>

<p>You have entered the following information:</p>

<ul>
    <li><label>Name</label>: <?= Html::encode($model->name); ?></li>
    <li><label>Email</label>: <?= Html::encode($model->email); ?></li>
</ul>

ویوی entry یه فرم HTML نشون میده و باید توی فایل views/site/entry.php ذخیره بشه:
<?php
use yiihelpersHtml;
use yiiwidgetsActiveForm;
?>

<?php $form = ActiveForm::begin(); ?>

    <?= $form->field($model, 'name'); ?>

    <?= $form->field($model, 'email'); ?>

    <div class="form-group">
        <?= Html::submitButton('Submit', ['class' => 'btn btn-primary']); ?>
    </div>

<?php ActiveForm::end(); ?>

ویو از یه ویجت قدرتمند به اسم ActiveForm برای ساخت فرم HTML استفاده میکنه. متدهای ()begin و ()end از ویجت، به ترتیب تگهای باز و بسته فرم رو رندر میکنن. بین فراخوانی این دو متد، فیلدهای ورودی فرم با کمک متد ()field تولید میشن. اولین فیلد ورودی برای داده name و دومی برای email هست. بعد از اینکه فیلدهای ورودی ساخته شدن، متد ()yiihelpersHtml::submitButton فراخوانی میشه تا دکمه سابمیت فرم تولید بشه.

امتحان کنید
برای اینکه ببینید چطور کار میکنه، از مرورگرتون برای اجرای آدرس زیر استفاده کنید:
http://hostname/index.php?r=site/entry

صفحه ای با یه فرم شامل دو فیلد ورودی خواهید دید. درمقابل هر فیلد ورودی یه برچسب هست که نشون میده چه داده ای باید وارد بشه. اگه روی دکمه submit بدون ورود اطلاعات کلیک کنید یا ایمیل معتبری وارد نکنید، یه پیغام خطا بعد از فیلد ورودی مربوطه خواهید دید:

[attachment=152]

بعد از ورود نام و آدرس ایمیل معتبر و کلیک کردن روی دکمه سابمیت، صفحه جدیدی که اطلاعات واردشده رو نشون میده خواهید دید.

[attachment=153]

توضیح جادوی پشت پرده
ممکنه از اینکه چطور فرم HTML پشت پرده داره کار میکنه تعجب کرده باشین، چون اینکه میتونه یه برچسب کنار هر ورودی نشون بده و پیغام خطا رو هم اگه اطلاعات درست وارد نکنید، بدون بروزرسانی (Refresh) صفحه نشون میده، تقریباً جادویی بنظر میرسه (بخصوص از این جهت که شما درظاهر هیچ کد خاصی برای اینکار ننوشتین).

بله، اعتبارسنجی در ابتدا سمت کلاینت با کمک Javascript انجام میشه و در مرحله دوم سمت سرور با PHP. کلاس yiiwidgetsActiveForm به اندازه کافی هوشمند هست که قواعد اعتبارسنجی رو از اون چیزی که توی EntryForm نوشتین استخراج کنه و اونها رو تبدیل به کد Javascript کنه و از اون برای اعتبارسنجی سمت کلاینت استفاده کنه. اگه Javascript غیرفعال باشه، اعتبارسنجی همچنان همونطوری که توی متد ()actionEntry نشون داده شد، در سمت سرور انجام میشه. این عمل، صحت داده ها رو در هر شرایطی تضمین میکنه.

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

برچسبهای عناصر ورودی تولید متد ()field تولید میشن و از اسم فیلدهای مدل استفاده میشه. برای مثال، برچسب Name از روی اسم فیلد name تولید شده. میتونید یه برچسب رو با کد زیر سفارشی کنید:
<?= $form->field($model, 'name')->label('Your Name'); ?>
<?= $form->field($model, 'email')->label('Your Email'); ?>

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

جمع بندی
توی این بخش از آموزش، تمامی بخشهای الگوی MVC رو تجربه کردین. یاد گرفتین که چطور یه کلاس مدل بسازین تا داده های کاربر رو دریافت کنید و این اطلاعات رو اعتبارسنجی کنید.

همچنین یاد گرفتین که چطور اطلاعات رو از کاربر بگیرین و چطور اونها رو توی مرورگر دوباره نشون بدین. این موضوع، کاریه که شما خیلی وقتها توی توسعه یه برنامه انجام خواهید داد، ولی Yii ویجتهای قدرتمندی ارائه کرده که این کار رو خیلی ساده میکنه.

توی قسمت بعد یاد خواهید گرفت که چطور با دیتابیس کار کنید، که تقریباً توی هر برنامه ای لازمه.
کار با دیتابیس
توی این قسمت توضیح میدیم که چطور یه صفحه جدید بسازین که اطلاعات کشورها رو از جدولی به اسم country توی دیتابیس استخراج میکنه و نمایش میده. برای دسترسی به این هدف باید یه اتصال به دیتابیس تنظیم کنید، یه کلاس Active Record بسازین، یه اکشن و یه ویو تولید کنید.

توی این آموزش یاد میگیرین که چطور:
  • اتصال به دیتابیس رو تنظیم کنید،
  • کلاس Active Record رو تعریف کنید،
  • اطلاعات رو با کمک کلاس Active Record از دیتابیس استخراج کنید،
  • اطلاعات رو توی صفحه همراه با صفحه بندی نمایش بدین.

دقت کنید که برای تکمیل این بخش شما باید اطلاعات پایه و تجربه کار با دیتابیسها رو داشته باشین. بطور خاص شما باید نحوه ساخت یه دیتابیس و اجرای دستورات SQL رو با یه ابزار کلاینت دیتابیس (مثل phpMyAdmin) بدونید.

آماده سازی دیتابیس
برای شروع، یه دیتابیس به اسم yii2basic بسازین که قراره اطلاعات رو ازش استخراج کنید. میتونید یه دیتابیس SQLite یا MySQL یا PostgreSQL یا MSSQL یا Oracle رو استفاده کنید چون Yii بطور توکار از خیلی از برنامه های مدیریت دیتابیس پشتیبانی میکنه. برای سادگی، ما فرض میکنیم از MySQL استفاده میکنید.

خوب حالا یه جدول به اسم country توی دیتابیس بسازین و یکسری اطلاعات نمونه واردش کنید. برای انجام این کارها میتونید دستور SQL زیر رو اجرا کنید:
CREATE TABLE `country` (
  `code` CHAR(2) NOT NULL PRIMARY KEY,
  `name` CHAR(52) NOT NULL,
  `population` INT(11) NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `country` VALUES ('AU','Australia',18886000);
INSERT INTO `country` VALUES ('BR','Brazil',170115000);
INSERT INTO `country` VALUES ('CA','Canada',1147000);
INSERT INTO `country` VALUES ('CN','China',1277558000);
INSERT INTO `country` VALUES ('DE','Germany',82164700);
INSERT INTO `country` VALUES ('FR','France',59225700);
INSERT INTO `country` VALUES ('GB','United Kingdom',59623400);
INSERT INTO `country` VALUES ('IR','Iran',75149600);
INSERT INTO `country` VALUES ('RU','Russia',146934000);
INSERT INTO `country` VALUES ('US','United States',278357000);

خوب تا اینجا، یه دیتابیس به اسم yii2basic داریم که داخلش یه جدول به اسم country هست که سه ستون و 10 سطر (رکورد) داره.

تنظیم اتصال به دیتابیس
قبل از ادامه، مطمئن بشین که افزونه PDO رو توی PHP و راه انداز PDO برای دیتابیسی که باهاش کار میکنید (برای مثال pdo_mysql برای MySQL) رو نصب کردین. اگه بخواین با دیتابیسها کار کنید، باید این موضوع رو بعنوان نیاز پایه درنظر داشته باشین.

خوب حالا فایل config/db.php رو باز کنید و پارامترها رو به شکل صحیح برای دیتابیس خودتون تنظیم کنید. بطور پیشفرض باید این فایل بصورت زیر باشه:
<?php

return [
    'class' => 'yiidbConnection',
    'dsn' => 'mysql:host=localhost;dbname=yii2basic',
    'username' => 'root',
    'password' => '',
    'charset' => 'utf8',
];

فایل config/db.php یه فایل معمولی برای معرفی تنظیمات هست. این فایل تنظیمات خاص مشخص کننده پارامترهای موردنیاز برای آماده سازی یه شئ yiidbConnection هست که ازش برای ایجاد کوئریهای SQL توی دیتابیس مشخص شده، استفاده میکنید.

اتصال دیتابیس تنظیم شده در بارا میتونه توی برنامه ازطریق عبارت Yii::$app->db مورد دسترسی قرار بگیره.

نقل قول:اطلاعات: فایل config/db.php توی فایل تنظیمات اصلی config/web.php ضمیمه میشه که مشخص میکنه چطور باید شئ برنامه آماده سازی بشه. برای اطلاعات بیشتر به بخش تنظیمات توی مستندات راهنما مراجعه کنید.

ساخت Active Record
برای نمایش و استخراج داده ها از جدول country باید یه کلاس که از Active Record مشتق شده بسازین و اسمش رو Country بگذارین و اون رو توی مسیر models/Country.php ذخیره کنید:
<?php

namespace appmodels;
use yiidbActiveRecord;

class Country extends ActiveRecord
{
}

کلاس Country از کلاس yiidbActiveRecord مشتق شده. نیاز به نوشتن هیچ کدی داخلش ندارین! فقط با کد بالا Yii اسم جدول رو از اسم کلاس حدس میزنه.

نقل قول:اطلاعات: اگه تناظر مستقیمی بین اسم کلاس و اسم جدول وجود نداشت، میتونید متد ()tableName رو بازنویسی کنید تا اسم جدول دیتابیس رو بصورت یه رشته برگردونه.

با استفاده از کلاس Country میتونید به راحتی داده های جدول رو مثل این کدهای نمونه دستکاری کنید:
use appmodelsCountry;

// get all rows from the country table and order them by "name"
$countries = Country::find()->orderBy('name')->all();

// get the row whose primary key is "IR"
$country = Country::findOne('IR');

// displays "Iran"
echo $country->name;

// modifies the country name to be "IRAN" and save it to database
$country->name = 'IRAN';
$country->save();

نقل قول:اطلاعات: اکتیو رکورد یه راه قدرتمند برای دسترسی و ویرایش داده های دیتابیس بصورت شئ گراست. میتونید اطلاعات بیشتر رو توی بخش Active Record پیدا کنید. البته میتونید از دیتابیس با کمک یه روش دسترسی سطح پایینتر به اسم Data Access Objects یا DAO هم استفاده کنین.

ساخت یه اکشن
برای نمایش اطلاعات کشورها به کاربران، نیاز به ساخت یه اکشن جدید داریم. بجای قراردادن اکشن جدید توی کنترلر site که توی قسمت قبل با روش اینکار آشنا شدین، ترجیح میدیم ایندفعه یه کنترلر جدید مخصوص تمام اکشنهای مرتبط به داده های کشورها بسازیم. این کنترلر جدید رو CountryController نامگذاری کنید و یه اکشن index داخلش بسازین. مشابه کد زیر و توی مسیر controllers/CountryController.php ذخیره کنید:
<?php

namespace appcontrollers;

use yiiwebController;
use yiidataPagination;
use appmodelsCountry;

class CountryController extends Controller
{
    public function actionIndex()
    {
        $query = Country::find();

        $pagination = new Pagination([
            'defaultPageSize' => 5,
            'totalCount' => $query->count(),
        ]);

        $countries = $query->orderBy('name')
            ->offset($pagination->offset)
            ->limit($pagination->limit)
            ->all();

        return $this->render('index', ['countries' => $countries, 'pagination' => $pagination]);
    }
}

اکشن index متد ()Country::find رو صدا میزنه. این متد از اکتیو رکورد یه کوئری از دیتابیس میسازه و میتونه تمام داده ها رو از جدول country بیرون میکشه. برای محدودکردن تعداد کشورهایی که توی هر درخواست برمیگردن، کوئری رو با کمک شئ yiidataPagination صفحه بندی میکنیم. شئ Pagination دو هدف رو برآورده میکنه:
  • مقادیر offset و limit رو توی دستور SQL مربوط به کوئری مقداردهی میکنه تا فقط یک صفحه از اطلاعات در هر لحظه بارگذاری بشه (حداکثر 5 سطر توی هر صفحه).
  • توی ویو برای نمایش Pager که دکمه های مربوط به صفحه بندی رو میسازه استفاده میشه که در ادامه توضیح میدیم.

در انتهای کد، اکشن index یه ویو به اسم index رو رندر میکنه و داده های کشورها و اطلاعات صفحه بندی رو براش ارسال میکنه.

ساخت ویو
توی پوشه views یه پوشه فرعی به اسم country بسازین. این پوشه برای نگهداری تمامی ویوهایی که توسط کنترلر country رندر میشن بکار میره. داخل پوشه views/country یه فایل به اسم index.php بسازین و کد زیر رو داخلش بگذارین:
<?php
use yiihelpersHtml;
use yiiwidgetsLinkPager;
?>
<h1>Countries</h1>
<ul>
    <?php foreach($countries as $country) : ?>
    <li>
        <?= Html::encode("{$country->name} ({$country->code})") ?> :
        <?= $country->population ?>
    </li>
    <?php endforeach; ?>
</ul>

<?= LinkPager::widget(['pagination' => $pagination]) ?>

ویو دو بخش مرتبط با نمایش داده های کشورها داره. توی بخش اول، داده های کشورها توسط حلقه foreach پیمایش میشن و بصورت یه فهرست بدون ترتیب HTML (تگ ul) به نمایش در میان. توی بخش دوم، یه ویجت yiiwidgetsLinkPager با کمک اطلاعات صفحه بندی ارسال شده توسط اکشن رندر میشه. ویجت LinkPager لیستی از دکمه های صفحات رو نشون میده که با کلیک روی هرکدوم از اونها، داده های کشورها توی صفحه مربوطه استخراج و نشون داده میشه.

امتحان کنید
برای دیدن اینکه چطور تمام کدهای بالا کار میکنن، از مرورگر خودتون برای بازکردن URL زیر استفاده کنید:
http://hostname/index.php?r=country/index

[attachment=155]

ابتدا یه صفحه با 5 کشور میبینید. زیر کشورها، یه قسمت صفحه بندی با 4 دکمه میبینید. اگه روی دکمه 2 کلیک کنید، صفحه ای که 5 کشور دیگه رو از دیتابیس نشون میده رو میبینید: صفحه دوم رکوردها. اگه با دقت بیشتری نگاه کنید، میبینید که URL توی مرورگر هم به این شکل در میاد:
http://hostname/index.php?r=country/index&page=2

توی پشت صحنه، صفحه بندی تمام کارآیی لازم برای اینکار رو انجام میده:
  • در ابتدا کلاس Pagination اولین صفحه رو نشون میده که معادل اجرای کوئری SELECT با عبارت LIMIT 5 OFFSET 0 هست. درنتیجه 5 رکورد اول استخراج و نمایش داده میشن.
  • ویجت LinkPager دکمه های صفحات رو با کمک URLهایی که توی Pagination تولید شده، ایجاد میکنه. URLها شامل پارامتر page خواهند بود که صفحات مختلف رو نشون میده.
  • اگه روی دکمه 2 کلیک کنید، یه درخواست جدید به مسیر country/index ارسال میشه. Pagination پارامتر page رو از URL میخونه و صفحه جاری رو روی 2 تنظیم میکنه. درنتیجه کوئری جدید با عبارت LIMIT 5 OFFSET 5 اجرا میشه و 5 کشور بعدی رو نشون میده.

جمع بندی
توی این قسمت شما یاد گرفتین که چطور با دیتابیس کار کنین. همچنین فهمیدین که چطور اطلاعات رو با کمک Pagination و LinkPager بصورت صفحه بندی شده استخراج کرده و نمایش بدین.

توی قسمت بعد کار با ابزار قدرتمند تولید خودکار کد به اسم Gii رو یاد میگیرین که به شما کمک میکنه به سرعت یکسری قابلیتها که بطور مکرر ازشون استفاده میشه رو تولید کنید (مثل Create-Read-Update-Delete یا CRUD برای کار با داده های یه جدول دیتابیس). درحقیقت تمام کدی که توی این قسمت نوشتین رو میشد بطور خودکار با کمک ابزار Gii توی فریمورک Yii تولید کرد.
تولید خودکار کد با Gii
توی این قسمت میخوایم درباره نحوه استفاده از Gii برای تولید خودکار کدی که بخشی از امکانات رایج وب سایت رو پیاده سازی میکنه توضیح بدیم. استفاده از Gii برای تولید خودکار کد، به سادگی واردکردن اطلاعات صحیح توی دستورالعملهایی هست که در صفحات وب Gii نشون داده میشه.

بعد از این آموزش شما یاد میگیرین که:
  • Gii رو توی برنامه خودتون فعال کنین
  • از Gii برای تولید یه کلاس ActiveRecord استفاده کنید
  • با کمک Gii پیاده سازی کد مربوط به عملیات CRUD رو برای یه جدول دیتابیس انجام بدین
  • کدی که توسط Gii تولیدشده رو سفارشی کنید

راه اندازی Gii
Gii توی Yii بصورت  یه ماژول ارائه شده. میتونین Gii رو با تنظیم کردن خاصیت modules برنامه فعال کنید. برحسب اینکه چطور برنامه رو ساخته باشین، ممکنه این کد رو توی بخش config/web.php ببینید:
$config = [ ... ];

if (YII_ENV_DEV) {
    $config['bootstrap'][] = 'gii';
    $config['modules']['gii'] = 'yiigiiModule''
}

کد بالا میگه اگه توی محیط توسعه بودیم، برنامه باید یه ماژول به اسم gii رو فعال کنین که از نوع کلاس yiigiiModule هست.

اگه به اسکریپت ورودی web/index.php برنامه خودتون نگاه کنید، خط زیر رو پیدا میکنید که باعث میشه YII_ENV_DEV مقدار true بگیره:
defined('YII_ENV') or define('YII_ENV', 'dev');

به لطف خط بالا، برنامه شما توی وضعیت توسعه قرار گرفته و درنتیجه Gii بطور خودکار طبق تنظیمات بالا، فعال شده. میتونید به Gii ازطریق آدرس زیر دسترسی پیدا کنید:
http://hostname/index.php?r=gii

نقل قول:نکته: اگه میخواین از ماشینی بجز localhost به Gii دسترسی پیدا کنید، بطور پیشفرض بخاطر مسائل امنیتی جلوی دسترسی شما گرفته میشه. میتونید Gii رو تظنیم کنید تا IP شما رو به فهرست IP های مجاز اضافه کنه:
'gii' => [
    'class' => 'yiigiiModule',
    'allowedIPs' => ['127.0.0.1', '::1', '192.168.0.*', '192.168.178.20'], // adjust this to your needs
],

[attachment=191]

تولید یک کلاس Active Record
برای استفاده از Gii برای تولید یه کلاس اکتیورکورد باید گزینه Model Generator رو توی صفحه بالا انتخاب کنید و فرم رو بصورت زیر تکمیل کنید:
  • توی قسمت Table Name عبارت country رو بنویسید
  • توی قسمت Model Class عبارت Country (با C بزرگ) رو بنویسید

[attachment=192]

حالا روی دکمه Preview کلیک کنید. خواهید دید که روی بخش انتهای صفحه که فایلهایی که قراره تولید بشن رو نشون میده، models/Country.php لیست میشه. وقتی از Gii استفاده میکنید، اگه از قبل فایلی همنام با فایلی که قراره ساخته بشه وجود داشته باشه و قرار باشه رونویسی بشه، با کلیک روی دکمه diff کنار اسم فایل میتونید تغییراتی که بین کد موجود و کدی که Gii قراره بسازه وجود داره رو مشاهده کنید.

[attachment=193]

وقتی به فایل رو رونویسی میکنید، چک باکس کنار overwrite رو تیک بزنید و بعد روی دکمه Generate کلیک کنید. اگه یه فایل جدید دارین میسازین، کلیک کردن روی دکمه Generate کافیه.

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

تولید کد CRUD
CRUD مخفف Create و Read و Update و Delete هست که چهار عمل اصلی هستن که روی داده های توی اکثر سایتها انجام میشن. برای ساخت قابلیت CRUD با کمک Gii گزینه CRUD Generator رو توی صفحه اصلی Gii انتخاب کنید. برای مثال country، فرم رو به شکل زیر پر کنید:
  • توی قسمت Model Class عبارت appmodelsCountry رو بنویسید
  • توی قسمت Search Model Class عبارت appmodelsCountrySearch رو وارد کنید
  • توی قسمت Controller Class عبارت appcontrollersCountryController رو تایپ کنید

[attachment=194]

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

[attachment=195]

اگه قبلاً controllers/CountryController.php و views/country/index.php رو ساخته باشین (توی بخش کار با دیتابیس آموزش)، گزینه Overwrite رو انتخاب کنید تا با کد تولیدشده، رونویسی بشن (کد قبلی تمام قابلیتهای CRUD رو بطور کامل نداشت).

امتحانش کنید
برای اینکه ببینید چطور کار میکنه، از مرورگرتون برای بازکردن آدرس زیر استفاده کنید:
http://hostname/index.php?r=country/index

یه شبکه داده (Data Grid) خواهید دید که کشورهای موجود در دیتابیس داخلش نشون داده میشن. میتونید جدول رو مرتب کنید یا با واردکردن شرطهای مختلف توی کادرهای بالای ستونها، اطلاعات رو فیلتر کنید.

برای هر کشوری که توی گرید نشون داده میشه، میتونید جزئیاتش رو مشاهده کنید، اون رو ویرایش کنید یا حتی حذفش کنید. میتونید حتی با کلیک روی دکمه Create Country توی بالای جدول، یه کشور جدید تعریف کنید.

[attachment=196]

[attachment=197]

فهرست فایلهایی که بطور خودکار توسط Gii تولید شدن رو ببینید تا اگه میخواین بفهمین این قابلیتها چطوری پیاده سازی شدن یا اونها رو سفارشی کنید، بدونید کجا باید دنبالشون بگردین:
  • کنترلر: controllers/CountryController.php
  • مدلها: models/Country.php و models/CountrySearch.php
  • ویوها: views/country/*.php

نقل قول:اطلاعات: Gii طوری طراحی شده که به شدت قابل سفارشی سازی و توسعه است. استفاده هوشمندانه از اون میتونه به میزان زیادی سرعت توسعه برنامه شما رو بالا ببره. برای اطلاعات بیشتر به بخش Gii توی مستندات مراجعه کنید.

جمع بندی
توی این قسمت یاد گرفتین که چطور از Gii برای تولید خودکار کدهایی که قابلیت کامل CRUD رو برای محتوای ذخیره شده توی دیتابیس پیاده سازی میکنن، استفاده کنید.