راه اندازی Queue برای ارسال ایمیل زمان لاگین

- 2 هفته پیش
توسط حسام موسوی آپدیت شد
Sjavadez ( 330 تجربه )
2 هفته پیش

سلام دوستان
میخوام یه queue درست کنم که زمانی کاربر لاگین کرد یه ایمیل به کاربر بفرسته و بگه که با این IP وارد اکانتش شدن (مثل SMSی که سایت راکت میفرسته)
چجوری ای پی کاربر، زمان لاگین و خود کاربر رو به Event و listener و mail برگردونم که تو دیتابیس Queue سیو بشه و وقتی Queue رو ران کردیم ایمیل رو بفرسته و به نظرتون کد زیری که واسه این موضوع نوشتم چه مشکلی داره که Queueم اجرا نمیشه

کدی که ایونت رو صدا میکنه:

event(new LoginLogReport(Auth::user() , Carbon::now() , request()->ip()));

کدی که توی ایونتم نوشتم:

    {
        $this->user = $user;
        $this->time = $time;
        $this->ip = $ip;
    }

کدی که توی لیستنرم نوشتم:

public function __construct(User $user , $time , $ip)
    {
        $this->user = $user;
        $this->time = $time;
        $this->ip = $ip;
    }
public function handle($event)
    {
        Mail::to($event->user())->send(new \App\Mail\LoginEmail($event->user , $event->time));
    }

کدی که تو کلاس ایمیلم نوشتم:

public function __construct(User $user , $time,$ip)
{
$this->user = $user;
$this->time = $time;
$this->ip = $ip;
}

نمی دونم چرا کدای بالا کار نمیکنن، اروری هم نمیده.

حسام موسوی ( 123814 تجربه )
2 هفته پیش

سلام اول اینکه آیا از اینترفیس Queue استفاده کردید اصلا ؟

Sjavadez ( 330 تجربه )
2 هفته پیش

سلام
بله
ایونتم رو اینجوری تعریف کردم :

class SendLoginLogEmail implements ShouldQueue

امروز دوباره کد رو چک کردم و این سری این ارور رو برام میاره :

Unresolvable dependency resolving [Parameter #1 [ <required> $time ]] in class AppListenersSendLoginLogEmail

حسام موسوی ( 123814 تجربه )
2 هفته پیش

@ezazsje
اگر دقت کنید میگه پارامتر $time در کلاس AppListenersSendLoginLogEmail الزامیه و ارسال نمیشه یا اشتباه ارسال میشه این مورد رو چک کنید و حتما مطمئن بشید همه پارامترها درسته

Sjavadez ( 330 تجربه )
2 هفته پیش

@hesammousavi
کلاس AppListenersSendLoginLogEmail رو دوباره چک کردم و $time رو توی کانسترکتش گرفتم.

من اومدم توی تریت AuthenticatesUsers متد authenticated رو بصورت زیر تغییر دادم و هرسه تا پارامتر user و time و ip رو بهش پاس دادم:

protected function authenticated(Request $request, $user)
    {
        $carbon = new Carbon;
        event(new LoginLogReport(Auth::user() , $carbon->now() , request()->ip()));
    }

توی listener هم اومدم این سه تا متغیر رو به توی ارگومان متد send کلاس Mail گذاشتم :

public function handle($event)
    {
        Mail::to($event->user())->send(new \App\Mail\LoginEmail($event->user , $event->time , $event->ip));
    }

کانسترکت ایونت هم این سه تا رو به ترتیب میگیره :

public function __construct(User $user , $time , $ip )
    {
        $this->user = $user;
        $this->time = $time;
        $this->ip = $ip;
    }
حسام موسوی ( 123814 تجربه )
2 هفته پیش

ارور زیر رو مطالعه کنید

[Parameter #۱ [ <required> $time ]] in class AppListenersSendLoginLogEmail

میگه پارامتر time لازمه حالا انقدر جدا جدا کدتون رو قرار دادید نمیشه متوجه شد برای کدوم کلاس ها هست .

برای ارسال پاسخ باید وارد سایت شوید