# زبان های اسکریپتی > PHP > Laravel Framework >  قدم به قدم با لاراول 5

## rezakho

سلام

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

نکته:
1- پست های این تاپیک ممکنه در طول آموزش ویرایش بشند
2- دوستان پستی در این تاپیک نزنند و سوالات رو در تاپیک جدید مطرح کنند، همچنین نکات مرتبط رو پیام خصوصی کنند تا اعمال کنم

----------


## rezakho

*لاراول چیست؟*

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

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

در  مورد اسم این فریمورک، سازنده اون میگه، در حین انتخاب نام، یاد سرزمین  نارنیا افتادم، در این سرزمین قلعه ای وجود داره به نام Cair Paravel، که  من لاراول رو از نام این قلعه گرفتم و ...!

اولین نسخه این فریمورک در سال 2011 منتشر شد و تا کنون 5 نسخه از این فریمورک روانه دنیای اوپن سورس شده.

به  دلیل غنی بودن کامپوننت های فریمورک سیمفونی، لاراول در ابتدا قسمت های  مختلف از جمله Routing، ORM، View رو بر اساس کامپوننت های سیمفونی پیاده  سازی کرد، ولی به تدریج اکثر قسمت ها بازنویسی شد و در حال حاضر فقط از چند  کلاس سیمفونی در لاراول بیشتر استفاده نمی شه.

لاراول به شدت شی  گراست و روش ها و الگوهایی در پیاده سازی اون استفاده شده که تا به حال در  کمتر فریمورک PHP مورد استفاده قرار گرفته، مثل Facade، Reflection، IoC،  Method Injection و ...

لاراول از نسخه 4 به بعد برای مدیریت وابستگی و کتابخانه ها از Composer استفاده می کنه.

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

برخلاف  اونچه شایع هست و تصور میشه، لاراول هیچ شباهتی به فریمورک Codeigniter  نداره، بلکه شبیه فریمورک Phalcon هست، هم از نظر معماری و هم از نظر API،  برای اطلاعات بیشتر به مستندات این دو فریمورک مراجعه کنید.

----------


## rezakho

*لاراول 5*

لاراول 5.0  آخرین نسخه پایدار فعلی لاراول هست که اولین نسخه اون چند هفته  پیش منتشر شد و طبعا تغییراتی نسبت به نسخه 4 داشته که در این پست به این  تغییرات اشاره می کنیم.

*فضای نام*
به صورت پیشفرض در لاراول 4، برای عناصر برنامه از فضای نام استفاده نمی  شد، به طور مثال مدل ها و کنترلر ها در فضای نام Global ایجاد می شدند و  مثلا کلاس User به همین شکل قابل استفاده بود. اما در لاراول 5 قابلیت  تعریف عناصر برنامه در فضای نام دلخواه وجود خواهد داشت و این امکان رو  میده عناصر هر زیربرنامه یا ماژول، فضای نام منحصربه فردی داشته باشند. 

همچنین عناصر برنامه پیشفرض، در فضای نام App تعریف و استفاده می شند. به  طور مثال کنترلرها در فضای نام App\Http\Controllers وجود دارند.


*پیکربندی*
در لاراول 5، تنظیمات هر بخش در فایل مستقلی در پوشه config در ریشه برنامه قرار گرفته و دیگر در مسیر app/config نیست.

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

به علاوه در کارهای تیمی، هر برنامه نویس می تونه تنظیمات خودش رو داشته باشه.


*روتر*
در لاراول 4 روت ها در فایل routes.php تعریف می شدند که در نسخه 5، این فایل به app/Http/routes.php منتقل شده.


*کنترلرها*
تمام کنترلر ها، به پوشه app/Http/Controllers منتقل شدند، همچنین کنترلرها  در فضای نام App\Controllers تعریف خواهند شد که البته می تونید با اضافه  کردن پوشه app/Http/Controllers به قسمت classmap در فایل composer.json،  این ویژگی رو غیر فعال کنید.

ضمنا کنترلر ها همگی می بایست از کلاس app/Http/Controllers/Controller.php مشتق بشند.


*روت فیلترها*
فیلترها مانند لاراول 4، دیگه وجود ندارند (البته واقعا وجود دارند ولی  استفاده نشند بهتره) و جایگزین بهتری برای اونها به نام Middleware ایجاد  شده که به صورت لایه ای کار می کنه، یعنی هر middleware درخواست رو بعد از  انجام عملیات برای middleware بعدی می فرسته و در نهایت خروجی مناسب تحویل  داده میشه.

middleware ها همون مکانیزم filter ها رو پیاده سازی می کنند منتها با انعطاف بیشتر.

همچنین میشه فیلترهای به سبک نسخ 4 رو در متد ()boot کلاس  app/Providers/RouteServiceProvider.php تعریف کرد و برای استفاده از  facade کلاس Route، می بایست از use Illuminate\Support\Facades\Route  استفاده کنید.


*CSRF*
در نسخه 5 حفاظت در برابر حملات csrf به صورت پیشفرض بر روی همه روت ها اعمال میشه.

در صورتی که تمایل به این کار ندارید و یا می خواهید این قابلیت برای روت  های خاصی اعمال بشه، خط 'App\Http\Middleware\VerifyCsrfToken' رو در فایل  app\Http\Kernel.php حذف کنید.

و اگر می خواهید در جای دیگه از این middleware استفاده کنید، عبارت 'csrf'  => 'App\Http\Middleware\VerifyCsrfToken' رو به ارایه middleware$ در  همون فایل اضافه کنید و از طریق ['middleware' => 'csrf'] در کنترلر یا  روت مورد نظر، استفاده کنید.


*مدل*
مدل ها در لاراول 5 در پوشه app ساخته می شند و پوشه اختصاصی ندارند. البته  شما می توانید مدل ها رو در پوشه مختص خودشون قرار بدید، مثلا در   app/Models، سپس این مسیر رو به قسمت classmap در فایل composer.json اضافه  کنید تا همه چیز شبیه نسخه 4 بشه.

مدل ها در نسخه 5 از کلاس Illuminate\Database\Eloquent\Model مشتق می شند.

همچنین دیگه از متد remember برای کش کردن کوئری در مدل، پشتیبانی نمیشه و شما باید عملیات کش رو از کلاس کش کنترل کنید.


*فرمان های Artisan*
فرمان های artisan به فولدر app/Console/Commands منتقل شدند و البته کمی مراحی ایجادشون تغییر کرده.


*مایگریشن*
مسیر مایگریشن ها از app/database/migrations به database/migrations منتقل شده. 

همچنین مسیر app/database/seeds به database/seeds .


*IoC*
پیونده های IoC از مسیر start/global.php به متد register در فایل app/Providers/AppServiceProvider.php منتقل شدند.


*ویو*
ویوها از app/views به resources/views منتقل شدند.


*موتور قالب Blade*
مطلب این بخش به مرور اضافه میشه ...

----------


## rezakho

*نصب*

برای نصب لاراول نسخه 5 دو راه عمومی وجود داره، که البته هر دو نیازمند کامپوزر هست.

1- استفاده از نصاب خود لاراول

2- که راه بهتر و راحتتری هست، استفاده مستقیم از کامپوزر


*روش 1*
از آنجا که این روش ، روش مرسومی نیست و مراحل بیشتری نسبت به روش دوم دارد، در اینجا معرفی نخواهد شد، به داکیومنت خود لاراول مراجعه کنید.


*روش 2*
با فرض نصب بودن کامپوزر و دسترسی به php از طریق خط فرمان، دستور

composer create-project laravel/laravel --prefer-dist

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

پس از اتمام کار کامپوزر، با اجرای مسیر public پروژه نصب شده از طریق localhost، در صورت دیدن لوگوی لاراول، نصب بدون مشکل بوده.

----------


## rezakho

*نسخه شناسی*

