مقدمه
در این مقاله قصد دارم به سوالات و مفاهیم مهمی که در لاراول به کار رفته است را بیان کنم، همچنین در اکثر مصاحبه های که در بین شرکت ها و برنامه نویسان انجام می شود، این مفاهیم برای کسی که توسعه لاراول رو انجام می دهد مهم و مفید می باشد.
خب در اینجا هم قصد دارم این مفاهیم رو خیلی ساده و کاربردی بیان کنم تا برای همیشه آنها را در ذهن داشته باشید و در پروژه های خود بکار بگیرید.
۱ - از لاراول چی میدونی ؟
لاراول محبوب ترین فرم ورک 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
به حساب می آید.
جمع بندی
در بخش اول مقاله قصد داشتم تعریف درستی از مفاهیمی که در لاراول با آن سرکار داریم را بیان کنم و این موراد در بخش دوم ادامه دارد، بعضی از این مفاهیم در خیلی فرم ورک های دیگر هم کاربرد دارد من تلاش میکنم بیشتر از لحاظ درک و مفهوم به آنها پردازم. امیدوارم برای شما مفید باشد.