تایید ایمیل در لاراول

‏  9 دقیقه
۲۴ آذر ۱۳۹۹
تایید ایمیل در لاراول

استفاده از ایمیل برای احراز هویت کاربران در وب اپلیکیشن‌ها، امری رایج است. کاربران باید ایمیل‌هایی که هنگام ثبت نام وارد کرده‌اند را تایید کنند، سپس اجازه پیدا می‌کنند به بخش‌های مختلف اپلیکیشن دسترسی داشته باشند. معمولا پیاده‌سازی فرایند تایید ایمیل کاربران، در اکثر وب اپلیکیشن‌ها تکرار می‌شود و از این رو، برای توسعه‌دهندگان، کاری خسته‌کننده است. اما نحوه‌ی تایید ایمیل در لاراول می‌تواند بسیار ساده‌تر باشد. لاراول، این امکان را برای شما فراهم می‌آورد تا با استفاده از کلاس‌های پیش‌فرضی که در این فریمورک تعریف شده است، این فرایند خسته‌کننده، به راحتی و بدون دردسرهای معمول انجام شود. پس تا انتهای این مقاله با ما همراه باشید تا نحوه‌ی تایید ایمیل در لاراول را برای شما تشریح کنیم.

فهرست محتوای این مقاله

نیازمندی‌های اولیه

برای شروع آموزش تایید ایمیل در لاراول، به دانش کافی در زمینه‌ی لاراول نیاز دارید.

نصب لاراول

به پوشه‌ی دلخواه خود بروید و دستور زیر را برای نصب لاراول اجرا کنید:

composer create-project --prefer-dist laravel/laravel blog

با دستور زیر می‌توانید پروژه را اجرا کنید:

php artisan serve

پس از اجرای این دستور، پروژه بر روی پورت 8000 لوکال هاست در دسترس است. با وارد کردن آدرس http://localhost:8000 در نوار آدرس مرورگر، با این صفحه مواجه می‌شوید:

تایید ایمیل در لاراول

آماده‌سازی دیتابیس

قدم بعدی، برقراری ارتباط با دیتابیس است. ابتدا یک دیتابیس دلخواه را ایجاد کنید و سپس مقادیر متغیرهای زیر را در فایل env. پروژه به‌روز کنید:

DB_DATABASE=example
DB_USERNAME=root
DB_PASSWORD=

مطمئن شوید که جدول Users یک ستون با نام email_verified_at برای ذخیره‌ی تاریخ و زمان تایید ایمیل کاربر، داشته باشد. به‌طور پیش‌فرض، Migration جدول Users موجود در فریمورک لاراول، واجد این ستون است.

آماده‌سازی مدل

ابتدا مطمئن شوید که مدل User، قرارداد MustVerifyEmail را Implement می‌کند:

<?php

namespace App\Models;

use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class User extends Authenticatable implements MustVerifyEmail
{
    use Notifiable;

    // ...
}

زمانی که این اینترفیس به مدل User اضافه شد، یک ایمیل حاوی لینک تایید، به‌طور خودکار، پس از ثبت نام، برای کاربران ارسال می‌شود. اگر EventServiceProvider در مسیر app/Providers را مشاهده کنید، می‌بینید که لاراول یک Listener با نام SendEmailVerificationNotification را به Event با نام Registered متصل کرده است. این Event و Listener، وظیفه‌ی ارسال لینک تایید ایمیل را به کاربر، بر عهده دارند.

مسیرها

اکنون نوبت آن فرا رسیده که مسیرهای موردنظرمان را در فایل web.php در پوشه‌ی routes تعریف کنیم.

ثبت نام

مسیرهای مربوط به نمایش صفحه و ارسال فرم ثبت نام را به شکل زیر تعریف کنید:

use App\Http\Controllers\RegisterController;
use Illuminate\Support\Facades\Route;

Route::get('/register', [RegisterController::class, 'register'])
                ->middleware('guest')
                ->name('register');

Route::post('/register', [RegisterController::class, 'create'])
                ->middleware('guest');

تایید ایمیل

برای اجرای مناسب فرآیند تایید ایمیل، سه مسیر موردنیاز است. در ابتدا، یک مسیر نیاز داریم تا یک پیام را به کاربر نشان دهد. این پیام به کاربر می‌گوید که باید با مراجعه به آدرس ایمیل خود، بر روی لینک تایید ایمیل، کلیک کند. سپس مسیری موردنیاز است تا درخواست‌های کاربران را پس از کلیک بر روی لینک تایید ایمیل، مدیریت کند و یک مسیر دیگر برای ارسال مجدد لینک تایید ایمیل، اگر کاربر به‌طور اتفاقی، لینک اولیه را از دست بدهد. به این صورت:

