رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
init , boot
#1
سلام استاد شهرکی
در آموزش 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 داخل کنترلر کار نمیکنه . حالا میخوام ببینم راه حل چیه ؟
انگار که نیستی ، چو هستی خوش باش
حکیم عمر خیام
پاسخ
تشکر شده توسط:
#2
درمورد لاراول باید توی تالار لاراول سؤالتون رو بپرسین. من لاراول کار نمیکنم. تاپیک رو به تالار لاراول منتقل کردم.
پاسخ
تشکر شده توسط:
#3
متد Boot داخل مدل ها هست و تو کنترلر نداریم برای این کار می تونید از همون متد سازنده استفاده کنید

public function __construct()
{
   //
}
موفقیت، نتیجه تشخیص درست است؛ تشخیص درست، نتیجه تجربه است؛ تجربه نیز اغلب نتیجه تشخیص نادرست است.



پاسخ
تشکر شده توسط: tabesh
#4
عین نتیجه قبلی بدست میآید ؟
چون آقای شهرکی هم در آموزش yii2 گفتند میتونید از سازنده استفاده کنید
ولی فرق سازنده با init اینه که init خود بخود اجرا میشه ولی سازنده وقتی اجرا میشه که شیی از آن کلاس ساخته بشه
انگار که نیستی ، چو هستی خوش باش
حکیم عمر خیام
پاسخ
تشکر شده توسط:
#5
اشتباه برداشت شده. توی Yii هم متد init بطور خودکار بعد از سازنده فراخوانی میشه. امکان اجرای خودکار کدها بدون ایجاد شئ یا فراخوانی دستی وجود نداره. کاربرد init انجام کارهایی هست که لازمه بعد از ایجاد شئ کنترلر و قبل از هر اکشنی اجرا بشن.

نه Yii و نه هیچ فریمورک دیگری قرار نیست پا رو از چهارچوب زبان PHP فراتر بگذارن.
پاسخ
تشکر شده توسط: meysam1366 , tabesh , hamo
#6
پس اگر من درست متوجه شده باشم میتونم بجای init از سازنده استفاده کنم
و نتایج بدست آمده عینا شبیه هم هست
درسته ؟
انگار که نیستی ، چو هستی خوش باش
حکیم عمر خیام
پاسخ
تشکر شده توسط:
#7
بله میتونین استفاده کنین ولی نتایج عیناً شبیه هم نیست (هرچند ممکنه خیلی شبیه بنظر بیاد). دقت کنید که init بعد از سازنده اجرا میشه یعنی شئ ساخته شده و تنظیماتش بارگذاری شده. یه مثال ساده میزنم:
namespace app\components;

use yii\base\Component;

class Tools extends Components
{
    public $timeZone;

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

'components' => [
    'tools' => [
        'class' => 'app\components\Tools',
        'timeZone' => 'Asia/Tehran',
    ],
],

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




کاربران در حال بازدید این موضوع: 1 مهمان