طراحی سایت و برنامه نویسی

آموزش طراحی سایت و برنامه نویسی

طراحی سایت و برنامه نویسی

آموزش طراحی سایت و برنامه نویسی

آموزش سوئیفت (Swift): کاربرد Enum با ژنریک و بستار – بخش پانزدهم

در این بخش از سری مقالات آموزش برنامه‌نویسی سوئیفت قصد داریم به صورت فشرده برخی از مفاهیم مهم این زبان برنامه‌نویسی شامل استفاده از Enum به همراه ژنریک و بستارها را با هم ترکیب کنیم و با روش عملی استفاده از آن‌ها در کدنویسی آشنا شویم.

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

Enum به همراه ژنریک و بستار

در بخش‌های قبلی این سری آموزشی در مورد Enum-ها صحبت کردیم و گفتم که Enum گزینه‌های مختلفی در اختیار شما قرار می‌دهد که می‌توانید از میان آن‌ها انتخاب کنید و به نوعی حالت‌های مختلف را منحصر به آن گزینه‌ها بکنید. ما می‌توانیم از مقادیر متناظر با حالت‌های Enum برای تعریف کردن نوعی که در زمان استفاده از Enum وهله‌سازی خواهد شد استفاده کنیم.

چنان که می‌بینید امکان بسیار جالبی است. اگر ندانیم چه نوعی وارد خواهد شد، می‌توانیم از ژنریک استفاده کنیم.

بدین ترتیب می‌توانیم در زمان ایجاد یک address یا coordinate از هر نوع که می‌خواهیم، استفاده کنیم.

Enum

اکنون به بررسی روش استفاده ترکیبی از Enum به همراه ژنریک و بستار می‌پردازیم. این ترفند جالبی است که برنامه‌نویسان حرفه‌ای از آن در کدهای خود استفاده می‌کنند.

البته اگر بگوییم درک طرز کار این روش آسان است، دروغ گفته‌ایم. حتی با وجود تورفتگی‌ها، می‌بینیم که درک کد فوق دشوار است. اما جای نگرانی نیست، زیرا در ادامه، همه این موارد را جزء به جزء توضیح می‌دهیم.

Struct Download

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

