مقدمه

در این مقاله قصد دارم به سوالات و مفاهیم مهمی که در لاراول به کار رفته است را بیان کنم، همچنین در اکثر مصاحبه های که در بین شرکت ها و برنامه نویسان انجام می شود، این مفاهیم برای کسی که توسعه لاراول رو انجام می دهد مهم و مفید می باشد.

خب در اینجا هم قصد دارم این مفاهیم رو خیلی ساده و کاربردی بیان کنم تا برای همیشه آنها را در ذهن داشته باشید و در پروژه های خود بکار بگیرید.

۱ - از لاراول چی میدونی ؟

لاراول محبوب ترین فرم ورک PHP می باشد که تحت معماری MVC بنا شده است و برای توسعه نرم افزار های تحت وب طراحی شده است، با اینکه تحت سرور نوشته شده است ولی شما میتوانید فرانت اند خود را هم از طریق ابزار های قوی که در اختیار شما می گذارد از قیبل Mix و Blade آن را مدیریت و توسعه دهید.

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

همچنین از نظر امنیت از سیستم اهراز هویت پشتیبانی می کند که کار کردن با این فرم ورک را جذاب می کند و همچنین ویژگی ها و امکانات کاربردی دیگ برای کار با دیتابیس از قبیل ORM و Eloquent و Artisan که میتوانید خط فرمان لاراول را به خوبی مدیریت کنید و خیلی از وپژگی های منحصر به فرد دیگری که کار کردن با این فرم ورک را جذاب می کند.

سه تا از ویژگی ها دیگر لاراول به نظرم باید به آنها اشاره کنم مورد اول در حال رشد (Progressive) بود آن است یعنی به طور مداوم این فرم ورک در حال تغییر می باشد و باید دانش خودتون نسب بهش بروز کنید. مورد دوم مقیاس پذیری (Scalable) خب همانطور که می دانید ما هرچه بتونیم با منابع کمتر عملکرد بالاتری داشته باشیم خیلی برای ما بصرفه تر و بهتر است خب با پشتیبانی و بروز رسانی های PHP و با فراهم ساختن امکان سیستم های کش مثل Redis ما میتوانیم میلیون ها درخواست را در ماه مدیریت کنیم.

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

۲- Laravel و Lumen چه تفاوتی باهم دیگر دارد ؟‌

همانطور که می دانید Laravel با ابزار ها و ویژگی ها متعددی برای ساخت اپلیکیشن های تحت وب نوشته شده است که میتوان به برخی از آن ها مثل سشن، روتینگ، الوکوئنت و حتی Template Engine اشاره کرد. Lumen به عنوان یک microservice شناخته می شود که خیلی از ابزار های که در بالا نام بردیم را ندارد و هدف آن سرعت و سبکی است برای همین اکثر برای طراحی API و ارتباط گرفتن سرویس ها باهم دیگر بسیار مناسب است .

۳- هر پوشه در لاراول وظیفه چه کاری را دارد‌ ؟

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

پوشه app

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

پوشه bootstrap

هنگام راه اندازی پروژه اولین پوشه که شروع (root) به اجرای بقیه اجزا می کند می باشد که درون خود یک فایل به نام app.php است که وظیفه راه اندازی فرم ورک را بر عهده دارد و پوشه ای به نام cache که فرم ورک فایل های را برای افزایش سرعت، تولید میکند. فایل های از قبیل تنظیمات یا روت ها و سرویس ها می باشد.

پوشه config

تمام تنظیمات و پیکربندی های لاراول از قبیل دیتابیس، کش، سشن، هش و غیره ... در این اینجا می باشد.

پوشه database

تمام فایل های مربوط به migartion ها و مدیریت کلاس Factory و Seeder در اینجا وجود دارد.

پوشه public

این پوشه عمومی هدف تمام درخواست های است که از سمت کلاینت به سمت اپلیکیشن شما ارسال می شود می باشد که توسط htaccess مدیریت شده است و همچنین فایل های ثابتی از قبیل CSS و JS در خود نگه میدارد.

پوشه routes

به صورت پیش فرض تمام روت های که شما تعریف می کنید در این پوشه قرار دارد که شامل این فایل های می باشد web.php, api.php, channels.php, console.php می باشد پیکربندی های فایل web.php در داخل سرویس RouteServiceProvider تعریف شده اند که بعنوان مثال همه آنها از middleware به نام web گذر می کنند و برای تمام روت ها اعمال می شود.

پوشه resources