use App\Http\Controllers\Auth\VerifyEmailController;
use Illuminate\Support\Facades\Route;

Route::get('/email/verify', [VerifyEmailController::class, 'show'])
                ->middleware('auth')
                ->name('verification.notice');

Route::get('/email/verify/{id}/{hash}', [VerifyEmailController::class, 'verfiy'])
                ->middleware(['auth', 'signed', 'throttle:6,1'])
                ->name('verification.verify');

Route::post('/email/verification-notification', [VerifyEmailController::class, 'notify'])
                ->middleware(['auth', 'throttle:6,1'])
                ->name('verification.send');

مسیری که صفحه‌ی حاوی پیام مراجعه به ایمیل را برای کاربر نمایش می‌دهد، باید نام verification.notice را داشته باشد. این مساله از آن جهت اهمیت دارد که Middleware با نام verified که به صورت پیش‌فرض در لاراول تعریف شده، کاربرانی را که آدرس ایمیلشان تایید نشده، به صورت خودکار به صفحه‌ای با این نام هدایت می‌کند.

نام مسیری که درخواست‌های کاربران را پس از کلیک بر روی لینک تایید ایمیل، مدیریت می‌کند نیز باید verification.verify باشد و Middleware‌های auth و signed به آن اختصاص یابد.

کنترلر ثبت نام

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

php artisan make:controller RegisterController

اکنون متد ()register و ()create را در آن، تعریف کنید:

<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use App\Models\User;
use App\Providers\RouteServiceProvider;
use Illuminate\Auth\Events\Registered;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;

class RegisterController extends Controller
{
    /**
     * Display the registration view.
     *
     * @return \Illuminate\View\View
     */
    public function register()
    {
        return view('auth.register');
    }

    /**
     * Handle an incoming registration request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\RedirectResponse
     *
     * @throws \Illuminate\Validation\ValidationException
     */
    public function create(Request $request)
    {
        $request->validate([
            'name' => 'required|string|max:255',
            'email' => 'required|string|email|max:255|unique:users',
            'password' => 'required|string|confirmed|min:8',
        ]);

        Auth::login($user = User::create([
            'name' => $request->name,
            'email' => $request->email,
            'password' => Hash::make($request->password),
        ]));

        event(new Registered($user));

        return redirect(RouteServiceProvider::HOME);
    }
}

همان‌طور که می‌بینید، پس از انجام ثبت نام موفقیت‌آمیز کاربر در کنترلر، باید Event با نام Registered را ارسال کنیم.

کنترلر تایید ایمیل

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

php artisan make:controller VerifyEmailController

متد show

همان‌طور که بالاتر اشاره شد، یک مسیر تعریف کردیم که با نمایش یک صفحه، به کاربر اطلاع دهد که باید با مراجعه به آدرس ایمیلی که هنگام ثبت نام وارد کرده، بر روی لینک تایید ایمیل، کلیک کند. این صفحه، زمانی که کاربران بدون تایید ایمیل خود، بخواهند به سایر بخش‌های اپلیکیشن دسترسی داشته باشند، باید نمایش داده شود. به خاطر داشته باشید که ایمیل حاوی لینک تایید، تا زمانی که مدل User قرارداد MustVerifyEmail را Implement کرده باشد، به صورت خودکار برای کاربران ارسال خواهد شد.

public function show(Request $request)
{
    return view('auth.verify-email');
}

متد verify

اکنون باید متدی را که درخواست‌های کاربران را پس از کلیک بر روی لینک تایید ایمیل، مدیریت می‌کند، ایجاد کنیم. نام این مسیر باید verification.verify باشد و Middleware‌های auth و signed به آن اختصاص یابد:

use Illuminate\Foundation\Auth\EmailVerificationRequest;

public function verify(EmailVerificationRequest $request)
{
   $request->fulfill();
   return redirect('/home');   
}

قبل از ادامه‌ی مقاله، می‌خواهیم نگاه دقیق‌تری به این متد داشته باشیم. همان‌طور که می‌بینید، به جای یک نمونه از کلاس Illuminate\Http\Request از کلاس EmailVerificationRequest استفاده می‌کنیم. این کلاس، یک Form Request است که به طور پیش‌فرض در لاراول وجود دارد. From Request‌ها را برای اعتبارسنجی درخواست‌های کاربر، با استفاده از دستور make:request، ایجاد می‌کنیم. کلاس EmailVerificationRequest، به‌طور خودکار، اعتبارسنجی پارامترهای id و hash موجود در درخواست را مدیریت می‌کند.

