💻 آخرین فرصت یادگیری برنامه‌نویسی با آفر ویژه قبل از افزایش قیمت در ۵ آذر ماه (🎁 به همراه یک هدیه ارزشمند )
۰ ثانیه
۰ دقیقه
۰ ساعت
۲ مهدی کریمیان
عدم ایجاد URL
محمدرسول اصغری حل شده توسط محمدرسول اصغری

سلام وقت بخیر
در قسمت MagicAuthentication وقتی متد send  رو صدا میزنم روی createToken نال برمیگردونه، تلاش کردم متوجهش بشم و موفق نشدم، لطفا راهنمایی بفرمایید .

<?php
namespace App\Services\Auth;
use App\Jobs\SendEmail;
use App\Mail\SendMagicLink;
use App\Models\User;
use App\Models\LoginToken;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class MagicAuthentication
{
    protected $request;
    public function __construct(Request $request)
    {
        $this->request = $request;
    }
    public function requestLink()
    {
        $user = $this->getUser();
        $token = $user->createToken()->send([
            'remember' => $this->request->has('remember')
        ]);
        dd($token);
    }
    protected function getUser()
    {
        return User::where('email', $this->request->email)->firstOrFail();
    }
}
<?php
namespace App\Mail;
use App\Models\LoginToken;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Mail\Mailables\Content;
use Illuminate\Mail\Mailables\Envelope;
use Illuminate\Queue\SerializesModels;
class SendMagicLink extends Mailable
{
    use Queueable, SerializesModels;
    private $token;
    private $options;
    /**
     * Create a new message instance.
     */
    public function __construct(LoginToken $token, array $options)
    {
        $this->token = $token;
        $this->options = $options;
    }
    /**
     * Get the message envelope.
     */
    public function envelope(): Envelope
    {
        return new Envelope(
            subject: 'Send Magic Link',
        );
    }
    /**
     * Get the message content definition.
     */
    public function content(): Content
    {
        dd($this->buildLink());
        return new Content(
            markdown: 'email.magic.link',
            with: [
                'link' => $this->buildLink()
            ]
        );
        /*return $this->markdown('email.magic.link')->with([
            'link' => $this->buildLink()
        ]);*/
    }
    protected function buildLink()
    {
        return route('auth.magic.login', [
                'token' => $this->token
            ] + $this->options);
    }
    /**
     * Get the attachments for the message.
     *
     * @return array<int, \Illuminate\Mail\Mailables\Attachment>
     */
    public function attachments(): array
    {
        return [];
    }
}
<?php
namespace App\Models;
use App\Jobs\SendEmail;
use App\Mail\SendMagicLink;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Bus;
class LoginToken extends Model
{
    /*use HasFactory;*/
    protected $fillable = [
        'token'
    ];
    public function user()
    {
        return $this->belongsTo(User::class);
    }
    public function send(array $options)
    {
         SendEmail::dispatch($this->user, new SendMagicLink($this, $options));
        /*$job = new SendEmail($this->user(), new SendMagicLink($this, $options));
        Bus::dispatchNow($job);*/
    }
}

درود مهدی عزیز

بابت تاخیری که توی پاسخگویی به این تاپیک افتاده عذر خواهم

 


کدتون رو من بررسی کردم،  نظر می‌رسه مشکل شما به خاطر نحوه استفاده از متد createToken در کلاس MagicAuthentication هست. در کد فعلی تون، متد createToken  مستقیماً روی مدل User فراخوانی شده است، ولی کدی که در کلاس LoginToken قرار دادید،  متد createToken رو توی در مدل User تعریف نکرده یا اینکه این متد به شکلی که شما انتظار دارید  عمل نمیکنه.


‫برای حل این مشکل، شما باید ابتدا یک توکن جدید ایجاد کنید برای کاربرتون، بعد این توکن رو از طریق ایمیل برای کاربر ارسال کنید.  اینجا یک روش جایگزین برای دیباگ کد requestLink در کلاس MagicAuthentication براتون قرار میدم:‬

public function requestLink()
{
    $user = $this->getUser();
    ‫    // ایجاد یک توکن جدید برای کاربر‬
    $token = LoginToken::create([
        'user_id' => $user->id,
        'token' => Str::random(60),
    ]);
    $token->send([
        'remember' => $this->request->has('remember')
    ]);
    dd($token);
}
‬
‫‬


‫توجه داشته باشید که توی این روش، ما اول یک شی جدید از LoginToken ایجاد می‌کنیم و اون رو با استفاده از متد create به دیتابیس اضافه می‌کنیم. سپس، با استفاده از این توکن جدید، ایمیل حاوی لینک ورود را برای کاربر ارسال می‌کنیم.‬
‫‬
‫لطفاً مطمئن شوید که در مدل User و LoginToken روابط و متدهای لازم برای استفاده از این عملیات به درستی تعریف شده‌اند.
‫‬
‫امیدوارم این توضیحات به شما کمک بکنه  که  این مشکل رو حل کنید.

 

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

 

موفق باشید

بهترین پاسخ
محمدرسول اصغری ۲۸ فروردین ۱۴۰۳، ۱۵:۴۱

میتونید از متد create token هم یک dd بگیرید و متوجه بشید که ایا توکن ایجاد میشود یا خیر 

مرحله به مرحله با dd گرفتن به راحتی میتونید مشکلتون رو برطرف بکنید

محمدرسول اصغری ۲۸ فروردین ۱۴۰۳، ۱۵:۵۰