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

نسخه‌ی کامل: init , boot
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
سلام استاد شهرکی
در آموزش yii2 چنین چیزی رو گفته بودید
class MyController extends Controller
{
    public function init()
    {
        parent::init();
        if(!yii::$app->session->has('cart')) {
            Yii::$app->session->set('cart', []);
        }
    }
}



متد init بلافاصله بعد از اینکه شی ما از کلاس ساخته میشود فراخوانی میشود

حالا باید کلاس های کنترلر ما از این مشتق شوند که این هم خودش از controller مشتق میشود
حالا من میخوام با لاروال چنین کاری بکنم
الان بجای متد init باید از boot استفاده کنم یا چیز دیگه ای ؟
راستش public function boot داخل کنترلر کار نمیکنه . حالا میخوام ببینم راه حل چیه ؟
درمورد لاراول باید توی تالار لاراول سؤالتون رو بپرسین. من لاراول کار نمیکنم. تاپیک رو به تالار لاراول منتقل کردم.
متد Boot داخل مدل ها هست و تو کنترلر نداریم برای این کار می تونید از همون متد سازنده استفاده کنید

public function __construct()
{
   //
}
عین نتیجه قبلی بدست میآید ؟
چون آقای شهرکی هم در آموزش yii2 گفتند میتونید از سازنده استفاده کنید
ولی فرق سازنده با init اینه که init خود بخود اجرا میشه ولی سازنده وقتی اجرا میشه که شیی از آن کلاس ساخته بشه
اشتباه برداشت شده. توی Yii هم متد init بطور خودکار بعد از سازنده فراخوانی میشه. امکان اجرای خودکار کدها بدون ایجاد شئ یا فراخوانی دستی وجود نداره. کاربرد init انجام کارهایی هست که لازمه بعد از ایجاد شئ کنترلر و قبل از هر اکشنی اجرا بشن.

نه Yii و نه هیچ فریمورک دیگری قرار نیست پا رو از چهارچوب زبان PHP فراتر بگذارن.
پس اگر من درست متوجه شده باشم میتونم بجای init از سازنده استفاده کنم
و نتایج بدست آمده عینا شبیه هم هست
درسته ؟
بله میتونین استفاده کنین ولی نتایج عیناً شبیه هم نیست (هرچند ممکنه خیلی شبیه بنظر بیاد). دقت کنید که init بعد از سازنده اجرا میشه یعنی شئ ساخته شده و تنظیماتش بارگذاری شده. یه مثال ساده میزنم:
namespace appcomponents;

use yiibaseComponent;

class Tools extends Components
{
    public $timeZone;

    public function init()
    {
        if (is_null($this->timeZone)) {
            $this->timeZone = 'UTC';
        }
    }
    // ...
}
حالا به نحوه‌ی معرفی و تنظیم این کامپوننت توی فایل تنظیمات config/web.php دقت کنید:

'components' => [
    'tools' => [
        'class' => 'appcomponentsTools',
        'timeZone' => 'Asia/Tehran',
    ],
],

الان با کمک Yii::$app->tools میتونیم به این کامپوننت دسترسی پیدا کنیم و مقداردهی صحیح فیلد $timeZone هم توی متد init (بعد از ایجاد شئ که فایل تنظیمات خونده شده) درصورتی‌که این پارامتر صراحتاً مقداردهی نشده باشه انجام میشه. درواقع این‌کار برای خلوت‌کردن سازنده و تفکیک کارها بوده وگرنه همون نتیجه رو با سازنده هم میشه بدست آورد.