این پوشه شامل views های است که در پروژه خود تعریف می کنید همچنین تمام کد های برای css و javascript می نویسید درون این قسمت قرار دارد و بعد از کامپایل شدن به پوشه public منتقل می شود. همچین تمام زبانهای که ممکن است در اپ خود استفاده کنید در پوشه به نام lang وجود دارد.

پوشه storage

این پوشه شامل تمام logs, caches, sessions و فایل های کامپایل شده blade می باشد که توسط برنامه شما ایجاد شده.

پوشه tests

این پوشه شامل تست های است که توسط PHPUnit برای سیستم خود نوشته اید.

پوشه vendro

این پوشه شامل تمام پکیج های می باشد که توسط composer برای واسبتگی های پروژه خود نصب کرده اید.

۴ - کاربرد middleware چیست ؟

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

بطور کلی میدل ورها به سه دسته تقسیم می شوند :

۱ . میدل ورهای سراسری: این مورد توی همه درخواست های به سمت برنامه اجرا می شود.

۲. میدل ورهای روت ها: این مورد فقط بر روی یک روت خاص یا گروهی از روت ها می تواند اجرا شود.

۳. میدل ور های کنترل ها: این مورد بر روی constructor کنترلر اجرا می شود.

۵- Artisan چه کاربردی دارد ‌؟

artisan یک رابط خط فرمان CLI اختصاصی لاراول می باشد که سرعت فوق العاده ای به توسعه برنامه ما می بخشد.

۶- ORM چیست ؟

ORM مخفف Object-Relational-Mapping می باشد یک مفهوم کلی می باشد، در واقع به عنوان یک لایه انتزاعی برای دستورات SQL عمل می کند که ما بدون در نظر گرفتن نوع دیتابیس می توانیم از این دستورات استفاده کنیم، به کد زیر دقت کنید‌:

DB::table('tasks')->select('title')->get();

ما بدون در نظر داشتن اینکه کوئری بالا مربوط به چه نوع دیتابیس از قبیل MySQL یا MongoDB باشد، اجرا می شود و ما هیچی دستور SQL نمی یبینیم.

۷- Eloquent چیست ؟

حالت پیاده سازی شده ORM در فرم ورک لاراول می باشد و مدل ها وظیفه ارتباط برقرار کردن با موجودیت های دیتابیس را دارند که از طریق این مفهوم دستورات پیچیده SQL خود را به راحتی اجرا کنید.

بعنوان مثال مدل User توسط ORM به موجودیت users دسترسی دارد :‌

User::find(1)

۸- Service Provider چیست ؟

لطفا به این مفهوم به خوبی توجه کنید که قدرت لاراول در این بخش می باشد، هر برنامه ای برای اینکه اجرا بشه باید چندین کلاس و فایل را لود و اجرا کند، سرویس های از قبیل سشن، کوکی، دیتابیس و ...، قبل از لود شدن باید برنامه ای ما کار اصلیش رو انجام بده، این لود شدن ها در قسمت Service Provider ها انجام می شود به صورت فنی تر این قسمت مسئول پیکربندی و آماده سازی پروژه است.

خب حالا در اینجا مفهومی وجود دارد به نام Service Container به معنی مخزن یا مکانی برای نگهداری سرویس ها (کلاس) که برنامه ما به آن نیاز دارد به بیان دیگر یک ابزار برای مدیریت و تزریق وابستگی‌ها (Dependency Injection) توی برنامه هست. سرویس‌هایی مثل Cache و Session و DB توی این مخزن نگهداری میشن.

شما هنگامی که یک Service Provider برای اپ خود ایجاد می کنید درون فایل آن دوتا متد به نام های boot و register وجود دارد و باید تفاوت آن را بدانید.

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

حالا به محضی که متد register تمام پروایدر ها رو پردازش می کند، متد boot همه پروایدر های که توسط فرم ورک لود شده اند را پردازش می کند.

از متد register برای bind کردن یک سرویس (کلاس) به صورتی که در کل پروژه بتوان آن را inject کرد استفاده می شود به عنوان مثال می خواهیم سرویس notification را هم در برنامه داشته باشیم و اون رو به کل اپ معرفی کنیم :

$this->app->bind('App\Contracts\Notification', function() {
    return new EmailNotification;
})

حال خیلی راحت می توانید در رون constructor یا یک متد دلخواه در Controller آن را inject کنید و یا بصورت مستقیم در کل برنامه استفاده کنید.

class UsersController extends Controller
{
    public function index(Notification $notification)
    {
        dd($notification); // App\Services\EmailNotification
    }
}

۹- چرا از Form Request استفاده می کنیم ؟

عملیات اعتبارسنجی (validation) همیشه ساده نیست و گاهی نیاز داریم ورودی های زیادی رو برسی کنیم، با استفاده از Form Request می توانیم انعطاف پذیری و مدیریت اعتبارسنجی را بالا ببریم.

public function rules()
{
    return [
        'title' => 'required|unique:posts|max:255',
        'body' => 'required',
    ];
}

درون متد rules می توانید اعتبارسنجی فیلد های که میخواهید را انجام بدهید .

public function messages()
{
    return [
        'title.required' => 'لطفاً عنوان را وارد کنید'
    ];
}

در متد messages میتوانید پیامی که میخواهید برگرداند رو بنوسید.

۱۰- Localization چیست ؟

اگر قصد دارید یک برنامه با چندین زبان مختلف بنویسید و آن در دسترس کاربران برنامه خود قرار دهید میتوانید از مفهوم Localization در مسیر resources/lang استفاده کنید.

۱۱- نسخه بندی معنایی چیست ؟‌

هدف از نسخه بندی معنایی (Semantic Versioning)، استاندارد سازی نسخه هایی هست که یک نرم افزار نسبت داده می شود. در نسخه‌بندی معنایی، اعداد یک ورژن، شامل سه عدد هست که با نقطه از هم جدا میشن. یعنی طبق فرمت X.Y.Z که توی اونها x و y و z اعداد صحیح هستن:

X: نشون‌دهنده نسخه اصلی (Major Version) نرم‌افزار هست. Y: نشون‌دهنده نسخه جزیی (Minor Version) نرم‌افزار هست. Z: نشون‌دهنده نسخه پچ (Patch) نرم‌افزار هست.

برای مثال برای ورژن 6.12.3 یک نرم‌افزار، نسخه‌ی اصلی 6، نسخه جزیی 12 و نسخه پچ اون 3 هست.

به مفهوم دیگر X نشانه نسخه اصلی برنامه می باشد، Y هنگامی تغییر می کند که یک ویژگی جدید به برنامه اضافه شده باشد، Z به مفهوم رفع باگ ها و خطاهای احتمال برنامه می باشد.

۱۲- چطور یک متغییر سراسری داشته باشیم ؟‌

برای اینکه شما در برنامخ خود یک متغییر سراسری تعریف کنید کافی است به پوشه config بروید و بعنوان مثال یک فایل به نام settings.php ایجاد کنید که محتوای آن به شکل زیر می باشد :

// config/settings.php

<?php

return [
    'api_version' => env('API_VERSION'),
    'path' => [
        'images' => '/path/images',
    'audio' => '/path/audio',
        'videos' => '/path/videos'
    ],
    'theme' => 'dark',
];

حالا خیلی راحت می توانید از طریق متد config در هر جای برنامه که می خواهید از آن استفاده کنید :

config('settings.path.images');

۱۳- تفاوت بین Package Manager و Dependency Manager چیست ؟

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

خب یک راه اینکه که خودمون تک به تک وابستگی ها را فراهم و نصب کنیم. شرایط زمانی سخت تر می شود یک ابزار وابسته به یک ابزار دیگر باشد به همین منظور سبب شده تا ابزار های مثل Package Manager و Dependency Manager معرفی بشن.

این ابزار ها مسئول معرفی و فراهم کردن ابزارها هستن که برای توسعه نرم افزار نیاز داریم.

Package Manager :‌ در سطح بالاتر و کلی تر فعالیت می کند، یعنی در سطح سیستم و نه برای یک برنامه خاص، ابزار های که توسط Package Manager نصب می شوند می توانند چندین برنامه از آنها استفاده کنند به عنوان مثال شما در لینوکس APT و YUM رو دارید که در سطح سیستم قابل دسترس هستن.

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

Composer درPHP

NPM در NodeJS

Bundle در Ruby

۱۴- Composer چیست ؟‌

کامپوزر یک ابزار مدیریت وابستگی Dependency Manager برای PHP می باشد که به ما اجازه می دهد تا ابزارهای مورد نیاز برنامه ها را مدیریت و نصب کنیم.

هر چند کامپوزر با پکیج ها سرکار دارد ولی چون در سطح یک برنامه عمل می کند Dependency Manager به حساب می آید.

جمع بندی

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