بدین ترتیب دو گزینه در اختیار ما قرار می‌گیرد که یکی (success(anything. و دیگری (failure(someError. است.

این متدی است که یک تابع می‌گیرد. آن تابع یک حالت را از Enum به نام Result می‌گیرد و چیزی هم بازگشت نمی‌دهد.

let session

این دستور یک «نشست» (Session) از URLSession با یک پیکربندی ephemeral می‌سازد. منظور از ephemeral این است که تنها در حافظه وجود دارد و به عبارتی معادل مرور خصوصی وب است.

let url

این دستور یک URL از رشته‌ای که به آن ارسال کرده‌ایم، می‌سازد. این رشته می‌تواند هر صفحه وبی که می‌خواهید از آن دانلود کنید باشد.

کد فوق وظیفه‌ای در اختیار ما قرار می‌دهد که با آن می‌توانیم داده‌های مورد نظر خود را دانلود کنیم. آن را می‌توان مانند اسبی تصور کرد که می‌توانیم آن را به هر کجا که می‌خواهیم برانیم. Data شامل داده‌های باینری (0 و 1) است که دریافت می‌کنیم. response هدرهای پاسخی است که دریافت می‌شود و در ادامه در مورد آن بیشتر توضیح می‌دهیم.

error در صورت ناموفق بودن درخواست بازگشت می‌یابد و درک این نکته مهم است. چون در صورت دریافت یک خطای 404 (صفحه یافت نشد) در فراخوانی، می‌توانید اطلاعات مربوطه را از response دریافت کنید. حتی اگر خطای 500 دریافت شود که به معنی ناموفق بودن چیزی در سرور است همچنان می‌توان آن را در response مشاهده کرد. error برای ما به این معنی است که نتوانسته‌ایم آن کاری را که می‌خواستیم اجرا کنیم و حتی درخواست را مقداردهی کنیم. بنابراین error به معنی خطای ما و نه خطای دیگران است.

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

ما قبلاً در مورد DispatchQueue.main.async صحبت کرده‌ایم، بنابراین در اینجا می‌خواهیم فقط کد زیر را توضیح دهیم:

اعتبارزدایی

این کد اقدام به اعتبارزدایی و لغو می‌کند، یعنی هر کاری که انجام می‌دادید را متوقف کرده و session را پاک می‌کند، چون دیگر نیازی به آن نداریم. اما اگر بخواهیم defer را توضیح دهیم، باید بگوییم که defer برای اجرا کردن یک قطعه کد استفاده می‌شود و مهم نیست که چه کاری انجام می‌یابد، صرفاً باید قبل از اجرا شدن، تا زمانی که متد پایان می‌یابد صبر کند. در واقع شبیه به یک deinit برای متدها، تابع‌ها و بستارها است.

سپس از (!completion(.failure(error استفاده می‌کنیم. completion از نام پارامتر در start می‌آید. failure. حالتی از Enum با نام Result و !error خطای به اجبار باز شده است که از بستار دریافت شده است. در این موقعیت این به‎کارگیری اجبار، کار درستی محسوب می‌شود، چون قبلاً تهی نبودن آن را بررسی کرده‌ایم و از آنجا که این کد اجرا می‌شود، به این معنی است که تهی نبوده است. در ادامه بررسی‌های دیگری را نیز اجرا می‌کنیم.

دسترسی مستقیم به حالت

متأسفانه سوئیفت دسترسی مستقیم به «حالت» (State) کد ایجاد نمی‌کند؛ اما HTTPURLResponse چنین امکانی در اختیار ما قرار می‌دهد و می‌توانیم نوع پاسخ را به یک HTTPURLResponse تغییر دهیم و باید موفق باشد. در این حالت بی‌درنگ بررسی می‌کنیم که آیا پاسخ موفقی به صورت زیر داریم یا نه:

اگر هر دوی آن‌ها درست باشند، در این صورت می‌توانیم داده‌ها را به صورت امنی باز پس بفرستیم تا تجزیه شوند و یا هر کار دیگری که قصد انجام آن وجود دارد اجرا شود. ابتدا با استفاده از DispatchQueue.main.async مطمئن می‌شویم که این کار را روی صف اصلی انجام می‌دهیم و سپس از دستگیره completion استفاده می‌کنیم تا این کار را با ((!completion(.success(data به صورت باز کردن اجباری داده‌ها اجرا کنیم، چون هر سه پارامتر بستار، مقادیر غیر optimal هستند.

در انتهای تابع Start اقدام به فراخوانی ()task.resume می‌کنیم که وظیفه داده را اجرا می‌کند. زمانی که این فراخوانی پایان یافت، همه آن کد را که قبلاً بررسی کردیم اجرا می‌کنیم.

برای این که متوجه شوید همه این موارد در سمت دیگر که Start را فراخوانی می‌کنیم، چه طور به نظر می‌رسند، می‌توانید کد زیر را ملاحظه کنید:

سخن پایانی

بدین ترتیب در این مقاله با ارائه یک مثال با روش اجرای یک فراخوانی شبکه آشنا شدیم. روش استفاده از قدرت Enum-ها به همراه تابع‌ها و ژنریک ها برای کمک به بازگشت بستار نمایش یافت. همچنین نگاهی به escaping@ داشتیم و با طرز استفاده از آن بیشتر آشنا شدیم.

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

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

ما تا به این جا صحبت‌های زیادی در مورد انواعِ مقداری داشتیم. سوئیفت عاشق انواعِ مقداری خود است؛ اما نوع دیگری از داده‌ها به نام انواعِ ارجاعی نیز وجود دارند انواع ارجاعی فریبنده هستند و در صورتی که به طرز صحیحی استفاده نشوند می‌توانند خطرناک باشند. در بخش بعدی در مورد inout ،Lazy و Getters و Setters صحبت خواهیم کرد. inout به طور کامل در مورد ارجاع‌ها است، Lazy به ارتقای عملکرد کد کمک می‌کند و getters و setters موجب تغییر در شیوه دسترسی به داده‌ها می‌شوند. موارد فوق در موقعیت‌های مختلف برنامه‌نویسی مفید هستند. برای مطالعه بخش بعدی این نوشته به لینک زیر رجوع کنید:

الگوریتم چیست؟ — به زبان ساده

الگوریتم کلمه‌ای است که بسیار با آن مواجه می‌شویم. اما وقتی در مورد الگوریتم‌های یوتیوب یا فیسبوک صحبت می‌کنیم، منظورمان دقیقاً چیست؟ الگوریتم‌ها چه هستند و چرا افراد تا این حد از آن‌ها در هراس هستند؟

الگوریتم‌ها، دستورالعمل حل مسئله هستند

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

برنامه‌نویسی صرفاً یک عنوان شغلی جذاب محسوب نمی‌شود؛ بلکه مبنای همه نرم‌افزارهای رایانه‌ای از آفیس مایکروسافت تا نرم‌افزارهای سخنگوی تلفنی است. حتی اگر دانش شما از برنامه‌نویسی تنها منحصر به فیلم‌های خیلی قدیمی و گزارش‌های خبری زرد باشد، احتمالاً متوجه هستید که کار یک برنامه‌نویس چیست. برنامه‌نویس کدی را برای رایانه می‌نویسد و رایانه با استفاده از دستورالعمل‌های تعریف شده آن کد وظایفی را برای حل مسائل اجرا می‌کند.

اینک باید گفت که در دنیای دانش رایانه، الگوریتم در واقع عنوانی جذاب برای نامیدن کد است. هر مجموعه دستورالعمل که به یک رایانه اعلام کند مسائل را چگونه حل کند یک الگوریتم محسوب می‌شود؛ حتی اگر آن وظیفه بسیار آسان باشد. زمانی که رایانه خود را روشن می‌کنید، یک مجموعه از دستورالعمل‌های «شیوه روشن شدن» اجرا می‌شوند. زمانی که رایانه NASA از داده‌های موج رادیویی خام برای رندر کردن یک عکس فضایی استفاده می‌کند، همچنان یک الگوریتم اجرا شده است.

واژه‌ای چند بعدی

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

الگوریتم

اما نکته اینجا است که امروزه کلمه الگوریتم صرفاً برای برخی گفتگوهای فناوری بسیار خاص مورد استفاده قرار می‌گیرد. معمولاً نمی‌شنویم که کسی از الگوریتم‌های «ریاضیات مقدماتی» یا الگوریتم‌های «ابزار گرافیتی در نرم‌افزار Paint» صحبت کند. اما در عوض بسیار می‌شنویم که کاربران در مورد الگوریتم‌های پیشنهاد دوست اینستاگرام یا الگوریتم‌های گردآوری داده فیسبوک از گروه‌های خصوصی اعتراض می‌کنند.

اگر الگوریتم یک اصطلاح با معانی مختلف برای دستورالعمل‌های محاسباتی باشد، در این صورت چرا باید از آن منحصراً برای توصیف جنبه‌های گیج‌کننده، جادویی و یا حتی شریرانه دنیای دیجیتال استفاده کنیم؟

اغلب افراد از «الگوریتم» و «یادگیری ماشین» به جای هم استفاده می‌کنند

یادگیری ماشین

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

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

یادگیری ماشین به مثابه هوش مصنوعی

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

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

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

چرا الگوریتم‌ها بحث‌ برانگیز هستند؟

Long Division ازجمله الگوریتم‌های آشنا برای تقسیم اعداد است. این الگوریتم چنان ساده است که به جای رایانه‌ها مورد استفاده کودکان مدرسه‌ای است. پردازنده‌های رایانه از الگوریتم کاملاً متفاوتی برای تقسیم کردن اعداد استفاده می‌کنند، اما در هر حال نتیجه کار یکسان است.

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

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

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

چطور می‌توانیم از واژه الگوریتم استفاده کنیم؟

الگوریتم‌ها مبانی همه نرم‌افزارها هستند. بدون وجود الگوریتم هیچ تلفن یا رایانه‌ای وجود نمی‌داشت و احتمالاً همین مقاله را نیز روی کاغذ می‌خواندید و شاید هم اصلاً نمی‌توانستید آن را بخوانید.

اما توده مردم از واژه الگوریتم به عنوان یک اصطلاح همه‌کاره برای کدهای رایانه‌ای استفاده نمی‌کنند. در واقع اغلب مردم تصور می‌کنند که تفاوتی بین کد رایانه و الگوریتم وجود دارد؛ در حالی که واقعاً چنین نیست. از آنجا که واژه الگوریتم با یادگیری ماشین مرتبط است، معنی آن تا حدودی در هاله‌ای از ابهام قرار گرفته است و کاربرد آن به موارد خاصی محدود شده است.

الگوریتم

آیا ما باید از واژه الگوریتم برای توصیف اغلب کدهای رایانه‌ای استفاده کنیم؟ شاید این کار مناسبی نباشد، چون اغلب افراد منظور گفته‌های شما را درک نخواهند کرد. زبان همواره در حال تغییر است و برای هر تغییری نیز همواره دلیل خوبی وجود دارد. افراد برای توصیف دنیای سردرگم‌کننده، مبهم و در برخی موارد مشکوک یادگیری ماشین به یک واژه نیاز دارند و فعلاً واژه الگوریتم این نقش را بر عهده گرفته است.

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

منبع: فرادرس


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

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

محاسبه فاکتوریل برای اعداد تا 20

در این بخش با روش‌های متفاوتی اقدام به محاسبه فاکتوریل اعداد تا 20 می‌کنیم.

استفاده از حلقه for

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

راه‌حل فوق برای اعداد تا 20 به خوبی کار می‌کند. اما اگر تلاش کنیم فاکتوریل اعداد بالاتر از 20 را محاسبه کنیم، ناموفق خواهد بود، زیرا نتایج آن قدر بزرگ خواهد شد که در یک متغیر از نوع long جای نمی‌گیرد و موجب خطای «سرریز» (overflow) می‌شود.

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

استفاده از Stream در جاوا 8

امکان استفاده از API مربوط به Stream در جاوا 8 برای محاسبه فاکتوریل به روشی آسان وجود دارد:

در این برنامه ابتدا از LongStream برای تعریف حلقه‌ای روی اعداد بین 1 تا n استفاده می‌کنیم. سپس از ()reduce استفاده می‌کنیم که از یک مقدار شناسایی و تابع تجمیع در مرحله کاهش استفاده می‌کند.

استفاده از بازگشت (Recursion)

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

استفاده از کلاس Apache Commons Math

Apache Commons Math یک کلاس به نام CombinatoricsUtils دارد که شامل یک متد فاکتوریل استاتیک است. ما می‌توانیم از این متد نیز برای محاسبه فاکتوریل استفاده کنیم.

برای incude کردن Apache Commons Math باید وابستگی commons-math3 را به pom اضافه کنیم:

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

توجه داشته باشید که نوع بازگشتی مانند راه‌حل‌های بومی جاوا long است.

این بدان معنی است که اگر مقدار محاسبه شده از Long.MAX_VALUE تجاوز کند، خطای MathArithmeticException صادر می‌شود. برای دریافت مقادیر بزرگ‌تر باید از نوع بازگشتی متفاوتی استفاده کنیم.

محاسبه فاکتوریل برای اعداد بزرگ‌تر از 20

در این بخش روش‌هایی را بررسی می‌کنیم که با آن‌ها می‌توان فاکتوریل اعداد بزرگ‌تر از 20 را نیز محاسبه کرد.

استفاده از BigInteger

چنان که پیش‌تر اشاره کردیم، نوع داده long برای محاسبه فاکتوریل عدد n به شرط کمتر از 20 بودن مناسب است. برای مقادیر n بزرگ‌تر می‌توانیم از کلاس BigInteger در پکیج java.math استفاده کنیم که می‌تواند مقادیری تا 2^Integer.MAX_VALUE را نگهداری کند.

استفاده از Guava

کتابخانه Guava گوگل یک متد کاربردی برای محاسبه فاکتوریل اعداد بزرگ ارائه کرده است. برای include کردن این کتابخانه می‌توانیم وابستگی guava را به pom اضافه کنیم:

اکنون می‌توانیم از متد فاکتوریل استاتیک از کلاس BigIntegerMath برای محاسبه فاکتوریل عدد مفروض استفاده کنیم:

سخن پایانی

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

منبع: فرادرس


مقدمه‌ای بر API-های وب — راهنمای جامع

 برنامه نویسی  41 بازدید

در این مقاله ابتدا به بررسی API-های سطح بالا می‌پردازیم و در ادامه با ماهیت، طرز کار، شیوه استفاده در کد و روش سازماندهی‌شان آشنا می‌شویم. همچنین نگاهی خواهیم داشت به کلاس‌های اصلی متفاوت API-های وب و کاربردهای مختلفی که دارند.

API-ها چه هستند؟

API اختصاری برای عبارت «رابط برنامه‌نویسی اپلیکیشن» (Application Programming Interfaces) است و سازه‌ای است که در اختیار زبان‌های برنامه‌نویسی قرار می‌گیرد تا بتوانند کارکردهای پیچیده را به روش آسان ایجاد کنند. API-ها کدهای پیچیده را از شما انتزاع می‌کنند و در وهله نخست ساختار آسانی برای کار کردن در اختیار شما قرار می‌دهند.

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

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

API-های وب

به ترتیب مشابه اگر بخواهید برخی گرافیک‌های 3 بعدی را برنامه‌نویسی کنید، استفاده از API-های نوشته شده در زبان‌های سطح بالا مانند جاوا اسکریپت یا پایتون بسیار آسان‌تر از نوشتن کدهای سطح پایین (مانند C یا ++C) است که مستقیماً GPU رایانه را کنترل می‌کنند یا کارکردهای گرافیکی دیگری را ارائه می‌کنند.

API-ها در جاوا اسکریپت سمت کلاینت

جاوا اسکریپت سمت کلاینت به طور خاص API-های زیادی در اختیار ما قرار داده است که بخشی از خود زبان جاوا اسکریپت نیستند، بلکه بر مبنای زبان اصلی جاوا اسکریپت ساخته شده‌اند و امکانات فوق‌العاده‌ی اضافی برای استفاده در کدهای جاوا اسکریپت ارائه می‌کنند. این API-ها عموماً در دو دسته جای می‌گیرند که در ادامه به این دو دسته خواهیم پرداخت.

API-های مرورگر

این API-ها بر مبنای مرورگر ساخته می‌شوند و امکان افشای داده‌ها را از مرورگر و محیط پیرامونی رایانه فراهم می‌سازند و کارهای مفید پیچیده‌ای انجام می‌دهند. برای نمونه، Web Audio API سازه‌های جاوا اسکریپت را برای دستکاری صدا در مرورگر ارائه می‌کنند. بدین ترتیب می‌توان یک قطعه صوتی را ضبط کرد، صدا را کاهش یا افزایش داد، جلوه‌هایی روی آن اعمال کرد و مواردی از این دست. مرورگر در پس‌زمینه عملاً از کدهای پیچیده سطح پایینی (مانند ++C یا Rust) برای پردازش واقعی صداها استفاده می‌کند، اما در این مورد نیز پیچیدگی از طریق API انتزاع شده است.

API-های شخص ثالث

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

API-های وب

رابطه بین جاوا اسکریپت، API-ها و دیگر ابزارهای این زبان برنامه‌نویسی

در بخش قبل در مورد این که API-های سمت کلاینت جاوا اسکریپت چه هستند و چه ارتباطی با زبان جاوا اسکریپت دارند صحبت کردیم. در این بخش مباحث مطرح شده را جمع‌بندی می‌کنیم تا همه چیز روشن‌تر شود و نقش ابزارهای دیگر جاوا اسکریپت نیز مشخص شود.

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

API-های مرورگر: سازه‌هایی هستند که بر مبنای مرورگر ساخته شده‌اند و روی زبان جاوا اسکریپت کار می‌کنند و امکان پیاده سای آسان‌تر کارکردها را فراهم می‌سازند.

API-های شخص ثالث: سازه‌هایی هستند که در پلتفرم‌های شخص ثالث (مانند توییتر، فیسبوک و غیره) ساخته شده‌اند و می‌توان آن‌ها را به صفحه وب الحاق کرد تا برخی از امکانات آن پلتفرم‌ها در صفحه‌های وب شخصی ارائه شوند. برای نمونه می‌توان آخرین توییت‌ها را در صفحه وب شخصی نمایش داد.

کتابخانه‌های شخص ثالث: معمولاً یک یا چند فایل جاوا اسکریپت هستند که شامل تابع‌های سفارشی هستند و به صفحه وب الحاق می‌شوند تا نوشتن کارکردهای رایج را تسریع یا فعال‌سازی کنند. نمونه‌هایی از آن شامل jQuery، Mootools و React است.

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

API چه می‌تواند بکند؟

تعداد بسیار زیادی از API-ها در مرورگرهای مدرن وجود دارند که امکان انجام طیف گسترده‌ای از کارها را در کد فراهم می‌سازند. با ملاحظه صفحه اندیس API-های MDN (+) این مسئله واضح‌تر دیده می‌شود.

API-های مشترک مرورگر: به طور خاص، دسته‌بندی‌های رایج‌تر API-های مرورگر که مورد استفاده قرار می‌گیرند به شرح زیر هستند:

API-ها برای دستکاری اسناد: این API-ها در مرورگر بارگذاری می‌شوند. بدیهی‌ترین مثال API مربوط به DOM است که امکان دستکاری HTML و CSS را می‌دهد. به وسیله این API می‌توان کدهای HTML را به صورت دینامیک ایجاد، یا حذف کرده و یا تغییر داد و استایل‌های جدیدی روی صفحه اعمال کرد. هر بار که در هنگام مرور وب یک پنجره پاپ‌آپ می‌بینید یا نوعی محتوای جدید روی صفحه ظاهر می‌شود DOM عمل کرده است.

API-هایی که داده‌ها را از سرور واکشی می‌کنند: این API-ها بخش‌های کوچکی از صفحه وب را که کاربرد بیشتری دارند، به‌روزرسانی می‌کنند. این جزییات به ظاهر کوچک تأثیر زیادی روی عملکرد و رفتار سایت‌ها دارند. اگر صرفاً لازم باشد که یک فهرست انبار یا فهرستی از موجودی جدید به‌روزرسانی شود، انجام این کار به صورت مستقیم بدون نیاز به بارگذاری مجدد کل صفحه از سرور موجب می‌شود که سایت یا اپلیکیشن واکنش‌گرایی بیشتری به نمایش بگذارد و کارآمد به نظر برسد. API-هایی که این امر را ممکن می‌سازند، شامل XMLHttpRequest و Fetch API هستند. همچنین ممکن است با Ajax مواجه شده باشید که این تکنیک را توضیح می‌دهد.

API-هایی برای رسم و دستکاری گرافیک‌ها: این API-ها اینک به صورت گسترده از سوی مرورگرها پشتیبانی می‌شوند. رایج‌ترین انواع این API-ها شامل Canvas و WebGL هستند که امکان به‌روزرسانی برنامه‌نویسی شده داده‌های پیکسلی موجود در عنصر <canvas> در HTML را به صورت صحنه‌های 2 و 3 بعدی فراهم می‌سازند. برای نمونه می‌توان شکل‌هایی از قبیل مستطیل یا دایره را روی صفحه رسم کرد، یک تصویر را در یک بوم ایمپورت کرد و یک فیلتر مانند «حالت قهوه‌ای» (Sepia) یا «سیاه و سفید» (grayscale) را با استفاده از Canvas API روی آن اعمال کرد. همچنین می‌توان یک صحنه 3 بعدی پیچیده را به همراه نوردهی و بافت‌ها با کمک WebGL روی صفحه ایجاد کرد. چنین API-هایی غالباً با API-های مربوط به ایجاد حلقه‌های انیمیشن مانند ()window.requestAnimationFrame و همچنین API-های دیگر برای به‌روزرسانی مداوم صحنه‌هایی مانند کارتون یا گیم ترکیب می‌شوند.

API-های صوتی و ویدئویی: این API-ها از قبیل HTMLMediaElement ،the Web Audio API و WebRTC امکان اجرای کارهای واقعاً جذابی را با فایل‌های چندرسانه‌ای فراهم می‌سازند. از جمله کارهایی که این API-ها انجام می‌دهند شامل ایجاد کنترل‌های UI سفارشی برای پخش صوت و ویدئو، نمایش مسیرهای متنی مانند عنوان و زیرنویس همراه فیلم، دریافت ویدئو از دوربین وب و دستکاری آن از طریق یک بوم یا نمایش روی نمایشگر یک فرد دیگر برای اجرای ویدئوکنفرانس و یا افزودن جلوه‌هایی به قطعه‌های صوتی است.

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

API-های ذخیره‌سازی سمت کلاینت: این API-ها به تدریج در مرورگرهای وب بسیار گسترش می‌یابند، چون امکان ذخیره‌سازی داده‌ها در سمت کلاینت در صورتی که بخواهید یک اپلیکیشن بسازید که «حالت» (State) را بین بارگذاری صفحه‌های مختلف حفظ کند و احتمالاً حتی وقتی دستگاه آفلاین است، کار کند، بسیار مفید خواهد بود. چند گزینه مانند ذخیره‌سازی ساده نام/مقدار با و ذخیره‌سازی جدولی پیچیده‌تر داده‌ها با استفاده از IndexedDB API به این منظور وجود دارند.

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

  • API توییتر که امکان انجام کارهایی مانند نمایش جدیدترین توییتها را روی وب‌سایت فراهم می‌کند.
  • API-های نقشه مانند Mapquest و Google Maps API که به صفحه‌های وب امکان انجام کارهای مختلفی روی نقشه را می‌دهند.
  • مجموعه API-های فیسبوک به شما امکان می‌دهند که بخش‌های مختلف اکوسیستم فیسبوک را به نفع خود مورد استفاده قرار دهید. برای نمونه امکان ورود به اپلیکیشن از طریق اطلاعات حساب کاربری فیسبوک، پذیرش پرداخت‌های درون برنامه‌ای، اجرای کمپین‌های تبلیغاتی هدف‌گیری شده و مواردی از این دست.
  • API-های تلگرام امکان جاسازی محتوای کانال‌های تلگرام روی وب‌سایت را می‌دهند و از ربات‌ها نیز پشتیبانی می‌کنند.
  • API یوتیوب امکان جاسازی ویدئوهای یوتیوب را روی سایت فراهم می‌سازد. همچنین امکان جستجوی ویدئوها، ساخت پلی‌لیست و موارد دیگر از این طریق مهیا شده است.
  • API پینترست ابزارهایی برای مدیریت بورد و پین‌های پینترست و گنجاندن آن در وب‌سایت ارائه می‌کند.
  • API تویلیو یک فریمورک برای ساخت کارکردهای تماس صوتی و ویدئویی در اپلیکیشن ارائه می‌کند. همچنین امکان ارسال SMS و MMS از اپلیکیشن و موارد دیگر مهیا شده است.
  • API مربوط به Mastodon امکان دستکاری‌های برنامه‌نویسی شده قابلیت‌های وب‌سایت شبکه اجتماعی Mastodon را فراهم ساخته است.

API-ها چگونه کار می‌کنند؟

API-های مختلف جاوا اسکریپت به روش‌های نسبتاً متفاوتی عمل می‌کنند، اما طرز کار آن‌ها عموماً دارای ویژگی‌ها و طرح‌بندی‌های مشابهی است.

مبتنی بر اشیا هستند

کد شما با استفاده از یک یا چند شیء جاوا اسکریپت با API-ها تعامل می‌یابد که به عنوان کانتینرهایی برای داده‌هایی که API استفاده می‌کند (در مشخصه‌های شیء) و کارکردی که API مهیا می‌کند (در متدهای شیء)، عمل می‌کنند.

اگر به مثال API وب صوتی بازگردیم می‌بینیم که این یک API نسبتاً پیچیده است که شامل تعدادی شیء است. بدیهی‌ترین آن‌ها شامل موارد زیر هستند:

  • AudioContext که نماینده گراف صوتی هستند و می‌توانند برای دستکاری صدا و پخش صوت درون مرورگر استفاده شوند و چند متد و مشخصه نیز برای دستکاری آن صدا دارند.
  • MediaElementAudioSourceNode که نماینده عنصر <audio> و شامل صداهایی هستند که می‌خواهید درون چارچوب صوتی پخش یا دستکاری کنید.
  • AudioDestinationNode که نماینده مقصد صوتی یعنی دستگاهی روی رایانه که خروجی عملاً روی آن ارائه می‌شود هستند. این دستگاه معمولاً اسپیکر یا هدفون است.

اینک سؤال این است که این اشیا چگونه تعامل می‌یابند؟ در قطعه کد زیر مثالی از یک پخش‌کننده صدا ارائه شده است:

در نخستین بخش این کد با HTML زیر مواجه می‌شویم:

قبل از هر چیز عنصر <audio> را include می‌کنیم و با آن یک فایل MP3 را در صفحه جاسازی می‌کنیم. ما هیچ کنترل پیش‌فرض مرورگر را نگنجانده‌ایم. سپس یک عنصر <button> قرار داده‌ایم که از آن برای پخش و قطع صدا استفاده می‌کنیم. همچنین یک عنصر <input> از نوع range قرار داده‌ایم که برای تنظیم شدت صدای در حال پخش استفاده می‌شود.

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

سپس ثابت‌هایی می‌سازیم که ارجاع‌ها به عناصر <audio> ،<button> و <input> را نگهداری می‌کنیم. از متد ()AudioContext.createMediaElementSource برای ایجاد یک MediaElementAudioSourceNode استفاده می‌کنیم که نماینده منبع صدای ما است. عنصر <audio> که صدا از آن پخش می‌شود به صورت زیر است:

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

نکته: ممکن است متوجه شده باشید که متدهای ()play و ()pause که برای پخش و مکث قطعه صوتی استفاده می‌شوند بخشی از API صوتی وب نیستند. در واقع آن‌ها بخشی از API به نام HTMLMediaElement هستند که گرچه متفاوت است اما ارتباط نزدیکی دارد.

سپس یک شیء GainNode با استفاده از متد ()AudioContext.createGain می‌سازیم که از آن می‌توان برای تنظیم شدت صدا استفاده کرد و یک دستگیره رویداد دیگر می‌سازیم که هر زمان مقدار اسلایدر تغییر یابد، مقدار شدت صدا را تغییر می‌دهد.

آخرین کاری که برای عملیاتی کردن این پخش‌کننده صوتی لازم است، اتصال گره‌های مختلف به گراف صوتی است که با استفاده از متد ()AudioNode.connect روی هر نوع از گره صورت می‌گیرد:

صدا در منبع آغاز می‌شود که در ادامه به گره gain متصل شده است تا بتوان شدت صدا را تنظیم کرد. گره gain به گره مقصد وصل شده است تا بتوان صدا را روی رایانه پخش کرد.

API-ها نقاط ورود قابل شناسایی دارند

زمانی که از API استفاده می‌کنید باید مطمئن شوید که می‌دانید نقطه ورود API کجاست. در API صوتی وب این نقطه ورود کاملاً مشخص و شیء AudioContext است که باید برای انجام هر نوع دستکاری صوتی استفاده شود.

API مربوط به مدل شیء سند یا DOM نیز نقطه ورود ساده‌ای دارد. قابلیت‌های آن را می‌توان در شیء Document یا یک وهله از عنصر HTML یافت که به نحوی می‌خواهید عملیاتی کنید. برای نمونه:

Canvas API نیز روی دریافت یک شیء context برای استفاده جهت دستکاری موارد مختلف استوار است، گرچه در این مورد به جای یک context صوتی یک context گرافیکی وجود دارد. شیء context آن از طریق دریافت یک ارجاع به عنصر <canvas> که قرار است روی آن ترسیم کنیم ایجاد می‌شود و سپس متد ()HTMLCanvasElement.getContext آن فراخوانی می‌شود:

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

API-ها از رویدادها برای مدیریت تغییر در حالت استفاده می‌کنند

برخی API-های وب شامل هیچ رویدادی نیستند، اما اغلب آن‌ها دست‌کم چند رویداد دارند. مشخصه‌های دستگیره به ما امکان می‌دهند که تابع‌ها را زمانی که رویدادها اتفاق می‌افتند اجرا کنیم.

ما در مثال فوق برخی از دستگیره‌های رویداد را که در API صوتی وب استفاده می‌شوند مشاهده کردیم. برای ارائه مثالی دیگر باید بگوییم که وهله‌های شیء XMLHttpRequest هر یک نماینده یک درخواست HTTP به سرور هستند که نوعی منابع جدید را بازیابی می‌کنند و هر یک چندین رویداد دارند. برای نمونه رویداد load زمانی وقوع می‌یابد که یک پاسخ با موفقیت بازگشت یابد و شامل منبع درخواستی ناموجودی باشد.

کد زیر نمونه ساده‌ای از شیوه استفاده از این رویداد را نشان می‌دهد:

چند خط نخست، موقعیت منبعی را که می‌خواهیم واکشی کنیم نشان می‌دهد، یک وهله جدید از شیء درخواست را با استفاده از سازنده ()XMLHttpRequest ایجاد می‌کند، یک درخواست HTTP به صورت GET باز می‌کند تا منبع موردنظر را بازیابی کند، پاسخی که باید ارسال شود را در قالب JSON تعیین می‌کند و سپس درخواست را ارسال می‌کند.

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

API-ها سازوکارهای امنیتی بیشتری دارند

قابلیت‌های WebAPI همچون جاوا اسکریپت و دیگر فناوری‌های وب در معرض ملاحظات امنیتی هستند، اما برخی اوقات سازوکارهای امنیتی اضافی تعریف می‌شوند. برای نمونه برخی از WebAPI-های مدرن تنها روی صفحه‌هایی کار می‌کنند که روی HTTPS عرضه شده باشند، چون داده‌های بالقوه حساسی را انتقال می‌دهند.

به علاوه برخی WebAPI-ها درخواست مجوز فعال شدن را در زمان فراخوانی در کد از کاربر می‌کنند. به عنوان نمونه Notifications API از طریق یک کادر محاوره‌ای بازشونده از کاربر اجازه می‌خواهد:

API-های وب

API-های Web Audio و HTMLMediaElement در معرض سازوکارهای امنیتی به نام autoplay policy هستند. معنی این وضعیت آن است که در زمان بارگذاری صفحه نمی‌توان به صورت خودکار به پخش صدا پرداخت و باید از طریق یک کنترل مانند دکمه از کاربر اجازه پخش صدا را گرفت. دلیل انجام این کار آن است که پخش خودکار صدا معمولاً بسیار آزاردهنده است و کاربران عموماً دوست ندارند چنین وضعیتی را تجربه کنند.

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

سخن پایانی

در پایان مطالعه این مقاله شما باید ایده خوبی از مفهوم API-ها، طرز کار آن‌ها، و کاربردهایی که در کد جاوا اسکریپت دارند، به دست آورده باشید. احتمالاً هیجان‌زده هستید که شروع به استفاده جالبی از API-های خاص بکنید. در بخش بعدی اقدم به دستکاری سندها با استفاده از API مدل شیء سند یعنی DOM خواهیم کرد.

منبع: فرادرس


ارسال ایمیل در لاراول (Laravel) — راهنمای کاربردی

فریمورک وب لاراول از مزیت کتابخانه محبوب SwiftMailer برخوردار است که استفاده از آن آسان است و طیف متنوعی از درایورهای ایمیل ارائه کرده است. در همین راستا، در این مقاله قصد داریم به بررسی API ارسال ایمیل در لاراول بپردازیم.

راه‌اندازی پیش‌نیازها

لاراول یک کتابخانه پوششی بر روی کتابخانه SwiftMailer بنا می‌کند که مدیریت ایمیل را همزمان به کاری بسیار آسان و قابل پیکربندی تبدیل می‌کند. تنظیمات پیش‌فرض ایمیل را می‌توانید در فایل config/mail.php مشاهده کنید:

هنگامی که از ارسال ایمیل صحبت می‌کنیم، لاراول از درایورهای مختلفی پشتیبانی می‌کند. چنان که می‌بینید MAIL_DRIVER پیش‌فرض به صورت stmp تنظیم شده است. اگر قصد دارید از درایور stmp برای ارسال ایمیل استفاده کنید، در این صورت به مجموع تنظیمات دیگری مانند MAIL_HOST ،MAIL_PORT ،MAIL_ENCRYPTION ،MAIL_USERNAME و MAIL_PASSWORD هم نیاز خواهید داشت.

از سوی دیگر اگر قصد دارید از درایور sendmail استفاده کنید، در این صورت باید مطمئن شوید که مسیر سیستم sendmail در فایل config/mail.php به مقدار صحیحی تنظیم شده است.

همچنین می‌توانید آدرس from را که در زمان ارسال ایمیل‌ها با کلید from استفاده می‌شوند، تنظیم کنید. در نهایت اگر می‌خواهید از رندرینگ ایمیل مبتنی بر Markdown استفاده کنید، می‌توانید این تنظیمات را زیر کلید markdown تنظیم کنید.

نکته جالب دیگر این است که می‌توانید از ارائه‌دهندگان سرویس‌های ایمیل شخص ثالث مانند Mailgun ،Mandrill ،SES و SparkPost نیز استفاده کنید. اگر از یکی از این سرویس‌ها استفاده می‌کنید، باید اطمینان حاصل کنید که تنظیمات مربوطه را در فایل config/services.php تعیین کرده‌اید.

بدین ترتیب یک مقدمه کوتاه در مورد تنظیمات مرتبط با API ایمیل در لاراول داشتیم. از این بخش به بعد قصد داریم یک مثال سفارشی را بررسی کنیم که روش ارسال ایمیل‌ها را نمایش می‌دهد.

ایجاد کلاس Mailable

در این بخش، کلاس Mailable را می‌سازیم که برای ارسال ایمیل استفاده می‌شوند. کلاس Mailable مسئول ارسال ایمیل‌ها با استفاده از mailer است که آن نیز در فایل config/mail.php پیکربندی شده است. در واقع لاراول از قبل یک دستور آرتیزان به صورت زیر دارد که امکان ایجاد یک قالب پایه را به ما می‌دهد:

این دستور یک قالب ایمیل خالی در آدرس app/Mail/DemoEmail.php ایجاد می‌کند که در قطعه کد زیر می‌توانید آن را ببینید:

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

دو متد مهم در کلاس mailable به نام‌های construct__ و build وجود دارند که به صورت سراسری پیاده‌سازی می‌شوند. متد construct__ برای مقداردهی اشیایی استفاده می‌شود که در قالب ایمیل قرار است استفاده شوند. از سوی دیگر متد build برای مقداردهی مقادیر خاص ایمیل مانند from، قالب view، پیوست ایمیل و نظایر آن استفاده می‌شود.

در این مورد، شیء demo$ را به صورت یک آرگومان سازنده ارسال می‌کنیم و آن را به مشخصه عمومی demo انتساب می‌دهیم. در متد build یک پیکربندی بندی خاص ایمیل را مقداردهی می‌کنیم.

From برای تعیین آدرس ایمیلی استفاده می‌شود که در آدرس فرستنده ایمیل درج خواهد شد.

با استفاده از متد view می‌توان قالب ایمیلی را تعیین کرد که در زمان ارسال کردن ایمیل با استفاده از کلاس mailable استفاده خواهد شد. در این مورد ما از mails.demo استفاده می‌کنیم و معنی آن این است که باید یک فایل قالب view در مسیر resources/views/mails/demo.blade.php بسازید.

سپس متد text برای راه‌اندازی نسخه متنی ساده‌ای از یک قالب ایمیل استفاده خواهد شد.

چنان که قبلاً اشاره کردیم متد construct__ برای راه‌اندازی شیءهایی استفاده می‌شود که در قالب ایمیل استفاده می‌شوند. می‌توان از متد with نیز استفاده کرد که امکان تنظیم داده‌های view یک پیام را فراهم می‌سازند. سپس از متد attach برای الصاق یک تصویر به پیام استفاده می‌کنیم.

البته ما باید یک قالب ایمیل ایجاد کنیم که در زمان ارسال ایمیل‌ها مورد استفاده قرار خواهد گرفت. در ادامه فایل resources/views/mails/demo.blade.php را با محتوای زیر ایجاد می‌کنیم:

همچنین یک نسخه متنی ساده از این فایل را در مسیر resources/views/mails/demo_plain.blade.php می‌سازیم:

بدین ترتیب کلاس mailable بنا به دلخواه ما تنظیم شده است، اما هنوز کار ما تمام نشده است، چون باید از یک facade به نام Mail برای ارسال عملی ایمیل‌ها استفاده کنیم. در بخش بعدی در مورد شیوه استفاده از facade به نام Mail برای ارسال ایمیل با استفاده از DemoEmail در کلاس mailable که هم اینک ایجاد کردیم توضیح خواهیم داد.

جمع‌بندی

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

یک فایل کنترلر در مسیر app/Http/Controllers/MailController.php با محتوای زیر می‌سازیم:

لازم به اشاره است که ما Facede موجود در مسیر Illuminate\Support\Facades\Mail که برای ارسال ایمیل استفاده می‌شود را نیز در این فایل include کرده‌ایم. در متد send گزاره زیر مسئول ارسال یک ایمیل با مقداردهی App\Mail\DemoEmail در کلاس Mailable است:

متد to در Facade به نام Illuminate\Support\Facades\Mail یک وهله از کلاس \Illuminate\Mail\PendingMail بازگشت می‌دهد که از قبل شامل یک mailer مناسب پیکربندی شده در فایل config/mail.php است.

در نهایت از متد send در کلاس Illuminate\Mail\PendingMail\ استفاده می‌کنیم که عملاً یک ایمیل را ارسال می‌کند.

برای تست کردن این پروژه نمونه، یک مسیر مرتبط را در فایل اضافه می‌کنیم:

در این مرحله می‌توانید URL زیر را اجرا کنید تا ببینید که مطابق انتظار کار می‌کند:

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

برای استفاده از این امکان باید مقدار MAIL_DRIVER را در فایل config/mail.php به log تنظیم کنید. سپس می‌توانید URL فوق‌الذکر را اجرا کرده و فایل لاگ را بررسی کنید و ببینید که آیا قالب ایمیل در آنجا لاگ شده است یا نه.

اگر همه چیز به درستی پیش برود، باید ببینید که یک ایمیل در فایل storage/logs/laravel.log لاگ شده است. این همه آن چیزی است که در مورد قابلیت ایمیل در لاراول می‌توان گفت و بدین ترتیب به انتهای این مقاله می‌رسیم.

سخن پایانی

در این مطلب به معرفی API ایمیل پرداختیم که از قابلیت‌های داخلی لاراول است و از گستره متنوعی از درایورهای ارسال ایمیل نیز پشتیبانی می‌کند. ما کار خود را با توضیح مفاهیم مقدماتی آغاز کردیم و کلاس mailable را پیاده‌سازی کردیم که یک جزء ضروری در API ایمیل در لاراول است. در انتها کلاس mailable را نیز با ایجاد یک کنترلر سفارشی تست کردیم تا طرز کار عملی آن را مشاهده کنیم.

اگر این مطلب برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند: