آیا میدانید که هر دقیقه نزدیک به 200 وبسایت به دنیای اینترنت اضافه میشود؟ این عدد حیرتانگیز است، اما یک واقعیت محسوب میشود و به همین دلیل است که هر کارآفرین و توسعهدهندهای باید در مورد روندهای مهم توسعه وب آگاهی داشته باشد.
در مجموع 200 میلیون وبسایت فعال در حال حاضر وجود دارد، اما مجموع وبسایتهای فعال و غیرفعال، ده برابر این عدد است. وبسایتها تأثیر بالایی روی بازار و کسبوکارها گذاردهاند. در واقع کسبوکارها امروزه از وبسایتها برای تثبیت حضور آنلاین خود به روشی قدرتمند بهره میگیرند.
این آمار نه تنها نشاندهنده منابع فراوان است، بلکه رقابت شدیدی که بین وبسایتها وجود دارد را نیز نشان میدهد. یکی از بهترین روشها برای پیشتازی در این رقابت، این است که همواره از بهروزترین روندهای طراحی وب آگاه باشید. دانستن این که چه روندهایی در آینده محبوب خواهند بود و پیادهسازی آنها در توسعه وب حائز اهمیت بالایی است.
فناوری به سرعت در حال تغییر است و هر روز شاهد پیشرفت هستیم. این بهروزرسانیها تأثیر بسیار مهمی در روش توسعه وب گذارده است. توسعهدهندگان باید همواره به دنبال روندهای جاری باشند و خودشان را به دانش روز مجهز کنند. در ادامه برخی از روندهای برتر توسعه وبسایت برای سال 2۰1۹ را مرور میکنیم.

مطالعهای که اخیراً اجرا شده نشان میدهد افراد، 85 درصد از زمان خود را صرف اپلیکیشنهای موبایل میکنند. «وباپلیکیشنهای پیشرونده» (Progressive Web Apps)، به صفحههای وبی گفته میشود که در دید کاربران مانند اپلیکیشن به نظر میرسند. اگر این صفحهها از پیش روی گوشی کاربر بارگذاری شده باشند، حتی میتواند بدون دسترسی به اینترنت نیز آنها را باز کند. کاربران در زمان استفاده از این وباپلیکیشنها بیشتر حس استفاده از اپلیکیشن را خواهند داشت تا مراجعه به یک وبسایت. هدف این وباپلیکیشنهای پیشرونده (PWA) این است که تجربیاتی «شبه بومی» (native-like) برای کاربران همه پلتفرمها ارائه کند.
گوگل در یک گزارش بیان کرده است که 53 درصد از بازدیدکنندگان سایت روی موبایل در صورتی که صفحهای در طی 3 ثانیه بارگذاری نشود آن را ترک میکنند. وباپلیکیشنهای پیشرونده این مشکل را به طور کامل حل کردهاند. این وباپلیکیشنها مزیتهای اپلیکیشنهای وب و نیتیو را در خود جمع کردهاند و حس خوبی به کاربران میدهند. کاربران در زمان استفاده از آنها حس استفاده از یک اپلیکیشن را خواهند داشت که نیازی به نصب هم ندارد.
PWA تجربه تمام صفحه به کاربران میدهد و URL وبسایت قابل مشاهده نیست. بدین ترتیب هویت برند به روشی قدرتمندتر نمایش پیدا میکند. PWA-ها برای شبیهسازی اپلیکیشنهای نیتیو، امکان پوش نوتیفیکیشن را نیز در اختیار کاربران گذاشتهاند. ناشر دسترسی کاملی روی این پوش نوتیفیکیشنها خواهد داشت و میتواند در موارد مقتضی آنها را مستقیماً به گوشی کاربر ارسال کند.
بدین ترتیب کاربران میتوانند هر زمان که لازم بود به وبسایت اتصال یابند و مجدداً با آن تماس پیدا کنند. این وضعیت عموماً در وبسایتهای معمولی امکانپذیر نیست. کاربران میتوانند این محتوای وب را با هر اپلیکیشنی که در گوشی موبایل خود دارند به اشتراک بگذارند. این اشتراکگذاری محدود به اپلیکیشنهایی مانند توییتر و فیسبوک نیست.
کاربران میتوانند همه این کارها را بدون نیاز به اتصال اینترنتی و از طریق PWA-ها اجرا کنند. اینها برخی از دلایل مهمی است که چرا باید به PWA-ها اهمیت بدهیم. همه محتوایی که روی PWA منتشر میکنید، حتی زمانی که کاربران اتصال اینترنت ندارند نیز در اختیار آنها خواهد بود.

محبوبیت چتباتها، این روزها بسیار افزایش یافته است. این برنامهها برای تعامل با انسان طراحی شدهاند. برخی چتباتها طوری طراحی شدهاند که به سؤالات ساده پاسخ دهند و برخی دیگر میتوانند به سؤالات پیچیده نیز به سهولت پاسخ دهند.
چتباتها یکی از محبوبترین روندهای توسعه وب محسوب میشوند. یکپارچهسازی آنها در وبسایتها به تولید ترافیک بیشتر و خوشایندتر ساختن سایت کمک زیادی میکند. چتباتها تأثیر بسیار بیشتر از آن چه بتوان تصور کرد میگذارند. کاربران این روزها به دنبال راهحلهای سریع هستند و هیچ تمایلی به صرف زمان خود برای بارگذاری یا هر مشکل دیگر از این دست ندارند. یک تأخیر کوچک در پاسخ دادن به سؤال میتواند منجر به ترک وبسایت شود.
بهترین کاری که میتوان در این وضعیت انجام داد، ادغام یک چتبات در وبسایت است. این چتباتها به سؤالاتی که مشتریها دارند پاسخ میدهند. بدین ترتیب دیگر نیازی به آزمودن میزان صبر مشتریان وجود ندارد.
فشاری که در بحث تجربه کاربری روی توسعهدهندههای وب وجود دارد بسیار بالا است. این افراد همواره در تقلا برای ارائه تجربه تماس بهتر کاربران با وبسایت هستند و میخواهند تجربه مثبتتری در آنها ایجاد کنند.
چتباتها در این مسیر کمک زیادی به توسعهدهندگان میکنند. انتظارات مشتریان بالا است و گرچه نمیتوان هر آن چه را که میخواهند در اختیار آنها قرار داد، اما این چتباتها میتوانند منبع مورد اطمینانی در این زمینه باشند. چتباتها کاربر را مطمئن میسازند و به طور همزمان به سؤالات آنها نیز پاسخ میدهند. چتباتها نهایت آرزوی توسعهدهندههای وب هستند.
این روند در سال 2016 بسیار محبوب شد و همچنان با موفقیت در حال اجرا است و به تغییر و تحول خود ادامه میدهد، زیرا چتباتها تفاوت زیادی در توسعه وب ایجاد کردهاند. جدیدترین پیشرفتهای هوش مصنوعی و یادگیری ماشین نیز تفاوت عظیمی در این تعاملها ایجاد کردهاند. آینده چتباتها و هوش مصنوعی در فضای کسبوکار بسیار روشن است.

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

این روزها تعداد افرادی که گوشیهای هوشمند دارند بسیار افزایش یافته است. با توجه به افزایش کاربران تلفن موبایل، گوگل سرویسی به نام «صفحات پرشتاب موبایل» (Accelerated Mobile Pages) راهاندازی کرده است که امکان بارگذاری آنی صفحههای وب را فراهم ساخته است.
این صفحهها طوری طراحی شدهاند که روی دستگاههای موبایل عملکرد روانی داشته باشند. گوگل همواره بیان کرده است که به صفحههای وبی نیاز داریم که دارای محتوای غنی از قبیل ویدئو، انیمیشن و گرافیک باشند و بدین ترتیب میتوانند همراه با تبلیغات هوشمند کار کنند. این محتوا باید در حد امکان در سریعترین زمان بارگذاری شود.
افراد زمان زیادی برای منتظر ماندن جهت بارگذاری یک صفحه وب ندارند. در واقع کاربران صفحه وبی را که سریع بارگذاری نمیشود رها میکنند و وبسایت دیگری را باز میکند. برای جلوگیری از وقوع چنین موقعیتهایی لازم است که توسعهدهندگان از سرویس صفحههای پرشتاب موبایل استفاده کنند.
این فرصتی عالی برای توسعهدهندگان وب است تا سرعت بارگذاری موبایل وبسایت را بهبود ببخشند و ترافیک بیشتری به دست آورند.

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

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

