آموزش Yii بخش های مختلف حرفه ای قسمت ششم

در قسمت قبلی آموزش به نحوه ی ارتباط لایه کنترلر با لایه نمایش آشنا شدیم، اکنون باید کدهای داخل کلاس SiteController را بررسی کنیم و ببینیم که با صدرو هر فرمان از سمت کاربر چه کدهای اجرا می شود، ما چند خط کد اول فایل مورد نظر را بررسی کردیم و اکنون وقت بررسی توابع action کلاس می باشد. اگر یه تابع اول از این کلاس یعنی  behaviors وfilters و actions را رها کنیم به متد actionIndex می رسیم کد درون این متد به این صورت می باشد:

public function actionIndex()
    {
        return $this->render('index');
    }

معادل نام کنش index فایلی به همین نام با پسوند PHP در پوشه views/site/ وجود دارد، دستور زیر در داخل متد بیان می کند که باید فایل index را ترجمه و اجرا کند و نهایتا هم توسط دستور return آن را برای نمایش در صفحه پاس می دهد.

$this->render('index');

پس دقت کنید که به جای نام index می توانید نام فایل لایه نمایش و قابل اجرا را تخصیص دهید تا متد render از کلاس controller ($this در اینجا به کلاس controller اصلی Yii اشاره دارد)آن را ترجمه و کامپایل و نتیجه را چاپ کند.

کنش بعد که مربوط به رویداد login می باشد بدین شکل است:

    public function actionLogin()
    {
        if (!\Yii::$app->user->isGuest) {
            $this->goHome();
        }
        $model = new LoginForm();
        if ($model->load($_POST) && $model->login()) {
            return $this->goBack();
        } else {
            return $this->render('login', [
                'model' => $model,
            ]);
        }
    }

سناریو کار این متد به این صورت است که اگر کاربر اصلا login نکرده باشد صفحه login با کادر های درون آن صفحه برای او نمایش داده می شود، همچنین اگر توجه کنید علاوه بر این که دستور

$this->render('login')

نوشته شده است مقدار دیگری را به عنوان پارامتر به داخل متد داده است و معنی آن هم این است که یک نمونه از کلاس مدل به سمت لایه نمایش پاس داده می شود تا با استفاده از آن به بررسی اطلاعات کادر های ورودی توسط کاربر انجام گیرد هم چنین اگر کاربر کادرهای نام کاربری و پسورد را وارد کند و دکمه submit مربوط به login را فشرده باشد در شرط نوشته شده بررسی می گردد که نام کاربری و پسورد درست باشد و در صورت صحت عمل ورود یا همان Login اتفاق می افتد و به آخرین جای که  قبلا کاربر در آن بوده است redirct می شود، در شرط ابتدای متد نیز بررسی می گردد اگر کاربر یکبار Login کرده است و به عبارتی مهمان نیست به صفحه home یا همان  index، redirect کند، توجه کنید در حالت پیش فرض برای login کرد به پروژه می توانید از نام کاربری و پسور admin، admin یا  demo، demo استفاده کنید(البته بعدها یاد خواهیم گرفت که می توانیم در این بخش نام کاربری و پسوردها را از بانک اطلاعاتی بخوانیم و در صورت صحت آنها عمل ورود را انجام دهیم)

این کنش با لایه مدل ارتباط دارد، اگر توجه کنید در دستور بعد از شرط ابتدای متد، ازکلاس LoginForm یک نمونه جدید ایجاد گردیده است، این که می بینیم کلاس LoginForm قابل دسترس بوده و هیچ دستوری مبتنی بر include یا require در این صفحه وجود ندارد را مدیون صدا کردن namespace model (use app\models\LoginForm) در بالای این صفحه می باشیم.

اما ببینیم در داخل شرط دوم از متد چه اتفاقاتی انجام میگیرد و توابع مربوط به کلاس LoginForm دقیقا چه کاری را انجام می دهد. همانطور که می بینیم تابع login از کلاس LoginForm صدا زده شده است و در داخل شرط قید شده است که اگر این تابع مقدار True را برگرداند عمل login را انجام دهد.

قبل این اینکه تابع login را بررسی کنیم باید یه قرار دادی را تعریف کنیم و این است که در Yii هر صفحه ای که قرار است از کاربر بیرونی اطلاعاتی را در قالب کادر عددی یا متنی یا … بگیرد، باید قبل از انجام هرگونه عملی رو اطلاعات ورودی از یک فیلترهای رد شود (که این به این عمل validate کردن می گوییم و برای انجام این کار یا باید توابعی را در کلاس مدل بنویسیم یا از طریق نوشتن قوانی خود Yii که خود یک آرایه است ،نوع بررسی برای هر ورودی آن را چک کنیم)مثلا چک شود اگر قرار است کاربر email وارد کند حتما فرمت مربوط به ایمیل را رعایت کند یا مثلا تعداد کاراکتر ورودی یا حتی عملیات مربوط به امنیت مثل injection های مختلف باید بررسی گردد، و راهکار Yii برای این کار که راه حل می باشد:

در راه حل اول Yii برای انجام کارهایی که قرار است فقط مقداری را بگیرد و قرار نیست چیزی در بانک اطلاعاتی درج شود پیشنهاد استفاده ازmodel  Form ها را می دهد و در راه حل دوم اگر قرار است مقادیری از کاربر گرفته شود و در بانک داده ذخیره گردد باید از active record استفاده گردد.

در لایه مدل مربوط به ورود کاربران این پروژه هم چون قرار نیست مقداری از بانک خوانده یا در آن نوشته شود از Form استفاده گردیده است و اگر به کد های مربوط به متد login در کلاس LoginForm نگاهی بیاندازید می بینید که در داخل آن بررسی گردیده است اگر کاربر کادر ها را وارد کرده است و در واقع عمل validate انجام گردیده است و نام کاربری و پسورد درست است cookie را برای یک زمان مشخص، ست می کند.