لاراول از (semver (Semantic Versioning برای نسخه بندی استفاده می کنه. این الگو به صورت X.Y.Z هست و شامل 3 کلید اصلی زیره

1- ماژور ورژن یا همون X زمانی اتفاق می افته که تغییرات ناسازگار با نسخه های قبلی در API رخ میده. مثل همین نسخه 5 لاراول.
2- مینور ورژن یا همون Y زمانی رخ می ده که تغییر یا قابلیت های سازگار با نسخه های قبلی رخ میده، مثل نسخه 5.12 لاراول نسبت به نسخه 5 و
3- پتچ ورژن یا همون Z وقتی هست که باگ هایی سازگار با نسخه های قبلی اصلاح می شند، مثل 5.12.20.

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

مورد بعد، ارتقاع به آخرین نسخه مینور هست که این کار هم طبق بند 2 گفته شده، با سازگاری در API انجام میشه و پروژه بدون هیچ مشکلی کار خواهد کرد. مزیت این هست که هم نسخه پتچ بروز میشه و هم از قابلیت های جدید می تونید استفاده کنید. مثل ارتقاع نسخه 4.0 لاراول به 4.2 که امکانات جدیدی رو ارائه داده.

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

برای آپدیت لاراول به آخرین نسخه های پتچ و مینور، از دستور  composer update استفاده کنید، و چنانچه به نسخه خاصی برای آپدیت نیاز دارید، باید نسخه مورد نظر رو فایل composer.json تعیین کرده و بعد دستور composer update رو اجرا کنید (در رابطه با نسخه ی خاص مراقب باشید!)

----------


## rezakho

*راه اندازی و پیکربندی*

لاراول 5 برای اجرا، به چند مورد زیر که به صورت پیشفرض در PHP فعال نیست، نیاز داره

1- PHP نسخه 5.4 به بالا
2- اکستنشن Mcrypt
3- اکستنشن OpenSSL
4- اکستنشن Mbstring
5- اکستنشن Tokenizer
6- اکستنشن JSON که در برخی سرورها به صورت پیشفرض فعال نیست

موارد بالا رو می تونید با تابع ()phpinfo در PHP بررسی کنید.

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

در لاراول 5 این امکان اضافه شده که از تنظیمات محلی برای پیکربندی برنامه استفاده کنیم (اینجا را ببینید) که این تنظیمات محلی در فایلی به نام env.example. در ریشه برنامه نگه داشته میشه و این امکان رو میده پیکربندی موقت روی لوکال جدا از پیکربندی اصلی برنامه باشه و مدام مجبور به تغییر تنظیمات برنامه برای انتقال به سرور نداشته باشیم. اگر این فایل وجود نداشته باشه یا تنظیم مربوطه درش تعریف نشده باشه، تنظیمات اصلی موجود در پوشه config اعمال خواهد شد.

از طریق تابع env میشه به تنظیمات محلی دسترسی داشت. در برخی از فایل های پیکربندی اصلی برنامه، این تابع به جای مقدار تنظیمات دیده میشه و معنی اش این هست که در صورت وجود تنظیمات محلی اعمال بشه.
این تابع 2 ورودی داره، ورودی اول نام متغیر مورد نظر در فایل تنظیمات محلی، و ورودی دوم که اختیاری هست، مقدار پیشفرض در صورت وحود نداشتن متغیر.
 خروجی این تایع، در صورت وجود متغیر محلی، مقدار متغیر محلی، در صورت عدم وجود، مقدار پیشفرض و در صورت نداشتن مقدار پیشفرض، false خواهد بود.

یه نمونه از مقادیر فایل تنظیمات محلی:

APP_ENV=local
APP_DEBUG=true
APP_KEY=SomeRandomString
DB_HOST=localhost
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret
CACHE_DRIVER=file
SESSION_DRIVER=file
QUEUE_DRIVER=sync
MAIL_DRIVER=smtp
MAIL_HOST=mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null

با ساختار بالا دقت کنید، نام فایل تنظیمات اصلی به صورت بزرگ به علاوه _ به علاوه نام متغیر تنظیمات میاد، این الگوی ثابت این فایل هست.

مهم ترین فایل پیکربندی در پوشه config، فایل app.php هست که تنظیمات اصلی و کلی برنامه درش مشخص شده، در زیر به موارد مهم اشاره می کنیم:


*debug*
این متغیر مقدار boolean می گیره و مشخص می کنه که برنامه در چه مدی هست، production یا development ؟ مد production زمانی هست که برنامه روی سرور برای استفاده نهایی قرار داره و طبیعتا در این حالت باید گزارش تمام خطاها روی مرورگر خاموش باشه.
مد development هم زمانی هست که برنامه در حال توسعه هست و باید خطاها برای اشکال گیری روشن باشه.

مقدار پیشفرض این متغیر، ('env('APP_DEBUG هست، و از اونجا که در ابتدا نه فایل تنظیمات محلی وجود داره و نه مقدار پیشفرضی برای تابع env مشخص شده، نتیجه false خواهد بود و تمام خطاها خاموش.
می تونید دستی مقدار رو true کنید یا فایل تنظیمات محلی رو بسازید و درونش مقدار debug رو true کنید، مثل زیر:

APP_DEBUG=true


*url*
این متغیر مشخص کننده آدرس هاست واقعی فقط برای استفاده خط فرمان artisan هست. artisan از این آدرس برای ساخت url ها و روت ها و ... استفاده می کنه.


*timezone*
یک رشته می گیره که مشخصه، منطقه زمانی، که برای ما ایرانی ها باید Asia/Tehran باشه.


*locale*
یک رشته که زبان پیشفرض سیستم (en) رو برای بومی سازی مشخص میکنه، این رشته غالبا کد یک زبان هست، مثل fa برای فارسی که همون نام پوشه زبان مورد نظر در مسیر resources/lang خواهد بود. در این مسیر، پوشه مورد نظر رو بسازید و فایل های زبان و ترجمه تون رو درش قرار بدید. در بخش های بعدی مفصل توضیح داده خواهد شد.


*fallback_locale*
زبان یدک در صورت نبود زبان انتخابی ر مشخص می کنه.


*key*
یک رشته که برای توابع رمزنگاری لاراول استفاده میشه، من جمله برای رمزنگاری کوکی ها، سشن و متدهای کلاس Hash، مقدار این متغیر ز نوع env هست، یعنی اول سعی میشه از روی فایل تنظیمات محلی خونده بشه و اگر این فایل وجود نداشت، رشته SomeRandomString میشه کلیدمون! دقت کنید حتما یک رشته تصادفی با طول مناسب (32 کاراکتر) برای این متغیر انتخاب کنید، وگرنه سشن، کوکی و سایر داده های رمزنگاری شده شما امن نخواهند بود!


*cipher*
از آپشن های توابع رمزنگار هست، بهش دست نزنید! مگر اینکه بدونید دارید چکار می کنید!


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


*aliases*
آرایه ای از نام های مستعار برای استفاده راحت تر از کلاس های موجود.
در این آرایه اتفاق خاصی نمی افته، فقط نام های کوتاه بدون فضای نام برای کلاس ها تعریف می شه.

----------


## rezakho

*مسیریابی*

لاراول برای مدیریت درخواست ها، بخشی به نام Router داره، که متشکل از چندین کلاسه، این بخش وظیفه هندل کردن درخواست داده شده با توجه به URI و متد درخواست رو به عهده داره.

مثلا با تایپ آدرس فرضی http://localhost/laravel5/public، یک درخواست با URI برابر / و متد GET برای لاراول ارسال میشه و لاراول با توجه به روت های تعریف شده در فایل app/Http/routes.php تصمیم می گیره که کدوم اکشن یا کد اجرا بشه و چه نتیجه ای برای درخواست دهنده ارسال بشه.

اگر فایل routes.php رو باز کنید، با تعدادی تابع ()get مواجه خواهید شد.
این تابع یک لفاف برای متد ()Route::get هست.
تمام عملیات مربوط به روت ها توسط کلاس Route انجام میشه که البته خود این کلاس هم یک لفاف برای کلاس Illuminate\Routing\Router هست که به مدد الگوی Facade این اتفاق افتاده.

در لاراول بر اساس 7 متد مرسوم پروتکل HTTP میشه روت هایی تعریف کرد، این متدها عبارتند از get، post، put، patch، delete، options و head.
هر روت می تونه با یکی یا چند یا همه این متدها نوشته بشه.

اجازه بدید یک روت ساده بنویسیم:

get('/', 'IndexController@showRootPage');


کد بالا، یک روت برای آدرس ریشه با متد GET می سازه و درخواست رو به اکشن showRootPage از کنترلر IndexController برای اجرا می فرسته.

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

روش کنترلر برای نوشتن برنامه های تحت وب با معماری MVC و کلوژرها برای نوشتن سرورس ها و RESTful مناسب هستند.

مدل کلوژر به صورت زیر هست:

get('/', function()
{
    // handle request
});


کد بالا درخواست رو در همون تابع پردازش می کنه و در انتها نتیجه مناسب رو تحویل میده. این روش برای برنامه های کوچک، سرویس ها، RESTful و ... بسیار مناسبه.

در عوض ارسال درخواست به کنترلر یا همون MVC مناسب برای برنامه های بزرگ و با معماری MVC هست.

----------

