آموزش مقدماتی لاراول - ساخت فرم تماس با ما 

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


اولین چیزی که لازم داریم نمایش و ظاهر فرمه برای دسترسی به فرم باید مسیر رو تعریف کنیم. ما پیش از این با دستور view  فایل blade تماس باما رو آدرس‌دهی کرده بودیم که هنوز هم کار می‌کنه. ولی اگر بخوایم ساختار RESTful رو داشته باشیم از داخل کنترلر اینکار رو باید انجام بدیم. بعد ایجاد کنترلر و ساخت تابع دسترسی  به فرم، میریم سروقت ظاهر فرم

php artisan make:controller ContactController

فرم هم بصورت زیر طراحی می‌کنیم مشابه فرم‌هایی که در جاسه قبل کار کردیمه فقط تنها نکتش مسیری هست که درخواست فرم قراره ارسال بشه.

Image for post
Image for post

یکی از قابلیت‌هایی که در لاراول وجود داره اختصاص یک نام به هر مسیر هست و فراخوانی این نام که با تابع کمکی route انجام میشه! برای نمونه بیاید بریم سر وقت مسیر که درخواست ارسال ایمیل رو می‌خواهیم از طریق اون بفرستیم:

Route::post('contact', [ContactController::class, 'store'])->name('contact.store');

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

php artisan r:l
Image for post
Image for post

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

Route::resource('contact', ContactController::class)->only(['store', 'create']);

خب برای ارسال ایمیل در لاراول یک api داخلی بسیار ساده و سبک که بر پایه کتابخانه SwiftMailer ساخته شده وجود داره که با کمک اون می‌تونیم عملیات ارسال ایمیل رو پیاده‌سازی کنیم. به دستور artisan مربوطه برمی‌گردیم و با دستور زیر کلاس Mail رو ایجاد می‌کنیم:

php artisan make:mail ContactFormMail --markdown=emails.contact.contact-form

گزینه markdown-- برای ما یک فایل داخل مسیر viewها ایجاد میکنه که به ما امکان ویرایش ایمیل رو میده. همانطور که می‌بینید من با کمک یک نقطه مسیری که می‌خواستم ایمیل ذخیره بشه رو هم تعریف کردم. همچنین امکان ویرایش قالب ایمیل هم هست ولی در این آموزش دیگه وارد طراحی قالب نمیشیم. 

حالا اگه وارد دایرکتوری app بشید متوجه یه فولدر جدید بنام mail خواهید شد. داخل این فولدر کلاس‌های مختلفی میتونه وجود داشته مثلا همین ایمیل تماس یا ایمیل خبرنامه، فاکتور و هر ایمیل دیگری که یستم شما به اون نیاز داره! خب بیایید از این کلاسی که ساختیم استفاده کنیم و یک ایمیل ساده ارسال کنیم.

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

 Mail::to('support@test.com')->send(new ContactFormMail());

اگر حالا ارسال ایمیل رو انجام بدیم قطعا خطا داریم :) 

برای ارسال ایمیل شما نیاز دارین که یک اتصال SMTP (مخفف simple mail transfer protocol) برای ارسال ایمیل در پروژتان تعریف کنید. درمورد اینکه سرور SMTP چیه باید بگم یه جور پروتکل ساده انتقال ایمیله که برای ارسال و دریافت نامه‌های الکترونیکی مورد استفاده است. اگر بیشتر خواستید می‌تونید در صفحه زیر بیشتر در این رابطه مطالعه داشته باشید:

اما برای اتصال به یک سرویس ارسال ایمیل در پروژه‌های واقعی شما نیاز دارید در کنار هزینه‌های سرور و دامین یه هزینه هم برای سرویس ارسال ایمیل هم بکنید. اما در اینجا و برای تست ما از mailtrap که یه سرویس رایگان معروف هست استفاده می‌کنیم. کار باهاش هم خیلی سادس وارد سایتش بشد ثبت نام کنیم و تنظیمات مربوط به سرویس میل برای لاراول رو بگیرید و اون مقادیر رو داخل فایل env. وارد کنید. همین!

حالا اگه ارسالی هم انجام بدید فرم خام لاراول در ارسال ایمیل رو خواهید دید:

Image for post
Image for post

حالا بیایید برگردیم و ایمیل رو با اطلاعاتی که کاربر می‌فرسته مقدار دهی کنیم.

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

Mail::to('support@test.com')->send(new ContactFormMail($data));

حالا وارد کلاس ContactFormMail میشیم و دیتایی مقدار دهی کردیم رو با سازنده داخل کلاس می‌گیریم:

Image for post
Image for post

خب حالا داخل فایل ایمیل اطلاعات در دسترس هستند که می‌تونیم مطابق با خواستمون تغییر بدیم. من یک فرم بسیار ساده رو ایجاد کردم ولی شما می‌تونید هر قالبی رو داشته باشید منتهی یادتون باشه اینجا دیگه bootstrap وجود نداره و باید از دستور‌های استایل داخل تگهای html استفاده کنید:

Image for post
Image for post
Image for post
Image for post

خب اینم از فرم تماسمون شما حالا می‌توانید برای هر پروژه لاراولیتون یک فرم تماس بسازید. فقط بنظرتون بهتر نیست بعد از ارسال به کاربر پیغام ارسال موفق شد رو بدیم؟

برای اینکار از session ها استفاده میشه. در مورد session بعدا توضیح خواهم داد. اما در اینجا کافیه وارد تابع store کنترلر تماستون بشید و با تابع with موقعی که داریم به صفحه بازگردانده میشیم یک پیغام همراه با یک کلید در نظر بگیرید:

Image for post
Image for post

خب برای نمایش این پیغام برای اینکه بعدا هم بتونیم برای موارد دیگه استفاده کنیم بهتره که در قسمت قالب layout نمایش رو مدیریت کنم:

Image for post
Image for post

در این آموزش با نحوه ساخت و تنظیمات لازم جهت ارسال ایمیل از طریق فرم تماس آشنا شدید و تونستیم با mailtrap سرویس ایمیلمون رو در محیط توسعه راه‌اندازی کنیم و نهایتا با کمک session یک پیام موفقیت بعد از اتمام فرایند ارسال به کاربر ارسال کردیم.