سپس، متد fulfill را بر روی درخواست صدا می‌زنیم. این متد، متد markEmailAsVerified را بر روی کاربر تایید شده صدا می‌زند و Event با نام Verified را ارسال می‌کند. پس از آن که ایمیل کاربر تایید شد، می‌توانید آن‌ها را به هر مسیری که می‌خواهید، هدایت کنید.

متد notify

گاهی اوقات ممکن است کاربر به طور اتفاقی، ایمیل تایید را حذف یا گم کند. برای رفع این مشکل، یک متد ایجاد می‌کنیم تا لینک تایید ایمیل را دوباره به آدرس ایمیل کاربر ارسال کند. می‌توانید با قرار دادن یک دکمه‌ی ارسال فرم در صفحه‌ی حاوی پیام مراجعه به ایمیل، به کاربر اجازه دهید درخواست خود را به مسیری که به این متد متصل شده، ارسال کند:

use Illuminate\Http\Request;

public function notify(Request $request)
{
    $request->user()->sendEmailVerificationNotification();

    return back()->with('message', 'Verification link sent!');
}

استفاده از Middleware

می‌توانیم برای محدودیت دسترسی کاربرانی که ایمیل آن‌ها تایید نشده، از Middleware در مسیرهای موردنظرمان استفاده کنیم. به طور پیش‌فرض Middleware با نام verified در لاراول وجود دارد که در واقع، به کلاس Illuminate\Auth\Middleware\EnsureEmailIsVerified اشاره دارد. از آن‌جایی که این Middleware در فایل kernel در مسیر app/Http، به طور پیش‌فرض ثبت شده است، فقط کافی است که از آن، در مسیرهای موردنظر خود استفاده کنید:

Route::get('/profile', function () {
    // Only verified users may access this route...
})->middleware('verified');

در مثال فوق، فقط کاربرانی که ایمیل آن‌ها تایید شده، می‌توانند به این مسیر دسترسی داشته باشند. اگر کاربری که ایمیلش تایید نشده، بخواهد به مسیر فوق دسترسی یابد، به طور خودکار به مسیری که نامش verification.notice است، هدایت می‌شود.

Listener‌های دلخواه

می‌توانید Listener‌های دلخواهتان را به Event‌هایی که در بالا اشاره کردیم، متصل کنید. این کار را در فایل EventServiceProvider انجام دهید.

/**
 * The event listener mappings for the application.
 *
 * @var array
 */
protected $listen = [
    'Illuminate\Auth\Events\Verified' => [
        'App\Listeners\LogVerifiedUser',
    ],
];

جمع بندی:

در این سری از مجموعه مقالات آموزش لاراول، به صورت عملی، نحوه‌ی تایید ایمیل در لاراول را آموختیم و دیدیم که لاراول می‌تواند این فرآیند تکراری و خسته‌کننده را برای ما بسیار ساده‌تر کند. لاراول این کار را به وسیله‌ی Event‌ها و Middleware‌های پیش‌فرضی که در نظر گرفته، انجام می‌دهد. هم‌چنین، در لاراول 8، با استفاده از پکیج Laravel/breeze می‌توانید کل فرآیند احراز هویت و تایید ایمیل و شماره تماس را به صورت یکجا و آماده در اختیار داشته باشید. این پکیج تمامی کنترلرها و مسیرها و حتی View‌ها را در قالب پکیج در اختیار شما قرار می‌دهد. امیدواریم توانسته باشیم مقاله‌ی مفیدی را در زمینه‌ی تایید ایمیل در لاراول، در اختیار توسعه‌دهندگان لاراول قرار دهیم.

خوشحال می‌شویم نظرات، تجربیات و سوالات خود را با ما و سایر کاربران سون لرن به اشتراک بگذارید.

اگر به یادگیری بیشتر لاراول علاقه داری می‌توانی در دوره آموزشی لاراول کاربردی (بسته پروژه محور) شرکت کنی، این دوره شامل ۱۲ پروژه کاربردی و پر استفاده در دنیای واقعی است، که تمامی پروژه‌ها به صورت کامل برنامه‌ نویسی خواهند شد، تا دانشجو بتواند با روند ایجاد و تکمیل پروژه به صورت کامل آشنا شود.

چه امتیازی به این مقاله می دید؟
نویسنده رضا زیدی
از یادگیری ، عمل‌گرایی و چالش‌های مربوطه ، لذت می‌برم ...
ارسال دیدگاه
خوشحال میشیم دیدگاه و یا تجربیات خودتون رو با ما در میون بذارید :

 

نظرات کاربران

اولین دیدگاه این پست رو تو بنویس !

ما در سون لرن با محدودسازی دسترسی آزاد به اینترنت مخالفیم     اطلاعات بیشتر