از سال 2008 تا به اکنون، کوئریهای جستجوی صوتی 35 برابر افزایش یافتهاند. بر اساس یک پیمایش که از سوی Hubspot اجرا شده، 19 درصد از افراد روزانه دستکم یک بار از Siri استفاده میکنند و تعداد نوجوانهایی که از جستجوی صوتی استفاده میکنند بسیار بالاتر است. وبسایت شما باید به روشی طراحی شده باشد که امکان جستجوی صوتی به صورت بهینه در آن وجود داشته باشد.
جستجوی صوتی در موتورهای جستجوی مختلف ممکن است. Siri ،Cortana ،Google Assistant ،Echo و Alexa این جستجوهای صوتی را افزایش میدهند. به مرور افراد بیشتری علاقهمند به شروع جستجوهای صوتی هستند و وبسایتهایی که امکان جستجوی صوتی بهینهای ارائه میکنند، در زمانی که افراد جستجوی صوتی میکنند در رتبههای بالاتری نمایش پیدا میکنند.
اگر واقعاً میخواهید وبسایتتان متمایز باشد، در این صورت مهم است که آن را برای رعایت الزامات جستجوی صوتی بهینهسازی کنید.
توسعه یک وبسایت به زمان زیادی نیاز ندارد، اما اگر میخواهید یک وبسایت عالی ایجاد کنید، باید زمان و تلاش زیادی را صرف بهینهسازی آن بکنید. بنابراین باید زمان بیشتری برای درک جدیدترین روندهای توسعه وب و یادگیری روش پیادهسازی آنها بکنید.
روندهای آینده توسعه وب که در این مقاله معرفی کردیم، به شما کمک میکنند که وبسایت خود را در میان رقبا برجسته کنید. بدین ترتیب میتوانید انتظارهای کاربران را از طریق پیادهسازی جدیدترین روندهای توسعه وب در وب اپلیکیشن خود برآورده سازید.
در این مقاله قصد داریم به توضیح شیوه یکپارچهسازی صفحه ورود گوگل در وبسایت PHP بپردازیم. ما از API به نام OAuth گوگل استفاده میکنیم که روشی آسان و قدرتمند برای ورود به یک وبسایت با حساب گوگل محسوب میشود.
شما به عنوان یک کاربر وب، احتمالاً دردسر مدیریت حسابهای مختلف در وبسایتهای گوناگون را تجربه کردهاید. این مشکل به طور خاص در مواردی که چندین رمز عبور برای سرویسهای مختلف وجود داشته باشد و وبسایت از شما بخواهد حساب دیگری در آن بسازید تشدید میشود.
برای حل این مشکل میتوان وبسایتی طراحی کرد که در آن کاربران بازدیدکننده بتوانند با استفاده از اطلاعات کاربری موجود خود در گوگل یک حساب باز کنند. وبسایتهای زیادی امروزه به کاربرانشان اجازه میدهند که با استفاده از حسابهایشان در گوگل، فیسبوک یا برخی دیگر از سرویسهای شخص ثالث وارد وبسایت آنها شوند. این یک روش راحت برای کاربران جدید است تا به جای طی مراحل ثبت نام یک حساب جدید با نام کاربری و رمز عبور جدیدی که باید به خاطر سپرده شود؛ به سادگی به کمک اطلاعات موجود حساب کاربریشان در سرویس گوگل یا فیسبوک ثبت نام کنند.
ما در این مقاله از API ورود OAuth گوگل استفاده میکنیم تا کاربران وبسایتمان بتوانند با استفاده از اطلاعات حساب گوگل خود وارد وبسایت ما شوند. البته کاربران همچنان میتوانند با استفاده از فرم ثبت نام معمولی وبسایت ثبت نام کنند، اما ارائه سرویس ورود گوگل یا چیزی مانند آن میتواند به حفظ نرخ «نگهداشت کاربر» (user retention) کمک کند.
در ابتدا باید درکی کلی از گردش کار ورود گوگل در سایت داشته باشیم. در صفحه ورود وبسایت، دو گزینه وجود دارد که کاربران میتوانند از آنها برای ورود به حساب خود استفاده کنند. گزینه نخست برای عرضه نام کاربری و رمز عبور و مختص کسانی است که قبلاً از این مسیر در وبسایت حساب باز کردهاند. گزینه دوم جهت ورود با استفاده از اطلاعات حساب گوگل موجود کاربران است.
زمانی که کاربر روی دکمه Login With Google کلیک کند، یک گردش کار ورود گوگل آغاز میشود که کاربر را به سایت گوگل میبرد تا وارد حساب خود شود. هنگامی که کاربر به صفحه مربوطه منتقل شود، اطلاعات حساب گوگل خود را وارد میکند و سپس به صفحه «کسب رضایت» (consent) هدایت خواهد شد. در صفحه کسب رضایت از کاربر سؤال میشود که آیا اجازه اشتراک اطلاعات حساب گوگل خود با وبسایت شخص ثالث را میدهد. در این حالت وبسایت شخص ثالث همان سایتی است که کاربر میخواهد با اطلاعات حساب گوگل خود در آن وارد شود. کاربر در این مرحله دو گزینه دارد: یا موافقت و یا مخالفت میکند.
زمانی که کاربر اجازه اشتراک اطلاعات حساب گوگل خود با وبسایت شخص ثالث را بدهد، به همان وبسایت اولیه که فرایند ورود گوگل را از آنجا آغاز کرده بود، بازمیگردد.
در این مرحله، کاربر با استفاده از حساب گوگل خود وارد وبسایت شده و سایت شخص ثالث به اطلاعات پروفایل کاربر دسترسی دارد و میتواند با این اطلاعات یک حساب برای وی باز کرده و کاربر را وارد حساب خود در وبسایت بکند.
در این بخش با مراحل تنظیم ابتدایی که برای یکپارچهسازی ورود گوگل در یک وبسایت PHP مورد نیاز است آشنا خواهیم شد.
قبل از هر چیز باید یک اپلیکیشن در حساب گوگل خود بسازیم تا امکان ثبت سایتمان در گوگل را به دست آوریم. بدین ترتیب امکان تنظیم اطلاعات مقدماتی در مورد وبسایت و چند مورد از جزییات فنی دیگر را نیز به دست میآوریم.
زمانی که وارد حساب گوگل خود شدید، به صفحه «کنسول توسعهدهندگان گوگل» (Google Developers Console) (+) بروید. بدین ترتیب صفحه داشبورد گوگل چنان که در تصویر زیر ملاحظه میکنید، باز میشود:

در منوی سمت چپ روی لینک Select a project کلیک کنید. بدین ترتیب پنجرهای که در تصویر زیر مشاهده میکنید، باز میشود:

روی لینک New Project کلیک کنید و نام پروژه و جزییات دیگر را در آن وارد کنید. جزییات ضروری را مطابق تصویر زیر وارد کنید:

روی دکمه Create کلیک کنید تا پروژه جدید ذخیره شود. بدین ترتیب به صفحه Dashboard هدایت میشوید. در آنجا در نوار کناری سمت چپ روی Credentials کلیک کنید و به برگه OAuth consent screen بروید:

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

روی Client credentials > OAuth client ID کلیک کنید تا یک مجموعه جدید از اطلاعات ورود برای اپلیکیشن ایجاد شود. بدین ترتیب صفحهای ظاهر میشود که در آن باید گزینه مناسب را انتخاب کنید. در این مورد گزینه Web application را انتخاب میکنیم و روی دکمه Create کلیک میکنیم. از شما خواسته میشود که چند اطلاعات دیگر را نیز در مورد اپلیکیشن خود وارد کنید.

جزییاتی که در تصویر فوق میبینید را وارد کنید و آن را ذخیره کنید. البته شما باید Redirect URI را نیز در تنظیمات اپلیکیشن تنظیم کنید. این همان آدرسی است که کاربر پس از وارد شدن به آن باز هدایت خواهد شد.
در این زمان، یک اپلیکیشن کلاینت OAuth2 گوگل ایجاد کردهایم و اینک میتوانیم از این اپلیکیشن برای یکپارچهسازی ورود گوگل در وبسایت خود استفاده کنیم. توجه داشته باشید که مقادیر Client ID و Client Secret در زمان پیکربندی اپلیکیشن در سمت وبسایت مورد نیاز خواهند بود. شما میتوانید هر زمان با مراجعه به اپلیکیشن خود در وبسایت «کنسول توسعهدهندگان گوگل» به این اطلاعات دسترسی داشته باشید.
در این بخش باید کتابخانه کلاینت SDK گوگل مربوط به PHP را نصب کنیم. دو روش به این منظور وجود دارد:
اگر ترجیح میدهید کتابخانه مزبور را از طریق Composer نصب کنید، کافی است دستور زیر را اجرا کنید:
composer require google/apiclient:"^2.0"
به همین راحتی کتابخانه SDK گوگل نصب میشود.
اگر میخواهید از کامپوزر استفاده نکنید، میتوانید آخرین نسخه پایدار کتابخانه مربوطه را از صفحه رسمی API (+) دانلود کنید. ما در این مقاله از روش کامپوزر استفاده کردیم.
اگر گام به گام با ما همراه بودهاید، اکنون موفق شدهاید اپلیکیشن گوگل را پیکربندی کرده و کتابخانه API کلاینت PHP گوگل را نصب کنید. در بخش بعدی شیوه استفاده از این کتابخانه در وبسایت PHP را بررسی میکنیم.
اگر به خاطر داشته باشید، وقتی در بخش قبلی مشغول پیکربندی اپلیکیشن گوگل بودیم، از ما درخواست شد که redirect URL را در پیکربندی اپلیکیشن وارد کنیم و ما آن را طوری تنظیم کردیم که به آدرس http://localhost/redirect.php باز هدایت شود. اینک زمان آن رسیده است که فایل را بسازیم.
بدین ترتیب فایل را با محتوای زیر ایجاد کنید:
در ادامه بخشهای کلیدی کد فوق را بررسی میکنیم.
نخستین کاری که باید در فایل انجام دهیم، گنجاندن فایل autoload.php است. این بخشی از کامپوزر است و ما را مطمئن میسازد که کلاسهایی که در اسکریپت خود استفاده میکنیم به صورت خودکار بارگذاری میشوند.
require_once 'vendor/autoload.php';
سپس یک بخش پیکربندی وجود دارد که در آن پیکربندی اپلیکیشن با تنظیم موارد مقتضی مقداردهی میشود. البته توجه داشته باشید که شما باید جاهای خالی را با مقادیر مربوط به خود پر کنید.
در بخش بعدی شیء Google_Client مقداردهی میشود که از آن برای اجرای کارهای مختلفی استفاده میشود. همراه با این کار تنظیمات اپلیکیشن را نیز مقداردهی میکنیم.
سپس دامنههای ایمیل و پروفایل را نیز اضافه میکنیم تا کاربر پس از ورود به اطلاعات ابتدایی پروفایل خود دسترسی داشته باشد.
در نهایت یک بخش از کد داریم که گردش کار ورود را اجرا میکند.
ابتدا بخش else را بررسی میکنیم. این بخش زمانی تحریک میشود که مستقیماً به اسکریپت دسترسی داشته باشید. این بخش یک لینک را نمایش میدهد که کاربر را به صفحه ورود گوگل هدایت میکند. لازم به ذکر است که ما از متد createAuthUrl در شیء برای ساختن URL مربوط به OAuth استفاده کردهایم.
پس از کلیک کردن روی لینک ورود گوگل، کاربر به وبسایت گوگل هدایت میشود تا اطلاعات مربوطه را وارد کند. زمانی که کاربر وارد حساب خود در گوگل شد، با ارسال متغیر رشته کوئری code دوباره به وبسایت بازمیگردد. این همان زمانی است که کد PHP در بلوک if اجرا میشود. ما از این کد برای مبادله توکن دسترسی استفاده میکنیم.
زمانی که توکن دسترسی را به دست بیاوریم، میتوانیم از سرویس Google_Service_Oauth2 برای واکشی اطلاعات پروفایل کاربر وارد شده استفاده کنیم.
بدین ترتیب در این روش به اطلاعات پروفایل کاربری که از طریق حساب گوگل وارد شده دسترسی خواهیم داشت. میتوان از این اطلاعات برای ایجاد حساب در سایت استفاده کرد و یا این که آنها را در یک «نشست» (Session) ذخیره کرد. اساساً این به شما بستگی دارد که از اطلاعات برگشتی از گوگل چگونه استفاده کنید.
در این مقاله، به بررسی شیوه یکپارچهسازی ورود گوگل با وبسایت PHP پرداختیم. این کار به کاربران امکان میدهد در صورتی که نمیخواهند حساب دیگری روی سرویس شما ایجاد نکنند، با حسابهای موجود گوگل خود وارد وبسایت شما بشوند.
متلب (MATLAB) یک محیط محاسباتی و زبان برنامهنویسی است که کاربردهای فراوانی در رشتههای مختلف علوم و مهندسی دارد. واژه MATLAB از دو واژه انگلیسی MATRIX به معنای ماتریس و LABORATORY به معنای آزمایشگاه تشکیل شده است، زیرا در آن مبنای محاسبات ماتریسها هستند. در این آموزش با برنامه نویسی متلب آشنا خواهیم شد.
همانطور که میدانید، مهمترین نکته در برنامهنویسی، به هر زبانی، توانایی یادگیری و پیادهسازی الگوریتمها است. بنابراین، پیش از آنکه برنامهنویسی را آغاز کنید باید با مفاهیم و مقدمات الگوریتمها آشنایی داشته باشید.
در این آموزش، برنامهنویسی متلب را به صورت گام به گام بیان میکنیم؛ بدین ترتیب که ابزارها و دستورات اساسی برنامهنویسی در متلب را در قالب سادهترین مثالها ارائه خواهیم کرد. همانطور که گفتیم، این آموزشِ گام به گام مبتنی بر مثال است و برای یادگیری باید هر یک از برنامهها را در متلب نوشته و آن را اجرا کنید. محتوای این آموزش در هفت بخش ارائه میشود.
بخش اول شامل برنامههای سادهای است که برای آشنایی با برنامهنویسی در متلب ارائه شدهاند. در بخش دوم و سوم، شیوه نوشتن حلقهها و شروط در متلب بیان شده است. بخش چهارم به آرایهها و ماتریسها اختصاص دارد و در بخش پنجم نحوه رسم نمودار در متلب ارائه گردیده است. علاوه بر توابع از پیش تعریف شده متلب، کاربر نیز میتواند بسته به نیاز، توابع مورد نظر خود را تعریف کند. در بخش ششم، تعریف توابع توسط کاربر ارائه شده است. در نهایت، در بخش هفتم چگونگی استفاده از فایلها و دستورهای خارجی برای ورودی و خروجی بیان شده است.
توجه کنید که در ادامه، وقتی میگوییم برنامهای را بنویسید و یا اجرا نمایید، میتوانید یکی از این دو کار را انجام دهید:

