راکت

2 مشکل باحال در ارسال email notification در لاراول

6 پاسخ

سلام و عرض ادب
من 2 تا مشکل جالب توی ارسال ایمیل notification توی لاراول دارم که توضیح میدم اگر کسی بلد بود لطفا راهنمایی کنه

مشکل اول :
وقتی notify را به یک view پاس میدم و توی اون view یک فایل blade مثلا با نام vars.blade.php را include میکنم در زمان ارسال ایمیل اصلا این فایل vars.blade.php را نمیتونه بخونه.

مشکل دوم :
من سیستم ارسال ایمیل را کاملا برای ادمین داینامیک نوشتم و متون تمامی notification ها از طریق پنل مدیریت قابل تغییر هست و اومدم یکسری شورتکد تعریف کردم مثلا %time% که اگر ادمین این شورتکد را توی متن ایمیل بزاره، در زمان ارسال ایمیل مثلا تاریخ اون لحظه را توی متن چاپ میکنه و میفرسته که با str_replace تنظیمش کردم.
خب تا اینجا همه چیز اوکیه

        $text = str_replace(['%time%'],[\Hekmatinasser\Verta\Facades\Verta::instance(now())],$text);

@component('mail::message')
{!! $text !!}
@component('mail::button', ['url' => url('/')])
ورود به سایت
@endcomponent
@endcomponent

حالا مشکل اینجاست که وقتی ادمین شورتکد %user_name% را توی متن میزاره ((که کارش چاپ کردن نام کاربر موردنظر هست )) و در صورتی که به notification مربوطه بگم implements ShouldQueue کن و توی صف ارسال کن اون موقع موقع ارسال خظا میده و میگه که مثلا undefined name property در صورتی که کد زیر به درستی نام کاربر را باید برگردونه ولی متاسفانه خطا میده

        $text = str_replace(['%user_name%'],[\Illuminate\Support\Facades\Auth::user()->name],$text);

حالا من اومدم و توی کنترلر یه روش دیگه زدم و گفتم موقعی که میخوای notify کنی یه session put کن و نام کاربر را بریز تو session و اینجوری هم نوشتم بازم نشد

        $text = str_replace(['%user_name%'],[session('u_iname')],$text);

کلا این کار ظاهرا با مقادیر user خصومت داره انگار 😂😂😂
راه حلی برای این مورد به نظرتون میرسه ؟؟؟؟؟؟؟

ثبت پرسش جدید

پاسخ‌ها

6
نوب
نوب
@yk5742g

تخصص: کدنویس نوب :)

@ali.bayat @hesammousavi @mhyeganeh
سلام دوستان
میشه لطفا مشکل منو بخونین و اگر امکانش هست جواب بدین ؟
سپاس

محسن مهری
محسن مهری
@mohsen.mehri6101

تخصص: برنامه نویس back-end با زبان php framework laravel

درود خطاهات به نحوی نیست که بتونم راهنمایی کنم با dd دقیق بفهم خطا از کجاست.
هر کاری که میخای بکنی توی تابع انجام بده فقط یک سری متغیر پاس بده به فایل blade (هرچند که فایل blade هم یک فایل php و هیچ فرقی نداره
خط کد str_replace ات باید اجرا بشه،پس بزارش توی این علامت
{!! !}

شاید پاسخ شما همین‌جا باشد

نوب
نوب
@yk5742g

تخصص: کدنویس نوب :)

لطفا اگر کسی میتونه مشکلی که گفتم را ببینه و پاسخ بده
تشکر

moha li
moha li
@mohaligateway

تخصص: توسعه دهنده لاراول و Vue

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

php artisan make:mail

بعد داخل پوشه view ها در پوشه email یک view بسازید و از کلاسی که ساخته شده اطلاعات مورد نیاز را به آن پاس دهید.
اگر هم که می خواهید اطلاعات را با پر کردن یک فورم ارسال کنید کافی هست که در پنل مدیریت یک route بسازید با یک controller و اطلاعات را از طریق آن با فراخوانی کلاس mail ارسال کنید.
@yk5742g

نوب
نوب
@yk5742g

تخصص: کدنویس نوب :)

@mohaligateway

سلام عزیز
منم با متدهای لاراول میرم جلو ولی من چون متون ایمیل را برای ادمین سایت کاملا پویا کردم و با شورتکدهایی که تعریف کردم براش میتونه هرجوری دوست داره متون ایمیل ها را تغییر بده
کد من کاملا درست کار میکنه ولی زمانی که ShouldQueue را به کلاس مربوطه پاس میدم اونوقت دیگه نام کاربر را نمیگیره
من الان همه ی کدهامو به ترتیب میزارم ببینین

کلاس ارسال ایمیل برای زمانی که کاربر سطح دسترسیش تغییر میکنه

<?php

namespace App\Notifications;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Notifications\Notification;

class user_change_type extends Notification implements ShouldQueue
{
    use Queueable;

    public $user;

    public function __construct($user)
    {
        // to put order data from controller to mailable
        $this->user = $user;
    }

    public function via($notifiable)
    {
        return ['mail'];
    }

    public function toMail($notifiable)
    {
        return (new MailMessage)
            ->subject('asdasd')
            ->markdown('mails.user_accept_panel',['user' => $this->user]);
    }

    public function toArray($notifiable)
    {
        return [
            //
        ];
    }
}

کنترلر مربوطه هنگام پاس دادن مقادیر

class userController extends Controller
{
    public function update(Request $request, User $user)
    {
        if ($user->role != $request->role) {
            $user->notify(new user_change_type(['user'=>$user]));
        }
    }
}

فایل مربوطه برای تمپلیت ارسال ایمیل

@php
$text = $setting['user_change_type'];
@endphp
@php
    $text = str_replace(['%time%'],[\Hekmatinasser\Verta\Facades\Verta::instance(now())],$text);
    $text = str_replace(['%date%'],[\Hekmatinasser\Verta\Facades\Verta::format('Y-n-j')],$text);
    $text = str_replace(['%dates%'],[\Hekmatinasser\Verta\Facades\Verta::format('%d %B %Y')],$text);
    $text = str_replace(['%just_time%'],[\Hekmatinasser\Verta\Facades\Verta::formatTime()],$text);
    $text = str_replace(['%ip%'],[\Illuminate\Support\Facades\Request::getClientIp(true)],$text);
    $text = str_replace(['%name%'],[$user['name']],$text);

    $text = str_replace(['%title%'],[$setting['title']],$text);
@endphp
@component('mail::message')
{!! $text !!}
@component('mail::button', ['url' => url('/')])
Login to website
@endcomponent
@endcomponent

ببینین توی این فایل الان من اومدم گفتم زمانی که توی متنی که ادمین مینویسه اگر %name% بود بیاد از متغیر $user['name'] نام کاربر را بگیره و توی ایمیل بزاره و ارسال کنه ولی هیچی نمیزاره
حالا من قبلا هم چندین حالت تست کردم که کد زیر در صورتی جواب میده که من به کلاس ایمیل ShouldQueue را پاس ندم و وقتی ShouldQueue را پاس میدم دیگه نام را چاپ نمیکنه

    $text = str_replace(['%name%'],[\Illuminate\Support\Facades\Auth::user()->name],$text);

درایور Queue هم توی env روی database تنظیم کردم.

امیدوارم خوب توضیح داده باشم

moha li
moha li
@mohaligateway

تخصص: توسعه دهنده لاراول و Vue

مشکل احتمالا از درایور Queue هستش به احتمال زیاد. به sync تبدیل کنید ببینید مشکل حل میشه.
@yk5742g

برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام