هنگامی که در حال توسعه ی یک برنامه هستید، بسیار مهم است که مطمئن شوید با داده های صحیح کار می کنید. باید بدانید که سوال درستی از داده های درست میپرسید تا پاسخ درست را دریافت کنید. در حالی که برخی از ابزارهای اشکال زدایی عالی برای لاراول در دسترس هستند (در ادامه معرفی خواهیم کرد)، گاهی اوقات فقط بررسی سریع نتیجه ی چیزی که انتظار می رود، تنها چیزی است که لازم داریم. خوشبختانه لاراول توابع و ابزارهای داخلی برای این منظور دارد که در ادامه معرفی خواهیم کرد.
اشکال زدایی سریع با ابزارهای داخلی
گاهی اوقات در برنامه، به خطا یا باگی بر می خوریم که نیاز داریم خیلی سریع آن را بررسی کرده و دلیل آن را متوجه شویم. برای این منظور به دنبال راه حل هایی هستیم تا به نوعی خیلی سریع به هدف خود برسیم. در این بخش تعدادی از راه حل های ساده را مرور می کنیم.
Die and Dump
یکی از پرکاربردترین ویژگی های لاراول است. هر توسعه دهنده لاراول در مرحله ای از توسعه برنامه خود به این دستور نیاز پیدا می کند. dd مخفف Dump and Die است و مقدار متغیری که به آن می دهیم را در خروجی نشان می دهد و ادامه برنامه را متوقف می کند. یعنی کد های بعد از آن اجرا نخواهند شد و از آن به عنوان نقطه شکست در برنامه استفاده می کنیم.
// dumps the variable out and stops the code running as well
dd($toInspect);
میتوانید برای مجموعه ها نیز از آن استفاده کنیم:
collection(…)->dd();
همچنین اگر به بیش از یک متغیر dumped نیاز دارید، می توانید آن ها را به صورت زنجیره وار در dd وارد کنید (value2, value1, ...)
استفاده از DD (die and dump) یک راه معتبر و سریع برای اشکال زدایی می باشد. اما dd یک dumper است نه یک debugger.
dump
این تابع داخلی نیز اطلاعات متغیر داده شده به آن را در خروجی می دهد اما اجرای کدهای دیگر را متوقف نمی کند. بنابراین میتوانید چند دستور ()dump
برای نمایش هر داده ای که می خواهید مقدار آن را بدانید، اضافه کنید.
dump($posts);
با این که این تابع می تواند برای بررسی داده های در حال استفاده در یک برنامه ی کاربردی، هنگام اجرای عملکردهای مختلف بسیار مفید باشد، اما ممکن است فضای صفحه ی نمایش را به هم بریزد. خوشبختانه، از Laravel 5.7 یک دستور داخلی برای خروجی این اطلاعات به یک کنسول یا حتی یک فایل html جداگانه وجود دارد.
dump-server
اگر Laravel 5.7 به بالا دارید، دستور زیر را در کنسول به سادگی اجرا کنید:
php artisan dump-server
این دستور، دستور های ()dump
یا ()dd
را متوقف می کند و آن ها را در کنسول چاپ می کند که بسته به نیاز شما ممکن است مفیدتر از نمایش آن در مرورگر باشد یا نباشد.
یک ویژگی مفید دیگری که دارد این است که می توان html خروجی را در یک فایل جداگانه نشان دهیم. برای این کار، دستور زیر را در کنسول، اجرا کنید:
php artisan dump-server — format=html > dump.html
دستور بالا، اطلاعات را در فایلی به نام dump.html که در مسیر ریشه ی پروژه وجود دارد، ذخیره می کند. ورودی های جدید، به بالای این فایل اضافه می شوند. بنابراین برای مشاهده آخرین اطلاعات کافی است صفحه را در مرورگر خود refresh کنید.
استفاده از کنسول tinker
ابزار عالی دیگر tinker است که به طور پیش فرض با لاراول ارائه می شود. هنگامی که ما نیاز به آزمایش تنها یک کار داریم (مانند یک مدل یا یک سرویس کوچک، یا شاید یک helper)، خوب است که فقط دستور php artisan tinker
را اجرا و کد را در کنسول اجرا کنیم. با این کار نتایج را سریع تر می بینیم و نیازی به تغییر کد اصلی نداریم.
ثبت لاگ به صورت دستی و شخصی سازی شده
گاهی اوقات ایجاد لاگ ها به صورت دستی به ما کمک می کنند. برای مثال، اگر بخواهیم بفهمیم در یک درخواست AJAX چه اتفاقی میافتد، بیشتر اوقات ()dd به درستی کار نمیکند. اما میتوانیم داده ها را به صورت لاگ، ثبت و نتیجه را در فایل log بررسی کنیم.
حتی می توانیم این نوع لاگ گیری را شخصی سازی نماییم. برای این منظور لازم است تنظیمات لاگ گیری را مطابق با نیازمان مشخص کنیم. شخصی سازی کردن لاگ گیری برای هر برنامه می تواند بسیار مفید باشد به خصوص اگر در ابتدا و شروع طراحی پروژه، به فکر آن باشیم و در طراحی آن را در نظر بگیریم. این که یه helper به صورت شخصی برای برنامه ی خودمان بنویسیم می تواند به ما کمک کند که به صورت ساده و راحت، هر جایی از برنامه که بخواهیم آن را اضافه کنیم و لاگ مورد نظر خودمان را دریافت کنیم. البته helper لاراول، مشابه آن را در اختیار ما قرار داده است.
برای مثال تکه کد زیر ثبت یک لاگ از نوع info را نشان می دهد.
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Route;
Route::get('/', function () {
Log::info('This is an info message that someone has arrived at the welcome page.');
return view('Test info log.');
});
حال می توانیم بر اساس نیازمان، نوع های دیگر مانند error ،warning ،alert و ... را استفاده نماییم. همچنین می توانیم برای هر بخش، از فایل لاگ های مختلف با نام های متفاوت جهت ثبت لاگ استفاده کرده و برنامه ی زمان بندی از جمله روزانه و ... برای آن تعیین نماییم. برای مطالعه ی بیشتر به بخش Logging مستندات لاراول مراجعه نمایید.
use Illuminate\Support\Facades\Log;
{
Log::channel('user')->info('User failed to login.', ['id' => $user->id]);
Log::channel('pay')->error('Payment operation due to ... encountered an error');}
اشکال زدایی با ابزارهای قوی تر
می خواهم کمی از راه حل های ساده که می توانستیم درون کد استفاده کنیم بگذرم. با افزایش پیچیدگی پروژه ها، نیازهای اشکال زدایی نیز افزایش می یابد. در این زمان است که پکیج هایی مانند Laravel Debugbar یا Laravel Telescope بسیار مفید هستند و به کمک ما می آیند. در ادامه قصد دارم در مورد آن ها صحبت کنم.
Debugbar
Debugbar یک راه حل دستی مانند موارد قبلی نیست. با این پکیج به راحتی می توان برنامه را بررسی کرد. می توانید پرس و جوها، پیام ها، درخواست ها، مسیرها، نماها و غیره را بررسی کنید. وقتی که با یک برنامه ی بزرگ تر کار می کنید، می تواند خیلی مفید باشد. البته برخی معتقدند که Debugbar یک نمایشگر گزارش است نه یک دیباگر اما به هر حال به ما در اشکال یابی و اشکال زدایی کمک می کند.
Telescope
Telescope لاراول، یک پکیج first-party است که به ما در نظارت بر فعالیت های برنامه کمک می کند. به خصوص اگر برنامه ی ما دارای ویژگی هایی باشد که ردیابی آن ها با راه حل های ساده مانند بالا آسان نباشد. این پکیج برای نظارت کامل برنامه ساخته شده است، مثل این است که یک دیباگبار توسعه یافته است.
تلسکوپ لاراول به طور خاص دارای یک ویژگی مفید برای نمایش هرگونه خروجی ()dump
در نمای داخل صفحه های مدیریت تلسکوپ است که نیاز به استفاده از دستور dump-server
را کاهش می دهد. علاوه بر این، تلسکوپ اطلاعات کاملی در مورد درخواست های ورودی، استثناها، ورودی های لاگ، کوئری های دیتابیس، job های موجود در صف، نوتیفیکیشن، mail، عملیات حافظه cache، کار های برنامهریزی شده و موارد دیگر را ارائه میدهد.
هنگام توسعه، دریافت اطلاعات اشکال زدایی مفید، برای تولید کد بدون اشکال و کارآمد ضروری است. با افزایش پیچیدگی پروژه ها، نیازهای اشکال زدایی نیز افزایش مییابد. این جاست که تلسکوپ لاراول وارد می شود. تیم اصلی لاراول، تلسکوپ را به عنوان یک دستیار اشکال زدایی کامل برای پروژه های لاراول توسعه داده اند.
جمع بندی
در این مقاله به معرفی راه های ساده و پیشرفته که در اشکال زدایی برنامه های لاراول در اختیار ما قرار دارد اشاره کردیم. البته ممکن است راه حل های دیگری وجود داشته باشد. برای مثال استفاده از متد var_dump به عنوان یکی دیگر از راه های اشکال زدایی کد PHP است که هر مبتدی از آن استفاده می کند.
همچنین ابزار FirePHP به شما امکان میدهد مطالب را از کد PHP خود به کنسول فایرفاکس وارد کنید. یا blackfire که در حقیقت یک نمایه ساز است نه یک دیباگر و نمی تواند برنامه ها را اشکال زدایی کند اما به کمک ما می آید. در این بین قدرت IDE هایی مانند PHPStorm و ابزار هایی مانند XDebug را نباید فراموش کرد. می توانید برای کسب اطلاعات بیشتر در مورد XDebug به مقاله ی Xdebug: آموزش راه اندازی قابلیت Debugging در PHP در سکان آکادمی مراجعه کنید.
شما از چه روش هایی در اشکال زدایی برنامه های خود استفاده می کنید؟ لطفا پیشنهادهای خود را در قسمت نظرات ها با ما در میان بگذارید.