نکته دیگری که دانستن آن به شما کمک خواهد کرد این است که متلب توابع از پیش تعریف شده زیادی دارد. اگر با عملکرد تابعی آشنایی ندارید، کافی است در Command Window از یکی از دو دستور “help” یا “doc” استفاده کنید. بدین صورت که کلمه help یا doc را نوشته و بعد از یک فاصله نام تابع مورد نظرتان را بنویسید و کلید Enter را فشار دهید. با اجرای این دستورات، تفاوت help و doc را خواهید دید.
این بخش شامل چند برنامه ساده برای آشنایی با برنامهنویسی در متلب است.
برنامه زیر را بنویسید و آن را اجرا کنید.
خروجی این برنامه ۸ خواهد بود.
توجه کنید که نقطه ویرگول (;) در انتهای هر دستور برای جلوگیری از نمایش بصری خروجی به کار میرود. به عبارت دیگر، با گذاشتن نقطه ویرگول در انتهای هر دستور، آن خط از برنامه اصطلاحاً در حالت سکوت قرار میگیرد و در خروجی نمایش داده نمیشود. البته عملیات مورد نظر به صورت کامل انجام میشود. برای کد بالا به سادگی میتوانید نقطه ویرگول بگذارید و نتیجه را ببینید.
در متلب و هر زبان برنامهنویسی دیگر، عبارت «a = b» به معنای «a مساوی با b است» نیست. در واقع، این عبارت محتوای b را در a قرار میدهد. برای تحقیق این مورد، برنامه زیر را بنویسید و نتیجه را ببینید.
احتمالاً همانطور که دیدهاید، نتیجه 3 خواهد بود.
در واقع باید «متغیرهای» a و b را به عنوان دو ظرف در نظر بگیرید که برچسبهای a و b دارند. در خط اول برنامه، عدد 3 را در ظرف aقرار دادهایم و در خط بعدی محتوای ظرف a (همان 3) را در طرف b ریختهایم. توجه کنید که در این صورت، محتوای a تغییری نمیکند. خط سوم نیز محتوای b را نمایش میدهد.
برنامه زیر را اجرا کنید.
میبینیم که خروجی ۵3 است. سمت راست خط سوم برنامه شامل چهار عملگر اصلی ریاضی + (جمع)، – (تفریق)، * (ضرب) و / (تقسیم) است. همچنین نماد ^ به معنی «به توانِ» است؛ بنابراین، عبارت “b^2” یعنی b به توانِ 2.
برنامه زیر را بنویسید و اجرا کنید.
خروجی این برنامه 4 است. در خط اول، عدد 3 به متغیر a تخصیص داده میشود. در خط دوم، ابتدا سمت راست (4=1+3) محاسبه شده و بعد از آن به متغیر a تخصیص داده میشود. یعنی عدد 4 جایگزین 3 میشود.
برنامه زیر را بنویسید و اجرا کنید.
خروجی این کد به صورت زیر خواهد بود:
Hello
برنامه زیر را بنویسید و اجرا کنید.
خروجی این کد به صورت زیر خواهد بود:
دستور “fprintf” برای خروجی فرمت شده است. این خروجی در رشته اول درون این دستور در ‘…’ نوشته شده است. عبارت “4u%” (عدد صحیح 4 رقمی) و “6.4f%” (عدد حقیقی که تا 4 رقم اعداد نشان داده میشود) فرمت متغیرهای خروجی را نشان میدهند. دستور “sqrt” در خط چهارم برنامه تابعی است که از متغیر جذر میگیرد.
برنامه زیر را در متلب بنویسید و آن را اجرا کنید.
خروجی این برنامه به صورت زیر است:
4 15 11
هر دو متغیر a و b آرایههایی با سه عنصر یا درایه هستند. در خط سوم، عمل “a+b” درایهها یا عناصر متناظر را با یکدیگر جمع میکند.
برنامه زیر را اجرا کنید.
خروجی این برنامه c = 11 است.
اگر b یک آرایه یک بعدی باشد، (b(n درایه nاُم این آرایه خواهد بود. از آنجایی (a(2 برابر با ۶ و (b(4 برابر با ۵ است، نتیجه خط سوم برنامه c=6+5 =11 خواهد بود.
برنامه زیر را بنویسید و اجرا کنید.
خروجی این برنامه c=12 است. همانطور که میبینیم، بخشهایی از برنامه که قبل از آنها علامت % قرار میگیرد، تأثیری در اجرای برنامه ندارد و برای نوشتن یادداشتها و نکات مربوط به کد از آن استفاده میشود.
برنامه زیر را اجرا و نتیجه را بررسی کنید.
گاهی یک خط یک برنامه طولانی میشود و لازم است برای جلوگیری از بینظمی و درهمریختگی کد، بخشی از آن را به خط بعد منتقل کنیم. برای این کار از سه نقطه “…” بین دو بخش استفاده میکنیم. در حقیقت، کد بالا با کد زیر یکسان است:
برنامه زیر را بنویسید و آن را اجرا کنید.
با اجرای این برنامه با پیغام زیر مواجه خواهید شد:
.’Undefined function or variable ‘c1
این خطا به این دلیل است که متغیر “c1” دیگر وجود ندارد. شما با دستور “clear” این متغیر از حافظه کامپیوترتان حذف کرهاید. توجه کنید که دستور “clear” فقط محتویات متغیر را حذف نمیکند، بلکه خود متغیر را کاملاً حذف میکند. گاهی پیش میآید که برنامهای مینویسید و در آن متغیری دارید که اندازه آن بزرگ است و حافظه را اشغال میکند. با استفاده از دستور “clear” میتوانید آن را حذف کنید. اگر دستور “clear” را بنویسید و بعد از آن نام چند متغیر را (با یک فاصله از هم) بنویسید، همه آن متغیرها حذف خواهند شد. برنامهای بنویسید و این مورد را بررسی کنید.
به سادگی میتوان توابع و ثوابت معروف ریاضی را در متلب نوشت. برای مثال، برنامه زیر را بنویسید.
خروجی اجرای این برنامه y=1 و z=0.3679 است. همانطور که میبینید، میتوانیم تابعِ تابع و بیشتر از آن را نیز بنویسیم. ابتدا داخلیترین تابع محاسبه میشود و به سمت خارجیترین تابع ادامه پیدا میکند. این مورد را برای برنامه بالا بررسی کنید.
متغیرهای متلب نسبت بین حروف بزرگ و کوچک تمایز قائل میشوند. برای مثال “FARADARS” و “faradars” دو متغیر متفاوت هستند. در نامگذاری متغیر میتوان از زیرین خط یا آندرلاین (_) و یا اعداد نیز به عنوان بخشی از نام نیز استفاده کرد. برای مثال، “FDS_125” یک نام متغیر قابل قبول است. برخی نامها مربوط به ثوابت خاصی هستند که در متلب تعریف شدهاند و مقدار ثابتی دارند. مثلاً “pi” برابر با …3.14159 است.
برنامه زیر را بنویسید و نتیجه اجرای آن را ببینید.
خروجی این برنامه شکل زیر است:

خط اول برنامه معادل با بردار [x=[0 0.1 0.2 0.3 … 19.8 19.9 20 است. به این ترتیب، این آرایه 101 عنصر دارد. به عبارت دیگر، “0:0.1:20” به این معنی است که این آرایه از عدد ۰ شروع شده و در هر گام به اندازه مجموع عدد قبلی و 0.1 یک عدد تولید میکند تا به انتهای بازه، یعنی 2۰، برسد. خط دوم برنامه آرایه y را برحسب x محاسبه میکند:
[((y = [sin(x(1)) sin(x(2)) sin(x(3)) … sin(x(200)) sin(x(201
یا
[(y = [sin(0) sin(0.1) sin(0.2) … sin(19.9) sin(20
خط سوم نیز y را برحسب x رسم میکند.
حلقهها بخش مهمی از برنامهنویسی را تشکیل میدهند. در این بخش با شیوه نوشتن حلقهها در متلب آشنا میشویم.
برنامه زیر را بنویسید و نتیجه را ببینید.
نتیجه به صورت زیر خواهد بود:
3
3
3
3
3
سه خط آخر برنامه بالا یک «حلقه for» را تشکیل میدهند. عبارت اصلی بین دو بخش “for k=1:5” و “end” قرار گرفته و وقتی متغیر k با گام 1 از 1 تا ۵ تغییر میکند، عدد مورد نظر ۵ بار تکرار میشود.
برنامه زیر را بنویسید و اجرا کنید.
خروجی این برنامه به صورت زیر است:
3
9
27
81
243
این خروجیها به صورت 1^3، 2^3، 3^3، 4^3 و ۵^3 محاسبه شدهاند. همانطور که میبینیم، در هر تکرار، مقدار k تغییر میکند و مقدار متناظر با هر تکرار برای محاسبه به کار میرود.
برنامه زیر را اجرا کنید.
خروجی این برنامه 45 است. در واقع، این عدد به صورت 9+8+7+6+5+4+3+2+1 محاسبه شده است. سعی کنید این برنامه را با توجه به مواردی که در بالا یاد گرفتهاید تحلیل کنید.
برنامه زیر را بنویسید و اجرا کنید.
خروجی این برنامه 2۵ است که از مجموع 9+7+5+3+1 به دست آمده است. دستور “for k = 1:2:9” به این معنی است که فقط ۵ بار در حلقه حرکت میکنیم. ابتدا 1=k است. در تکرار بعدی 2+1=k خواهد بود و به همین ترتیب ادامه مییابد تا به ۹ برسد.
برنامه زیر را بنویسید.
خروجی این کد 24 است که به صورت زیر محاسبه شده است:
sum1 = b(1)+b(2)+b(3)+b(4) = 3+8+9+4 = 24
برنامه زیر را اجرا کنید.
خروجی این برنامه عدد 1۹ است و به صورت زیر محاسبه شده است:
sum1 = b(1)+b(3)+b(5) = 3+9+7 = 19
برنامه زیر را اجرا کنید و با توجه به نکاتی که آموختهاید سعی کنید آن را تحلیل کنید.
خروجی این برنامه 1۸ است و به صورت زیر محاسبه میشود:
Sum1 = 1*1+1*2+1*3 +2*1+2*2+2*3 = 18
برنامه زیر را بنویسید و اجرا کنید.
خروجی این برنامه به صورت زیر است:
n = 1 m = 1
n = 1 m = 2
n = 1 m = 3
n = 2 m = 1
n = 2 m = 2
n = 2 m = 3
برنامه زیر را بنویسید و آن را تحلیل کنید.
خروجی این برنامه 24 است و طبق رابطه زیر محاسبه میشود:
((sum1 = b(c(1))+b(c(2))+b(c(3))+b(c(4
(b(2)+b(3)+b(5)+b(7 =
5+7+9+3 =
24 =
در این بخش چگونگی تعریف شروط در برنامه را معرفی میکنیم.
برنامه زیر را اجرا کنید.
خروجی این کد به صورت زیر نمایش داده میشود:
اگر در برنامه تغییر ایجاد کرده و عبارت “;num1=3” را جایگزین خط اول کنیم، خروجی به صورت زیر نمایش داده میشود:
همانطور که متوجه شدهاید، در این برنامه، اگر num1 بزرگتر از ۵ باشد، عبارت “(fprintf(‘%4u is greater than 5 \r’, num1” اجرا میشود، و در غیر این صورت، کد “(fprintf(‘%4u is less than or equal to 5 \r’, num1” اجرا خواهد شد.
برنامه زیر را بنویسید و آن را اجرا کرده و نتیجه را تحلیل کنید.
در اینجا با استفاده از برنامهنویسی متلب یک مثال کاربردی را حل میکنیم. میخواهیم برنامهای بنویسیم که تعیین کند یک سال میلادی مشخص کبیسه است یا خیر. برنامه زیر را بررسی کنید. در تقویم میلادی نو سالهایی که بر 4 بخشپذیر باشند (باقیماندهٔ تقسیم آن سال بر 4 برابر ۰ باشد) کبیسه هستند، با این استثنا که از میان سالهایی که بر 1۰۰ بخشپذیرند (سالهای انتهای سده)، تنها آنهایی که بر 4۰۰ نیز بخشپذیرند کبیسه هستند.
خروجی برنامه بالا به صورت زیر است:
سعی کنید سالهای مختلف را در برنامه وارد کرده و نتایج را بررسی کنید.
در خط چهارم برنامه، “&” به معنی «وَ» است. بنابراین، هر دو شرط “(mod(nyaer,4) == 0)” و “(mod(nyear,100) ~= 0)” باید صحیح باشند تا دستور “(fprintf(‘%6u is a leap year’, nyear” اجرا شود. به طور مشابه، خط عمودی “|” نیز به معنی «یا» است.
همچنین، نمادهای “=~” در خط چهارم به معنی «برابر نیست با» است. از این دست شروط، شش مورد وجود دارد که در دستورات شرطی برای مقایسه دو عدد با هم مورد استفاده قرار میگیرند. این عبارتها به شرح زیر هستند:
| A>B | A بزرگتر از B است. |
| A<B | A کوچکتر از B است. |
| A>=B | A بزرگتر یا مساوی B است. |
| A<=B | A کوچکتر یا مساوی B است. |
| A==B | A مساوی B است. |
| A~=B | A با B برابر نیست. |
تابع “(mod(A,B” باقیمانده تقسیم A بر B را نتیجه میدهد. برای مثال، mod(7,2) = 1 ،mod(10,4) = 2 و mod(25,5) = 0 است. بنابراین، اگر A بر B بخشپذیر باشد، mod(A,B) = 0 است. این تابع در بسیاری از کاربردهای مربوط به روشهای عددی مفید است.
برنامه زیر را در متلب بنویسید.
اگر این برنامه را اجرا کنید، خروجی به صورت زیر خواهد بود:
sum1 = 45
sum2 = 18
با تحلیل این برنامه خواهید دید که خروجیها به صورت زیر محاسبه شدهاند:
Sum1 = 1+2+3+4+5+6+7+8+9
sum2 = 3+6+9
برنامه زیر را در متلب بنویسید و آن را اجرا کنید.
خروجی این برنامه x = 243 است. اگر به مفهوم while دقت کنیم، میبینیم که ترکیبی از یک حلقه for و یک if است. در برنامه بالا، تا زمانی که شرط داخل پرانتز (x<100) برقرار باشد، محاسبه در حلقه انجام خواهد شد. بنابراین، مقادیر 3، ۹، 2۷، ۸1 و در نهایت 243 برای x محاسبه میشود و چون 243 بزرگتر از 1۰۰ است و دیگر شرط برقرار نیست، محاسبات ادامه پیدا نمیکند.
در این بخش، با نحوه کار کردن با ماتریسها و آرایهها آشنا میشویم.
برنامه زیر، جمع دو آرایه را نشان میدهد.
خروجی این برنامه به صورت زیر است:
c = 5 19 29
دو ماتریس را به صورت زیر جمع کنید و نتیجه را ببینید.
خروجی کد بالا به صورت زیر است:
c = 8 6
12 13
این برنامه، در حقیقت، عملیات زیر را انجام میدهد:
برنامه زیر را بنویسید و خروجی آن را بررسی کنید.
خروجی این برنامه به صورت زیر است:
b = 6 10
2 8
برنامه زیر را بنویسید و آن را اجرا کنید.
خروجی این برنامه به صورت زیر است:
c = 4 12 45
نقطه (.) قبل از عملگر ریاضی “*” عملیات را به صورت درایه به درایه انجام میدهد. در این حالت، c به صورت زیر محاسبه خواهد شد:
[(c = [a(1)*b(1) a(2)*b(2) a(3)*b(3
برنامه زیر را در متلب اجرا کنید:
همانطور که انتظار دارید، خروجی این برنامه برابر است با:
c = 10 3
7 8
برنامه زیر را در متلب بنویسید و به تفاوت آن با مثال قبل دقت کنید.
خروجی برنامه به صورت زیر است:
c = 31 8
33 9
مشاهده میکنیم که خروجی این مثال با خروجی مثال قبل تفاوت دارد. در واقع، در این مثال، ضرب ماتریسی انجام شده است.
برنامه زیر را اجرا کنید.
خروجی این برنامه به صورت زیر است:
b = 0.9092 0.1411 -0.9589
همانطور که میبینیم، خروجی برای هر درایه ورودی محاسبه شده و محتوای b به صورت زیر است:
[(sin(2) sin(3) sin(5]
برنامه زیر را بنویسید و اجرا کنید.
خروجی برنامه برابر است با:
b = 18 31 69
این خروجی به صورت زیر محاسبه شده است:
[b = [2*(a(1))^2+3*a(1)+4 2*(a(2))^2+3*a(2)+4 2*(a(3))^2+3*a(3)+4
برای آنکه محتوا و داریههای یک آرایه را تعیین کنیم، میتوانیم مشابه مثال زیر عمل نماییم.
اگر برنامه بالا را اجرا کنید، خواهید دید که خروجی آن به صورت زیر خواهد بود:
a = 0 0.5 1 1.5 2 2.5 3 3.5 4
برنامه زیر را بنویسید و اجرا کنید.
خروجی این برنامه c=9 است. برای ماتریس A، دستورهای زیر درایه مورد نظر از آن را استخراج میکنند:
A(1,1) = 3, A(1,2) = 5, A(2,1) = 2, A(2,2) = 4
برنامه زیر را بنویسید و سعی کنید با توجه به مطالبی که گفته شد، خط به خط آن را بررسی و تحلیل کنید.
خروجی این برنامه به صورت زیر است:
norm1 = 7.348
این برنامه نُرم اقلیدسی یک ماتریس را محاسبه میکند.
برنامه زیر را اجرا کنید.
نتیجه حاصل از این برنامه به صورت زیر است:
x = 1
5
4
این برنامه، معادله را حل میکند و پاسخ آن برابر است با: .
برنامه زیر را بنویسید و اجرا کنید:
خروجی این برنامه مشابه مثال قبل است. در اینجا “A\b” معادل همان ” inv(A)*b” است.
روشهای رسم نمودار در این بخش ارائه شده است.
برنامه زیر را در متلب اجرا کنید:
نتیجه اجرای این برنامه شکل زیر خواهد بود:

در دستور “(plot(a,b” آرایه “a” باید شامل دادههای محوری باشد که میخواهیم نمودار را بر حسب آن رسم کنیم (متناظر با محور x). آرایه “b” نیز باید متناظر با مقادیر محور y باشد.
بعد از آنکه نمودار را رسم کردیم، میتوانیم با ابزارهای تعاملی متلب آن را اصلاح کنیم. برای مثال، میتوانیم برچسب (نام) محورهای x و y را به صورت دستی به نمودار اضافه کنیم. همچنین میتوانیم نمودار را =با فرمتهای مختلف (مانند tif ،jpg ،eps و..) ذخیره کنیم.
برنامه زیر را اجرا و نتیجه را مشاهده کنید.
نتیجه اجرای برنامه بالا شکل زیر خواهد بود:

عبارت ‘or-‘ در دستور plot الگوی خط را تعیین کرده است. این عبارت منجر به خط ممتد با ترکیب نمادهای دایرهای شده است. رنگ این دایرهها سبز است. دلیل وجود این رنگ، نوشتن عبارت ‘g’ برای ‘MarkerFaceColor’ است. شرح یا همان legend نمودار نیز در گوشه بالایی سمت چپ قاب تصویر نوشته شده است. این کار با اختصاص ‘NorthWest’ برای ‘Location’ ایجاد شده است.
برنامه زیر را بنویسید و آن را اجرا کنید.
خروجی این برنامه، نمودار زیر است:

در برنامه بالا، اگر از دستور “hold on” استفاده نکنیم، دستور plot دوم در خط بعد، در قاب نمودار قبلی رسم میشود و نمودار قبلی را حذف میکند.
دستورات زیر را بنویسید و آن را اجرا کنید.
خروجی این برنامه شکل زیر است:

برنامه زیر را در متلب بنویسید و آن را اجرا کنید.
شکل حاصل از اجرای این برنامه به صورت زیر خواهد بود:

در این بخش، روشهای تعریف توابعی را که میتوانید برحسب نیازتان تعریف کنید و در توابع متلب وجود ندارند معرفی میکنیم.
ابتدا، یک برنامه متلب (New Script) را باز میکنیم. برای مثال، نام آن را myfunc1 قرار میدهیم و آن را با پسوند myfunc1.m ذخیره میکنیم. فرض کنید میخواهیم تابع را تعریف کنیم. این تابع به صورت زیر در متلب نوشته میشود:
متغیر “outcome” متغیری است که خودمان آن را تعریف کردهایم و از آن برای برقراری رابطه با پارامتر ورودی “x” استفاده میکنیم. بعد از آنکه تابع مورد نظر را تعریف کردیم، میتوانیم در برنامهها یا توابع دیگری که مینویسیم آن را فراخوانی کنیم. برای مثال، فرض کنید برنامهای با نام mainprog1.m به صورت زیر نوشتهایم:
خروجی این برنامه به صورت زیر است:
x = 0.10 f(x) = 7.3200
x = 0.20 f(x) = 7.6800
x = 0.30 f(x) = 8.0800
x = 0.40 f(x) = 8.5200
x = 0.50 f(x) = 9.0000
توجه کنید که تابعی که از آن استفاده میکنیم، باید در همان پوشهای از کامپیوتر ذخیره شده باشد که برنامه یا تابع اصلی قرار دارد. متلب به صورت اتوماتیک آن را پیدا کرده و ارتباط لازم بین همه توابع را برقرار میکند.
تابع زیر را با نام myfunc2.m در نظر بگیرید که به صورت زیر است:
همانطور که دریافتهاید، این برنامه تابع را تعریف میکند که ورودیهای آن، b ،a ،x و c هستند.
این تابع را در برنامه دیگری با نام mainprog2.m به کار میبریم:
خروجی برنامه اخیر به صورت زیر است:
x = 0.10 f(x) = 7.3200
x = 0.20 f(x) = 7.6800
x = 0.30 f(x) = 8.0800
x = 0.40 f(x) = 8.5200
x = 0.50 f(x) = 9.0000
در این بخش شیوه استفاده از فایلها و دستورات ورودی خارج از برنامه را بیان میکنیم. همچنین نحوه ایجاد فایلها و دستورات در خروجی را بیان خواهیم کرد.
برنامه زیر را بنویسید و نتیجه آن را ببینید:
این برنامه خروجی خاصی که مانند مثالهای قبل قابل رؤیت باشد تولید نمیکند. اما فایلی با نام “myoutput.txt” ایجاد میکند (در همان جایی که متلب ذخیره شده است). محتوای این فایل به صورت زیر است:
1 1 1
2 4 8
3 9 27
4 16 64
خط اول برنامه فایلی به نام ‘myoutput1.txt’ را باز میکند و نوع “W” به این معنی است که این فایل “write only” است. پس از اجزای فرمان، متلب یک فایل ID یا شناسه را انتخاب خواهد کرد (که یک عدد است) و آن را در متغیر fID1 قرار خواهد داد. کاربر نیازی به دانستن آن عدد ندارد، اما اگر یک خروجی برای آن فایل باشد، باید از آن به عنوان شناسه استفاده شود.
دستور “(fprintf(fID1,’%7u %7u %7u \r’,b1,b2,b3” خروجی را به فایلی با ID یا شناسه fID1 هدایت میکند.اگر ID فایل داده نشده باشد، فرمان کوتاه “(fprintf(‘%7u %7u %7u \r’,b1,b2,b3” خروجی را در مکان پیشفرض نشان خواهد داد.
برنامه زیر را در متلب بنویسید و آن را اجرا کنید.
نتیجه این کد به صورت زیر است:
1 + 1 + 1 = 3
2 + 4 + 8 = 14
3 + 9 + 27 = 39
4 + 16 + 64 = 84
فرض میکنیم فایل “myoutput1.txt” قبلاً توسط برنامه بخش 4۹ ایجاد شده است و به صورت صحیح در همان جایی که برنامه متلب را اجرا میکنیم ذخیره شده است. دستور نخست کد بالا، فایل “myoutput1.txt” را با وضعیت تعیین شده “r” به معنای “read only” باز میکند. دستور “(b = fscanf(fID1,’%7u%7u %7u \r’,3” یک رکورد را از فایل خارجی با ID=ID1 با استفاده از فرمت ‘%7u %7u %7u \r’ میخواند. عدد “3” بعد از این عبارت مشخص میکند که فقط 3 عنصر اول این رکورد خوانده شده و در آرایه “b” قرار داده میشوند.
برناامه زیر را بنویسید و اجرا کنید.
برنامه بالا حالتی خاصی از وقتی است که ورودی از یک فایل خارجی خوانده نمیشود، بلکه توسط کاربر و با یک خط فرمان وارد میشود. خروجی برنامه بالا به عددی بستگی دارد که کاربر وارد میکند (در متغیر “num1” ذخیره میگردد) که بزرگتر از 1۷ است یا کوچکتر از آن.
اگر بخواهیم ورودی یک رشته باشد (مثلاً “YES” یا “Fara Dars”)، باید از گزینه “s” استفاده کرده و آن را به دستور اضافه کنیم. برای مثال “(‘name1 = input(‘Enter your surname’, ‘s”.
در این مقاله، قصد داریم سیستم احراز هویت فریمورک لاراول را مورد بررسی قرار دهیم. هدف اصلی این مقاله ایجاد یک راهکار حفاظتی احراز هویت سفارشی در لاراول است که از طریق بسط سیستم احراز هویت مرکزی آن صورت میگیرد.
لاراول در هسته خود یک سیستم احراز هویت کاملاً پایدار دارد که پیادهسازی کارکرد احراز هویت را به سادگی امکانپذیر ساخته است. در واقع کافی است چند دستور آرتیزان اجرا کنید تا چارچوب یک سیستم احراز هویت آماده شود.
به علاوه خود سیستم طوری طراحی شده است که میتوان آن را بسط داد و به آداپترهای احراز هویت سفارشی نیز وصل کرد. این همان کاری است که قرار است در این مقاله انجام دهیم. پیش از آن که پا را فراتر گذارده و وارد جزییات پیادهسازی محافظ احراز هویت سفارشی شویم، کار خود را با بررسی عناصر ابتدایی سیستم احراز هویت آغاز میکنیم که محافظها و ارائه دهندهها هستند.
سیستم احراز هویت سفارشی لاراول از دو عنصر اصلی به نام «محافظ» (Guard) و «ارائه دهنده» (Provider) تشکیل یافته است.
محافظ را میتوان به چشم راهحل ارائه دهنده منطق برای شناسایی کاربران احراز هویت شده دید. لاراول در هسته مرکزی خود محافظهای مختلفی مانند «نشست» (Session) و «توکن» (Token) ارائه میکند. محافظ نشست، حالت کاربر را در هر درخواست به وسیله کوکی نگهداری میکند و در سوی دیگر محافظ توکن کاربر را از طریق یک توکن معتبر در هر درخواست احراز هویت میکند.
بنابراین چنان که میبینید محافظ، منطق احراز هویت را تعریف میکند و لزومی نیست که همیشه اقدام به بازیابی اطلاعات احراز هویت معتبر از بکاند بکند. شما میتوانید یک محافظ را که به سادگی حضور یک شیء خاص را در هدر درخواست بررسی میکند و کاربر را بر مبنای آن احراز هویت میکند پیادهسازی کنید.
در ادامه این مقاله ما یک محافظ پیادهسازی میکنیم که پارامترهای خاص JSON را در هدرهای درخواست بررسی میکند و کاربر معتبر را از بکاند بازیابی مینماید.
اگر محافظ منطق احراز هویت را تعریف کند، ارائه دهنده احراز هویت مسئول بازیابی کاربر از حافظه بکاند خواهد بود. اگر محافظ الزام کند که کاربر باید در برابر حافظه بکاند اعتبارسنجی شود، در این صورت پیادهسازی بازیابی کاربر به ارائه دهنده احراز هویت سپرده میشود.
لاراول دو ارائه دهنده احراز هویت دارد که یکی Database و دیگری Eloquent است. ارائه دهنده احراز هویت Database اقدام به بازیابی مستقیم اطلاعات احراز هویت کاربر از حافظه بکاند میکند، در حالی که Eloquent لایه انتزاعی ارائه میکند که مراحل مورد نیاز را اجرا میکند.
در مثال مورد بررسی این مقاله، ما اقدام به پیادهسازی یک ارائهدهنده احراز هویت MongoDB میکنیم که اطلاعات احراز هویت کاربر را از بکاند MongoDB واکشی میکند.
بدین ترتیب مقدمه کوتاه ما در مورد محافظها و ارائه دهندهها در سیستم احراز هویت لاراول به پایان میرسد. در بخشهای بعدی روی توسعه محافظ و ارائه دهنده احراز هویت سفارشی خود متمرکز خواهیم شد.
در ادامه به بررسی فهرست فایلهایی میپردازیم که در طی این مقاله پیادهسازی خواهیم کرد.
اگر فعلاً از فهرست فایلهای فوق چندان سر در نمیآورید، نباید نگران باشید، زیرا همه این موارد را در ادامه مقاله به تفصیل بررسی خواهیم کرد.
در این بخش به بررسی مراحل پیادهسازی فایلهای مورد نیاز خواهیم پرداخت.
نخستین کاری که باید انجام دهیم این است که در مورد محافظ سفارشی خود به لاراول اطلاع میدهیم. بدین منظور جزییات محافظ سفارشی را در فایل config/auth.php به صورت زیر وارد میکنیم:
چنان که میبینید، محافظ سفارشی خود را زیر کلید Custom اضافه کردهایم. سپس باید یک مدخل ارائهدهنده مرتبط در بخش providers اضافه کنیم:
ما مدخل ارائهدهنده خود را زیر کلید mongo اضافه کردهایم. در نهایت محافظ احراز هویت پیشفرض خود را از «وب» به «سفارشی» عوض میکنیم:
البته این ارائهدهنده هنوز کار نمیکند، زیرا هنوز فایلهای ضروری را پیادهسازی نکردهایم. این همان است که در چند بخش بعدی برسی خواهیم کرد.
در این بخش فایلهایی که برای مکالمه با وهله MongoDB مورد نیاز است را پیادهسازی میکنیم.
ابتدا یک فایل پیکربندی به نام config/mongo.php ایجاد میکنیم که تنظیمات پیشفرض اتصال MongoDB را نگهداری میکند.
البته شما باید مقادیر را با تنظیمات خودتان عوض کنید. ما به جای ایجاد مستقیم یک کلاس که با MongoDB تعامل داشته باشد، در وهله نخست یک اینترفیس میسازیم. مزیت ایجاد یک اینترفیس این است که یک قرارداد ارائه میکند که هر توسعهدهندهای باید در زمان پیادهسازی از آن تبعیت کند. ضمناً پیادهسازی ما از MongoDB میتواند به سادگی درون پیادهسازی NoSQL دیگری قرار گیرد.
در ادامه یک فایل اینترفیس به نام app/Services/Contracts/NosqlServiceInterface.php با محتوای زیر ایجاد میکنیم:
این یک اینترفیس کاملاً ساده است که متدهای ابتدایی CRUD را اعلان میکند و یک کلاس نیز اعلان میکند که در آن این اینترفیس را پیادهسازی میکند.
اینک میتوانیم یک کلاس واقعی در مسیر app/Database/MongoDatabase.php تعریف میکنیم:
البته تصور میکنیم که شما قبلاً MongoDB و اکستنشن MongoDB PHP متناظر را نصب کردهاید.
متد construct__ یک کلاس را با پارامترهای ضروری وهلهسازی میکند. متد مهم دیگری که به آن علاقهمندیم متد find است که رکورد مبتنی بر معیار ارائه شده از سوی آرگومانهای متد را بازیابی میکند. این پیادهسازی درایور MongoDB بود که تلاش کردیم تا حد امکان آن را ساده حفظ کنیم.
ما با پیروی از استانداردهای سیستم احراز هویت مدل User را پیادهسازی میکنیم که باید قرارداد را پیادهسازی کند. در ادامه یک فایل به نام app/Models/Auth/User.php با محتوای زیر ایجاد میکنیم:
احتمالاً تاکنون متوجه شدهاید که App\Models\Auth\User قرارداد Illuminate\Contracts\Auth\Authenticatable را پیادهسازی میکند.
اغلب متدهایی که در کلاس ما پیادهسازی شدهاند کاملاً گویا هستند. مثلاً متد fetchUserByCredentials کاربر را از بکاند موجود بازیابی میکند. در این مثال، بکاند، کلاس MongoDatabase است که برای بازیابی اطلاعات مورد نیز فراخوانی خواهد شد. بدین ترتیب کار پیادهسازی مدل User به پایان میرسد.
چنان که پیشتر اشاره کردیم، سیستم احراز هویت لاراول شامل دو عنصر محافظ و ارائه دهنده است. در این بخش یک ارائه دهنده احراز هویت میسازیم که به منظور بازیابی کاربر از بکاند مورد استفاده قرار میگیرد. در ادامه فایلی به نام app/Extensions/MongoUserProvider.php با محتوای زیر ایجاد میکنیم:
در این مورد نیز باید مطمئن شویم که ارائهدهنده سفارشی حتماً قرارداد Illuminate\Contracts\Auth\UserProvider را پیادهسازی میکند در ادامه دو متد مهم به نامهای retrieveByCredentials و validateCredentials تعریف میکنیم.
متد retrieveByCredentials برای بازیابی احراز هویت با استفاده از کلاس مدل User استفاده میشود که در بخش قبلی ساختهایم. از سوی دیگر متد validateCredentials برای اعتبارسنجی کاربر در برابر مجموعه مفروضی از اطلاعات احراز هویت مورد استفاده قرار میگیرد.
بدین ترتیب کار پیادهسازی ارائه دهنده سفارشی ما نیز به پایان میرسد. در بخش بعدی یک محافظ ایجاد میکنیم که با ارائه دهنده احراز هویت MongoUserProvider تعامل دارد.
چنان که قبلاً بررسی کردیم، محافظ در سیسم احراز هویت لاراول، شیوه احراز هویت کاربر را تدارک میبیند. در مثال عملی مورد بررسی در این مقاله ما اقدام به بررسی پارامتر درخواست jsondata میکنیم که باید شامل رشته اطلاعات احراز هویت باشد که به صورت JSON انکود شده است.
در این بخش یک محافظ ایجاد میکنیم که با ارائهدهنده احراز هویت که در بخش قبل ساختیم تعامل دارد. در ادامه فایلی به نام app/Services/Auth/JsonGuard.php و با محتوای زیر ایجاد میکنیم:
قبل از هر چیز کلاس ما باید اینترفیس Illuminate\Contracts\Auth\Guard را پیادهسازی کند. بدین ترتیب باید همه متدهای اعلان شده در آن اینترفیس را پیادهسازی کنیم.
نکته مهمی که باید اشاره کرد این است که تابع construct__ نیازمند یک پیادهسازی از Illuminate\Contracts\Auth\UserProvider است. در این مورد یک وهله از App\Extensions\MongoUserProvider ارسال میکنیم که در بخش بعدی آن را بررسی خواهیم کرد.
سپس یک تابع به نام getJsonParams داریم که اطلاعات احراز هویت کاربر را از پارامتر درخواست با نام jsondata بازیابی میکند. چنان که انتظار میرود ما اقدام به بازیابی یک رشته انکود شده JSON از اطلاعات احراز هویت کاربر میکنیم. به این منظور از تابع json_decode برای دیکود کردن دادههای JSON استفاده کردهایم.
در تابع اعتبارسنجی، نخستین کاری که انجام میدهیم، بررسی وجود آرگومان credentials$ است. اگر این آرگومان موجود نباشد، متد getJsonParams را برای بازیابی اطلاعات احراز هویت کاربر از پارامترهای درخواست مورد استفاده قرار میدهیم.
در ادامه متد retrieveByCredentials را از ارائهدهنده MongoUserProvider فراخوانی میکنیم که کاربر را از پایگاه داده MongoDB بکاند بازیابی میکند. در نهایت متد validateCredentials ارائهدهنده MongoUserProvider اقدام به اعتبارسنجی کاربر میکند.
بدین ترتیب کار پیادهسازی محافظ سفارشی به پایان میرسد. در بخش بعدی شیوه کنار هم قرار دادن همه این قطعات مختلف برای ساخت یک سیستم احراز هویت موفق را توضیح میدهیم.
تا به اینجا همه اجزای محافظ احراز هویت سفارشی که سیستم احراز هویت جدید ما را تشکیل میدهند طراحی کرده و توسعه دادهایم. با این حال، این سیستم هنوز آماده به کار نیست، زیرا باید اول از اتصالهای کانتینر سرویس لاراول استفاده کنیم تا آن را ثبت نماییم. چنان که احتمالاً میدانید، ارائهدهنده سرویس لاراول بهترین مکان برای پیادهسازی اتصال مورد نیاز است.
در ادامه فایل app/Providers/AuthServiceProvider.php را باز میکنیم که امکان افزودن اتصالهای کانتینر سرویس احراز هویت را به ما میدهد. اگر این فایل شامل هیچ تغییر سفارشی نباشد، میتوانید آن را با محتوای زیر تعویض کنید:
در ادامه متد boot را مینویسیم که شامل اغلب اتصالهای ارائهدهنده است. در آغاز کار اتصالهایی برای عناصر App\Database\MongoDatabase و App\Models\Auth\User ایجاد میکنیم.
اینک زمان آن رسیده است که محافظ و ارائهدهنده سفارشی را به سیستم احراز هویت لاراول وصل کنیم. ما از متد Auth Facade ارائهدهنده برای افزودن ارائهدهنده احراز هویت سفارشی خود زیر کلید mongo استفاده میکنیم. به خاطر داشته باشید که این کلید تنظیمات انجام یافته قبلی در فایل auth.php را بازتاب میدهد.
به طور مشابه، پیادهسازی محافظ سفارشی خود را با استفاده از متد extend مربوط به Auth facade تزریق میکنیم.
در ادامه یک متد register وجود دارد که از آن برای اتصال اینترفیس App\Services\Contracts\NosqlServiceInterface interface به پیادهسازی App\Database\MongoDatabase استفاده میکنیم.
بدین ترتیب هر زمان که لازم باشد وابستگی App\Services\Contracts\NosqlServiceInterface برقرار شود، لاراول با پیادهسازی آداپتر App\Database\MongoDatabase پاسخ میدهد.
مزیت استفاده از این رویکرد آن است که فرد میتواند به سادگی پیادهسازی مفروض را با پیادهسازی سفارشی تعویض کند. برای نمونه تصور کنید فردی میخواهد در آینده پیادهسازی App\Database\MongoDatabase را با آداپتر CouchDB عوض کند. در این حالت، کافی است اتصال متناظر را در متد register اضافه کند.
بدین ترتیب ارائهدهنده سرویس آماده به کار شده است. در این زمان ما همه موارد لازم برای تست پیادهسازی محافظ سفارشی خود را در اختیار داریم، بنابراین در بخش بعدی به تست آن میپردازیم.
آیا سیستم ما کار میکند؟ بدین ترتیب ما همه مراحل دشوار محافظ احراز هویت سفارشی اول خود را سپری کردهایم و اینک زمان آن رسیده که از آن استفاده کرده و آن را امتحان کنیم.
در ادامه یک فایل کنترلر ابتدایی به نام app/Http/Controllers/MongoController.php مانند زیر پیادهسازی کردیم:
در ادامه نگاهی دقیق به وابستگی متد login میاندازیم که نیازمند پیادهسازی محافظ Illuminate\Contracts\Auth\Guard است. از آنجا که ما محافظ custom را به عنوان محافظ پیشفرض در فایل auth.php تنظیم کردیم، در واقع این App\Services\Auth\JsonGuard است که تزریق میشود.
سپس متد validate را از کلاس App\Services\Auth\JsonGuard فراخوانی میکنیم که به نوبه خود یک سری از فراخوانیهای متد را دارد:
اگر همه چیز مطابق انتظار اجرا شود، با فراخوانی متد user در محافظ خودمان یک کاربر احراز هویت شده به دست میآوریم.
برای دسترسی به کنترلر باید یک مسیر مرتبط در فایل routes/web.php اضافه کنید.
اگر تلاش کنید بدون هر گونه پارامتری به مسیر http://your-laravel-site/custom/mongo/login دسترسی پیدا کنید، با پیام not authorized مواجه میشوید.
از سوی دیگر، اگر آدرسی مانند آنچه در زیر آمده است را وارد کنید در پاسخ در صورتی که کاربر در پایگاه داده موجود باشد، پیام موفقیت را دریافت خواهید کرد.
http://your-laravel-site/custom/mongo/login?jsondata={“username”:”admin”,”password”:”admin”}
توجه داشته باشید که این موارد صرفاً به عنوان نمونه هستند و قصد ما نمایش طرز کار محافظ سفارشی است. شما در عمل باید از طرز عمل گردش احراز هویت و مسئولیت خود برای ایجاد یک راهحل پایدار و امن برای اپلیکیشن آگاه باشید.
فریمورک لاراول یک سیستم احراز هویت پایدار در هسته مرکزی خود دارد که در صورت نیاز میتواند برای ساخت یک سیستم احراز هویت سفارشی بسط یابد. در این مقاله به بررسی روش پیادهسازی یک محافظ سفارشی و اتصال آن به گردش کار احراز هویت لاراول پرداختیم. در طی این مسیر یک سیستم توسعه دادیم که کاربر بر مبنای یک رشته JSON در درخواست که با پایگاه داده MongoDB تطبیق مییافت، احراز هویت میشود. برای نیل به این مقصود در نهایت یک محافظ سفارشی و یک ارائهدهنده سفارشی را پیادهسازی کردیم.
ا
منبع: فرادرس
در این مقاله، قصد داریم سیستم احراز هویت فریمورک لاراول را مورد بررسی قرار دهیم. هدف اصلی این مقاله ایجاد یک راهکار حفاظتی احراز هویت سفارشی در لاراول است که از طریق بسط سیستم احراز هویت مرکزی آن صورت میگیرد.
لاراول در هسته خود یک سیستم احراز هویت کاملاً پایدار دارد که پیادهسازی کارکرد احراز هویت را به سادگی امکانپذیر ساخته است. در واقع کافی است چند دستور آرتیزان اجرا کنید تا چارچوب یک سیستم احراز هویت آماده شود.
به علاوه خود سیستم طوری طراحی شده است که میتوان آن را بسط داد و به آداپترهای احراز هویت سفارشی نیز وصل کرد. این همان کاری است که قرار است در این مقاله انجام دهیم. پیش از آن که پا را فراتر گذارده و وارد جزییات پیادهسازی محافظ احراز هویت سفارشی شویم، کار خود را با بررسی عناصر ابتدایی سیستم احراز هویت آغاز میکنیم که محافظها و ارائه دهندهها هستند.
سیستم احراز هویت سفارشی لاراول از دو عنصر اصلی به نام «محافظ» (Guard) و «ارائه دهنده» (Provider) تشکیل یافته است.
محافظ را میتوان به چشم راهحل ارائه دهنده منطق برای شناسایی کاربران احراز هویت شده دید. لاراول در هسته مرکزی خود محافظهای مختلفی مانند «نشست» (Session) و «توکن» (Token) ارائه میکند. محافظ نشست، حالت کاربر را در هر درخواست به وسیله کوکی نگهداری میکند و در سوی دیگر محافظ توکن کاربر را از طریق یک توکن معتبر در هر درخواست احراز هویت میکند.
بنابراین چنان که میبینید محافظ، منطق احراز هویت را تعریف میکند و لزومی نیست که همیشه اقدام به بازیابی اطلاعات احراز هویت معتبر از بکاند بکند. شما میتوانید یک محافظ را که به سادگی حضور یک شیء خاص را در هدر درخواست بررسی میکند و کاربر را بر مبنای آن احراز هویت میکند پیادهسازی کنید.
در ادامه این مقاله ما یک محافظ پیادهسازی میکنیم که پارامترهای خاص JSON را در هدرهای درخواست بررسی میکند و کاربر معتبر را از بکاند بازیابی مینماید.
اگر محافظ منطق احراز هویت را تعریف کند، ارائه دهنده احراز هویت مسئول بازیابی کاربر از حافظه بکاند خواهد بود. اگر محافظ الزام کند که کاربر باید در برابر حافظه بکاند اعتبارسنجی شود، در این صورت پیادهسازی بازیابی کاربر به ارائه دهنده احراز هویت سپرده میشود.
لاراول دو ارائه دهنده احراز هویت دارد که یکی Database و دیگری Eloquent است. ارائه دهنده احراز هویت Database اقدام به بازیابی مستقیم اطلاعات احراز هویت کاربر از حافظه بکاند میکند، در حالی که Eloquent لایه انتزاعی ارائه میکند که مراحل مورد نیاز را اجرا میکند.
در مثال مورد بررسی این مقاله، ما اقدام به پیادهسازی یک ارائهدهنده احراز هویت MongoDB میکنیم که اطلاعات احراز هویت کاربر را از بکاند MongoDB واکشی میکند.
بدین ترتیب مقدمه کوتاه ما در مورد محافظها و ارائه دهندهها در سیستم احراز هویت لاراول به پایان میرسد. در بخشهای بعدی روی توسعه محافظ و ارائه دهنده احراز هویت سفارشی خود متمرکز خواهیم شد.
در ادامه به بررسی فهرست فایلهایی میپردازیم که در طی این مقاله پیادهسازی خواهیم کرد.
اگر فعلاً از فهرست فایلهای فوق چندان سر در نمیآورید، نباید نگران باشید، زیرا همه این موارد را در ادامه مقاله به تفصیل بررسی خواهیم کرد.
در این بخش به بررسی مراحل پیادهسازی فایلهای مورد نیاز خواهیم پرداخت.
نخستین کاری که باید انجام دهیم این است که در مورد محافظ سفارشی خود به لاراول اطلاع میدهیم. بدین منظور جزییات محافظ سفارشی را در فایل config/auth.php به صورت زیر وارد میکنیم:
چنان که میبینید، محافظ سفارشی خود را زیر کلید Custom اضافه کردهایم. سپس باید یک مدخل ارائهدهنده مرتبط در بخش providers اضافه کنیم:
ما مدخل ارائهدهنده خود را زیر کلید mongo اضافه کردهایم. در نهایت محافظ احراز هویت پیشفرض خود را از «وب» به «سفارشی» عوض میکنیم:
البته این ارائهدهنده هنوز کار نمیکند، زیرا هنوز فایلهای ضروری را پیادهسازی نکردهایم. این همان است که در چند بخش بعدی برسی خواهیم کرد.
در این بخش فایلهایی که برای مکالمه با وهله MongoDB مورد نیاز است را پیادهسازی میکنیم.
ابتدا یک فایل پیکربندی به نام config/mongo.php ایجاد میکنیم که تنظیمات پیشفرض اتصال MongoDB را نگهداری میکند.
البته شما باید مقادیر را با تنظیمات خودتان عوض کنید. ما به جای ایجاد مستقیم یک کلاس که با MongoDB تعامل داشته باشد، در وهله نخست یک اینترفیس میسازیم. مزیت ایجاد یک اینترفیس این است که یک قرارداد ارائه میکند که هر توسعهدهندهای باید در زمان پیادهسازی از آن تبعیت کند. ضمناً پیادهسازی ما از MongoDB میتواند به سادگی درون پیادهسازی NoSQL دیگری قرار گیرد.
در ادامه یک فایل اینترفیس به نام app/Services/Contracts/NosqlServiceInterface.php با محتوای زیر ایجاد میکنیم:
این یک اینترفیس کاملاً ساده است که متدهای ابتدایی CRUD را اعلان میکند و یک کلاس نیز اعلان میکند که در آن این اینترفیس را پیادهسازی میکند.
اینک میتوانیم یک کلاس واقعی در مسیر app/Database/MongoDatabase.php تعریف میکنیم:
البته تصور میکنیم که شما قبلاً MongoDB و اکستنشن MongoDB PHP متناظر را نصب کردهاید.
متد construct__ یک کلاس را با پارامترهای ضروری وهلهسازی میکند. متد مهم دیگری که به آن علاقهمندیم متد find است که رکورد مبتنی بر معیار ارائه شده از سوی آرگومانهای متد را بازیابی میکند. این پیادهسازی درایور MongoDB بود که تلاش کردیم تا حد امکان آن را ساده حفظ کنیم.
ما با پیروی از استانداردهای سیستم احراز هویت مدل User را پیادهسازی میکنیم که باید قرارداد را پیادهسازی کند. در ادامه یک فایل به نام app/Models/Auth/User.php با محتوای زیر ایجاد میکنیم:
احتمالاً تاکنون متوجه شدهاید که App\Models\Auth\User قرارداد Illuminate\Contracts\Auth\Authenticatable را پیادهسازی میکند.
اغلب متدهایی که در کلاس ما پیادهسازی شدهاند کاملاً گویا هستند. مثلاً متد fetchUserByCredentials کاربر را از بکاند موجود بازیابی میکند. در این مثال، بکاند، کلاس MongoDatabase است که برای بازیابی اطلاعات مورد نیز فراخوانی خواهد شد. بدین ترتیب کار پیادهسازی مدل User به پایان میرسد.
چنان که پیشتر اشاره کردیم، سیستم احراز هویت لاراول شامل دو عنصر محافظ و ارائه دهنده است. در این بخش یک ارائه دهنده احراز هویت میسازیم که به منظور بازیابی کاربر از بکاند مورد استفاده قرار میگیرد. در ادامه فایلی به نام app/Extensions/MongoUserProvider.php با محتوای زیر ایجاد میکنیم:
در این مورد نیز باید مطمئن شویم که ارائهدهنده سفارشی حتماً قرارداد Illuminate\Contracts\Auth\UserProvider را پیادهسازی میکند در ادامه دو متد مهم به نامهای retrieveByCredentials و validateCredentials تعریف میکنیم.
متد retrieveByCredentials برای بازیابی احراز هویت با استفاده از کلاس مدل User استفاده میشود که در بخش قبلی ساختهایم. از سوی دیگر متد validateCredentials برای اعتبارسنجی کاربر در برابر مجموعه مفروضی از اطلاعات احراز هویت مورد استفاده قرار میگیرد.
بدین ترتیب کار پیادهسازی ارائه دهنده سفارشی ما نیز به پایان میرسد. در بخش بعدی یک محافظ ایجاد میکنیم که با ارائه دهنده احراز هویت MongoUserProvider تعامل دارد.
چنان که قبلاً بررسی کردیم، محافظ در سیسم احراز هویت لاراول، شیوه احراز هویت کاربر را تدارک میبیند. در مثال عملی مورد بررسی در این مقاله ما اقدام به بررسی پارامتر درخواست jsondata میکنیم که باید شامل رشته اطلاعات احراز هویت باشد که به صورت JSON انکود شده است.
در این بخش یک محافظ ایجاد میکنیم که با ارائهدهنده احراز هویت که در بخش قبل ساختیم تعامل دارد. در ادامه فایلی به نام app/Services/Auth/JsonGuard.php و با محتوای زیر ایجاد میکنیم:
قبل از هر چیز کلاس ما باید اینترفیس Illuminate\Contracts\Auth\Guard را پیادهسازی کند. بدین ترتیب باید همه متدهای اعلان شده در آن اینترفیس را پیادهسازی کنیم.
نکته مهمی که باید اشاره کرد این است که تابع construct__ نیازمند یک پیادهسازی از Illuminate\Contracts\Auth\UserProvider است. در این مورد یک وهله از App\Extensions\MongoUserProvider ارسال میکنیم که در بخش بعدی آن را بررسی خواهیم کرد.
سپس یک تابع به نام getJsonParams داریم که اطلاعات احراز هویت کاربر را از پارامتر درخواست با نام jsondata بازیابی میکند. چنان که انتظار میرود ما اقدام به بازیابی یک رشته انکود شده JSON از اطلاعات احراز هویت کاربر میکنیم. به این منظور از تابع json_decode برای دیکود کردن دادههای JSON استفاده کردهایم.
در تابع اعتبارسنجی، نخستین کاری که انجام میدهیم، بررسی وجود آرگومان credentials$ است. اگر این آرگومان موجود نباشد، متد getJsonParams را برای بازیابی اطلاعات احراز هویت کاربر از پارامترهای درخواست مورد استفاده قرار میدهیم.
در ادامه متد retrieveByCredentials را از ارائهدهنده MongoUserProvider فراخوانی میکنیم که کاربر را از پایگاه داده MongoDB بکاند بازیابی میکند. در نهایت متد validateCredentials ارائهدهنده MongoUserProvider اقدام به اعتبارسنجی کاربر میکند.
بدین ترتیب کار پیادهسازی محافظ سفارشی به پایان میرسد. در بخش بعدی شیوه کنار هم قرار دادن همه این قطعات مختلف برای ساخت یک سیستم احراز هویت موفق را توضیح میدهیم.
تا به اینجا همه اجزای محافظ احراز هویت سفارشی که سیستم احراز هویت جدید ما را تشکیل میدهند طراحی کرده و توسعه دادهایم. با این حال، این سیستم هنوز آماده به کار نیست، زیرا باید اول از اتصالهای کانتینر سرویس لاراول استفاده کنیم تا آن را ثبت نماییم. چنان که احتمالاً میدانید، ارائهدهنده سرویس لاراول بهترین مکان برای پیادهسازی اتصال مورد نیاز است.
در ادامه فایل app/Providers/AuthServiceProvider.php را باز میکنیم که امکان افزودن اتصالهای کانتینر سرویس احراز هویت را به ما میدهد. اگر این فایل شامل هیچ تغییر سفارشی نباشد، میتوانید آن را با محتوای زیر تعویض کنید:
در ادامه متد boot را مینویسیم که شامل اغلب اتصالهای ارائهدهنده است. در آغاز کار اتصالهایی برای عناصر App\Database\MongoDatabase و App\Models\Auth\User ایجاد میکنیم.
اینک زمان آن رسیده است که محافظ و ارائهدهنده سفارشی را به سیستم احراز هویت لاراول وصل کنیم. ما از متد Auth Facade ارائهدهنده برای افزودن ارائهدهنده احراز هویت سفارشی خود زیر کلید mongo استفاده میکنیم. به خاطر داشته باشید که این کلید تنظیمات انجام یافته قبلی در فایل auth.php را بازتاب میدهد.
به طور مشابه، پیادهسازی محافظ سفارشی خود را با استفاده از متد extend مربوط به Auth facade تزریق میکنیم.
در ادامه یک متد register وجود دارد که از آن برای اتصال اینترفیس App\Services\Contracts\NosqlServiceInterface interface به پیادهسازی App\Database\MongoDatabase استفاده میکنیم.
بدین ترتیب هر زمان که لازم باشد وابستگی App\Services\Contracts\NosqlServiceInterface برقرار شود، لاراول با پیادهسازی آداپتر App\Database\MongoDatabase پاسخ میدهد.
مزیت استفاده از این رویکرد آن است که فرد میتواند به سادگی پیادهسازی مفروض را با پیادهسازی سفارشی تعویض کند. برای نمونه تصور کنید فردی میخواهد در آینده پیادهسازی App\Database\MongoDatabase را با آداپتر CouchDB عوض کند. در این حالت، کافی است اتصال متناظر را در متد register اضافه کند.
بدین ترتیب ارائهدهنده سرویس آماده به کار شده است. در این زمان ما همه موارد لازم برای تست پیادهسازی محافظ سفارشی خود را در اختیار داریم، بنابراین در بخش بعدی به تست آن میپردازیم.
آیا سیستم ما کار میکند؟ بدین ترتیب ما همه مراحل دشوار محافظ احراز هویت سفارشی اول خود را سپری کردهایم و اینک زمان آن رسیده که از آن استفاده کرده و آن را امتحان کنیم.
در ادامه یک فایل کنترلر ابتدایی به نام app/Http/Controllers/MongoController.php مانند زیر پیادهسازی کردیم:
در ادامه نگاهی دقیق به وابستگی متد login میاندازیم که نیازمند پیادهسازی محافظ Illuminate\Contracts\Auth\Guard است. از آنجا که ما محافظ custom را به عنوان محافظ پیشفرض در فایل auth.php تنظیم کردیم، در واقع این App\Services\Auth\JsonGuard است که تزریق میشود.
سپس متد validate را از کلاس App\Services\Auth\JsonGuard فراخوانی میکنیم که به نوبه خود یک سری از فراخوانیهای متد را دارد:
اگر همه چیز مطابق انتظار اجرا شود، با فراخوانی متد user در محافظ خودمان یک کاربر احراز هویت شده به دست میآوریم.
برای دسترسی به کنترلر باید یک مسیر مرتبط در فایل routes/web.php اضافه کنید.
اگر تلاش کنید بدون هر گونه پارامتری به مسیر http://your-laravel-site/custom/mongo/login دسترسی پیدا کنید، با پیام not authorized مواجه میشوید.
از سوی دیگر، اگر آدرسی مانند آنچه در زیر آمده است را وارد کنید در پاسخ در صورتی که کاربر در پایگاه داده موجود باشد، پیام موفقیت را دریافت خواهید کرد.
http://your-laravel-site/custom/mongo/login?jsondata={“username”:”admin”,”password”:”admin”}
توجه داشته باشید که این موارد صرفاً به عنوان نمونه هستند و قصد ما نمایش طرز کار محافظ سفارشی است. شما در عمل باید از طرز عمل گردش احراز هویت و مسئولیت خود برای ایجاد یک راهحل پایدار و امن برای اپلیکیشن آگاه باشید.
فریمورک لاراول یک سیستم احراز هویت پایدار در هسته مرکزی خود دارد که در صورت نیاز میتواند برای ساخت یک سیستم احراز هویت سفارشی بسط یابد. در این مقاله به بررسی روش پیادهسازی یک محافظ سفارشی و اتصال آن به گردش کار احراز هویت لاراول پرداختیم. در طی این مسیر یک سیستم توسعه دادیم که کاربر بر مبنای یک رشته JSON در درخواست که با پایگاه داده MongoDB تطبیق مییافت، احراز هویت میشود. برای نیل به این مقصود در نهایت یک محافظ سفارشی و یک ارائهدهنده سفارشی را پیادهسازی کردیم.
ا
منبع: فرادرس