البته در ادامه آموزش درمورد لایه مدل بحث خواهی کرد.

کنش بعدی مربوط به رویداد Logout  می باشد که بدین شکل نوشته شده است و نیازی به توضیح خاصی نیست:

    public function actionLogout()
}
        Yii::$app->user->logout();
        return $this->goHome();
{

کنش بعدی مربوط به contact می باشد:

   public function actionContact()
    {
        $model = new ContactForm;
        if ($model->load($_POST) && $model->contact(Yii::$app->params['adminEmail'])) {
            Yii::$app->session->setFlash('contactFormSubmitted');
            return $this->refresh();
        } else {
            return $this->render('contact', [
                'model' => $model,
            ]);
        }
    }

سناریو کار این کنش به این صورت می باشد که اگر کاربر کادرهای مربوط به ورود اطلاعات را وارد نکرده باشد، صفحه ورود اطلاعات برای او نمایش داده می شود، توجه کنید که در این کنش نیز مانند کنش مربوط به login یک نمونه از کلاس ContactForm به نام model به لایه نمایش پاس داده شده است، اگر کاربر اطلاعات کادر را وارد کرده باشد در صورت تنظیم بودن SMTP مربوط به ایمیل، یک ایمیل برای کاربر ارسال می گردد و همچنین پیغام تشکر نیز توسط دستور

 Yii::$app->session->setFlash('contactFormSubmitted');

در صفحه نمایش داده می شود، به تصویر توجه کنید:

میدونم نتیجه کار واقعا خوشحال کننده شد

ادامه میدیم

کنش بعد نیز صفحه about  را ترجمه کرده و نمایش می دهد:

    public function actionAbout()
    {
        return $this->render('about');
    }

بسیار خوب، ما اکنون و نحوه کار هر سه لایه مدل MVC پی بردیم، اما بیاید چند نکته کوچک را در قالب یک تمرین ببینیم.

اولین نکته این است که ما فهمیدیم چگونه مقداری را از لایه کنترلر به لایه نمایش پاس دهیم مثل دستور زیر در بالا:

    return $this->render('contact', [
                'model' => $model,
            ]);

این دستور علاوه بر این که فایل contact.php را صدا می زند در آرگومان دوم خود در قالب یک آرایه عنصری به نام model که حاوی Object ای از نوع ContactForm است را به سمت لایه مدل می برد، اگر به صفحه contac.php در لایه مدل بروی خواهیم دید که متغیری به نام model آنجا استفاده گردیده است.

به تصویر توجه کنید:

بسیار خوب بیاید با یک مثال عالی یک تمرین انجام دهیم تا با پاس دادن مقدار بین لایه ها آشنا شویم، اگر یادتان باشد در قسمت قبلی آموزش من کنترلری به نام HomeController ساختم و کنشی به نام test را آن اضافه کردم، اکنون می خواهم مثلا یکه جمله را از کنترلر به نمایش پاس بدهم به تصویر توجه کنید:

همانطور که مشاهده می کنید برای پاس داده یک مقدار از کنترلر به نمایش به سادگی با این قانون وجود دارد: اول باید یک آرایه ایجاد و آن را به عنوان آرگمان دوم به متد render کلاس تخصیص دهید در گام دوم باید یک خانه از آرایه را ایجاد کنید و برای آن نامی تعیین کنید، توجه کنید نیازی نیست نام متغییر شما  با کاراکتر $ (دلار) شروع شود، زیرا خود Yii آن را به تابع extract در PHP پاس می دهید و متغیر ها را می سازد، در گام سوم نیز می توانید مقداری را در آن خانه آرایه ریخته که می تواند خود یه رشته یا عدد یا object باشد و به سمت لایه نمایش پاس دهید، توجه کنید در لایه نمایش نیز به همان نامی که در آرایه مشخص کردید یک متغییر تعریف می شود و می تواند از مقادیر داخل آن استفاده کنید، به مثال دوم نیز توجه کنید.

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

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

برای انجام این کار سه گام اصلی وجود دارد:

اول باید کلاسی ایجاد کنید و از کلاس Action خود Yii برای آن extened بگیرید

دوم باید تابعی به نام run در داخل آن تعریف کنید و در داخل آن کارهایی که قرار است کنش انجام دهد را مانند قبل بنویسید.

سوم کنش را به کلاس کنترلر مورد نظر در متد actions مربوط به هر کنترلر برای آن تعریف کنید.

به تصاویر توجه کنید:

به بزرگی و کوچکی اسم گذاری نام فایل ها و کلاس ها بسیار دقت کنید چون خود یک قانون می باشد همچنین به نحوهی نام گذاری مربوط به namespace ها و همچنین صدا کردن آن در کنترلر نیز بسیار دقت کنید، اگر توجه کنید من متغییر به نام $me را از داخل کلاس کنترلر مقدار دهی کردم و در کلاس HelloAction آن را چاپ کردم که خود نمایش دهنده ی نحوه ی انتقال مقادیر بین کنش ها و کنترلر می باشد پس نحوه ی تعریف و نحوه صدا زدن آن حائز اهمیت می باشد، به اجرا نیز توجه کنید.

خوب اینا این قسمت هم به پایان رسید در بخش بعدی آموزش به بررسی کدهای لایه مدل و نمایش می پردازیم، همچنین آموزش کار با ابزار پرقدرت Gii را آغاز خواهیم کرد.

نمونه ای از آخرین کارهای ما

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

اگر ربات نیستی جواب بده *

پشتیبانی سایت سئو سایت

خدمات سایت

سئو

خدمات سایت

پشتیبانی سایت سئو سایت خدمات سایت