فریم ورک لاراول جز برترین فریم ورک های PHP است که در ژوئن سال 2011 توسط Tylor Outwell برای اولین بار منتشر شد. آخرین نسخه منتشر شده از لاراول نسخه 7 آن است که در مورد آن صحبت خواهیم کرد. این فریم ورک بسیار محبوب است و در پروژه های بزرگ نیز کاربرد زیادی دارد و از آن بسیار استفاده می شود. یکی دیگر از مزایا لاراول این است که می توان از آن در پروژه های کوچک نیز استفاده کرد. [title]معرفی لاراول 7[/title] بعد از معرفی لاراول 6 و تغییرات عمده ای که داشت، حتی لوگو لاراول نیز تغییر کرد، این بار لاراول 7 با هدف بهبود و ارتقا نسخه 6 لاراول منتشر شده است. نسخه 7 لاراول همراه با انتشارش، ویژگی های جدید بسیاری با خود داشته است. همچنین این نسخه تغییرات زیادی داشته است، پس برای بروزرسانی نسخه از 6 به 7 نیاز دارید تغییراتی را اعمال کنید که در ادامه به آنها می پردازیم. [title]نسخه بندی معنایی لاراول[/title] لاراول از نسخه 6 آن که تغییرات عمده ای نیز داشت، برای نسخه های بعدی خود متدی را تحت عنوان Semantic Versioning یا نسخه بندی معنایی ارائه کرد. در این روش هر شش ماه یکبار یک نسخه از لاراول ارائه می شود. این بدین معنی نیست که در هر نسخه تغییرات زیادی خواهیم داشت ولی ممکن است تغییرات کوچک اما کاربردی را در لاراول های بعدی ببینیم. [title]سیاست پشتیبانی[/title] لاراول نسخه 6 خود را به عنوان نسخه LTS معرفی کرد و این بدین معنی است که این نسخه ها رفع باگ ها آنها تا 2 سال و رفع مسائل امنیتی تا 3 سال، پشتیبانی خواهد شد. برای نسخه های عمومی این پشتیبانی به صورت، رفع باگ تا 6 ماه و مسائل امنیتی تا 1 سال، انجام می شود. [subtitle]جدول نسخه های لاراول[/subtitle]
Version | Release | Bug Fixes Until | Security Fixes Until |
| 5.5 (LTS) | August 30th, 2017 | August 30th, 2019 | August 30th, 2020 |
| 5.6 | February 7th, 2018 | August 7th, 2018 | February 7th, 2019 |
| 5.7 | September 4th, 2018 | March 4th, 2019 | September 4th, 2019 |
| 5.8 | February 26th, 2019 | August 26th, 2019 | February 26th, 2020 |
| 6 (LTS) | September 3rd, 2019 | September 3rd, 2021 | September 3rd, 2022 |
| 7 | March 3rd, 2020 | September 3rd, 2020 | March 3rd, 2021 |
[title]بروز رسانی از لاراول 6 به 7[/title] برای بروز رسانی نسخه لاراول از 6 به نسخه 7 نیاز است تا پکیج هایی را بروز رسانی و یا وابستگی هایی را بررسی کنید که در ادامه توضیح خواهیم داد. [subtitle]سیمفونی نسخه 5[/subtitle] لاراول نسخه 7 همه پکیج های فریم ورک سیمفونی خود را به نسخه 5 ارتقا داده است، پس نیاز دارید که قبل از بروز رسانی نسخه لاراول به 7 فریم ورک سیمفونی را به نسخه 5 بروز رسانی کنید. [subtitle]نسخه php پی اچ پی 7.2.5[/subtitle] حداقل نسخه پی اچ پی برای لاراول 7 به نسخه 7.2.5 رسیده است. [subtitle]بروز رسانی وابستگی ها[/subtitle] برای بروز رسانی به نسخه 7 لاراول نیاز دارید که پکیج ها و وابستگی های پروژه خود را بروزرسانی کنید. این موارد را می توانید در فایل composer.json تغییر دهید. اولین مرحله ارتقا خود لاراول به نسخه 7 است. پکیج laravel/framework را به نسخه 7.0^ بروزرسانی کنید. پکیج nunomaduro/collision به نسخه 4.1^ پکیج phpunit/phpunit به نسخه 8.5^ پکیج laravel/tinker به نسخه 2.0^ پکیج facade/ignition به نسخه 2.0^ هم چنین اگر از پکیج های first-party زیر استفاده می کنید نیاز است که آن ها را به ورژن ذکر شده ارتقا دهید.
- Browser Kit Testing v6.0
- Envoy v2.0
- Horizon v4.0
- Nova v3.0
- Scout v8.0
- UI v2.0 (No changes necessary)
[subtitle]ارتقا وابستگی های سیمفونی 5[/subtitle] تاثیر تغییرات: بالا تغییرات کمی نیاز دارید تا خودتان را با بروزرسانی تطبیق دهید. در مرحله اول نیاز است که متد های render و report شما در کلاس App\Exceptions\Handler از Throwable بجای شی ای از Exception استفاده کند. مثال:
use Throwable;
public function report(Throwable $exception);
public function render($request, Throwable $exception);در مرحله بعد نیاز دارید تنظیمات سشن های (Session) پروژه خود را بروز رسانی کنید. در تنظیمات سشن ها نیاز دارید که مقدار پشتیبان گزینه secure را null قرار دهید و همچنین برای same_site نیز باید مقدار lax را قرار دهید.
'secure' => env('SESSION_SECURE_COOKIE', null),
'same_site' => 'lax'[subtitle]احراز هویت[/subtitle] ساختار بندی (Scaffolding) تاثیر تغییرات: بالا در نسخه قبلی یعنی 6 لاراول تمامی پکیج های احراز هویت به مخزن laravel/ui منتقل شده بود که در حال حاضر نسخه 2 این پکیج منتشر شده است. اگر از چارچوب احراز هویت لاراول استفاده می کنید نیاز دارید که این پکیج رو بروز رسانی کنید. اینترفیس مخزن توکن (The TokenRepositoryInterface) تاثیر تغییرات: پایین متد recentlyCreatedToken به اینترفیس Illuminate\Auth\Passwords\TokenRepositoryInterface اضافه شده است. اگر از این اینترفیس استفاده می کنید نیاز است که این متد را نیز به کلاس خودتان اضافه کنید. [subtitle]موتور قالب ساز Blade[/subtitle] متد کامپوننت (The component Method) تاثیر تغییرات: متوسط متد Blade::component به Blade::aliasComponent تغییر نام داده است. اگر از این متد استفاده می کنید نیاز است که به این نام تغییر دهید. کامپوننت Blade و Blade X تاثیر تغییرات: متوسط لاراول 7 به صورت پیشفرض از component tags برای موتور قالب ساز Blade خود استفاده می کند. اگر تمایلی به استفاده از آن ندارید می توانید با استفاده از متد withoutComponentTags در قسمت boot فایل AppServiceProvider، این قابلیت را غیرفعال کنید:
use Illuminate\Support\Facades\Blade;
Blade::withoutComponentTags();[subtitle]مدل ها (Eloquent)[/subtitle] متد های addHidden / addVisible تاثیر تغییرات: پایین دو متد addHidden و addVisible در نسخه جدید حذف شده اند. بجای آن ها از makeHidden و makeVisible استفاده کنید. متد های booting / booted تاثیر تغییرات: پایین متدهای booting و booted به Eloquent ها اضافه شده تا کدهای منطق که در پروسه boot انجام می گیرد را بتوانیم راحت تر تعریف کنیم. اگر متدهایی با این نام در مدل خود دارید نیاز است که نام آنها را تغییر دهید تا با این متدها تضاد نداشته باشند. سریال سازی تاریخ (Date Serialization) تاثیر تغییرات: بالا لاراول 7 از روش جدیدی برای سریال سازی تاریخ استفاده می کند. زمانی که از متد toArray یا toJson استفاده می کنیم تاریخ به صورت toJson از کلاس Carbon برای ما ترجمه می شود که شامل TimeZone و ثانیه به صورت اعشاری می باشد. در حالت قبل تاریخ به این صورت ترجمه می شد: 20:01:00 02-12-2019 و در نسخه جدید به صورت: 2019-12-02T20:01:00.283041Z اگر تمایل دارید تابع نمایش و ترجمه تاریخ خود را شخصی سازی کنید میتوانید از متد زیر استفاده کنید:
/**
* Prepare a date for array / JSON serialization.
*
* @param \DateTimeInterface $date
* @return string
*/
protected function serializeDate(DateTimeInterface $date){
return $date->format('Y-m-d H:i:s');
}[note]توجه: این تغییر تفاوتی در ذخیره سازی اطلاعات تاریخ در دیتابیس ایجاد نمی کند و صرفا جهت نمایش اطلاعات به صورت Json این تغییر اتفاق افتاده است.[/note]
[title]ویژگی های جدید لاراول 7[/title] [subtitle]سیستم احراز هویت Laravel Airlock[/subtitle] سیستم Airlock یک سیستم سبک برای احراز هویت در اپلیکیشن های تک صفحه ای (SPA)، اپلیکیشن های موبایل و رابط های نرم افزاری (API) توکن بیس (Token Base) می باشد. سیستم Airlock به هر کاربر نرم افزار شما اجازه می دهد چندین توکن برای حساب خود ایجاد کند.می توانید از هر توکن برای اجازه دادن به بخشی از برنامه تان استفاده کنید. برای اطلاعات بیشتر به مستندات Airlock مراجعه کنید. [subtitle]Custom Eloquent Casts[/subtitle] لاراول تنوع بسیاری از Cast Type ها را در خودش دارد. در نسخه ی جدید این امکان به شما داده شده است که می توانید کست تایپ خود را به صورت سفارشی با Implement کردن کلاس خود از CastsAttributes تعریف کنید. برای استفاده از اینترفیس CastsAttributes نیاز است دو متد get و set را برای کلاس خود تعریف کنید. از متد get برای تبدیل اطلاعات خام در دیتابیس به مقدار کست، بکار برده می شود. متد set نیز برای تبدیل اطلاعات کست شده به اطلاعات خام و ذخیره در دیتابیس، بکار می رود. مثالی از یک کلاس برای کست json به صورت سفارشی:
<?php
namespace App\Casts;
use Illuminate\Contracts\Database\Eloquent\CastsAttributes;
class Json implements CastsAttributes{
/**
* Cast the given value.
*
* @param \Illuminate\Database\Eloquent\Model $model
* @param string $key
* @param mixed $value
* @param array $attributes
* @return array
*/
public function get($model, $key, $value, $attributes)
{
return json_decode($value, true);
}
/**
* Prepare the given value for storage.
*
* @param \Illuminate\Database\Eloquent\Model $model
* @param string $key
* @param array $value
* @param array $attributes
* @return string
*/
public function set($model, $key, $value, $attributes)
{
return json_encode($value);
}
}بعد از یکبار تعریف کلاس بالا، می توانیم از آن در مدل های خود استفاده کنیم:
<?php
namespace App;
use App\Casts\Json;
use Illuminate\Database\Eloquent\Model;
class User extends Model{
/**
* The attributes that should be cast to native types.
*
* @var array
*/
protected $casts = [
'options' => Json::class,
];
}برای مطالعه بیشتر در مورد کست تایپ ها میتوانید به مستندات مدل ها مراجعه کنید. [subtitle]کامپوننت Blade و بهبود آن[/subtitle] یکی از ویژگی های چشم گیر لاراول 7 ارتقا و بهبود کامپوننت Blade است. شما می توانید با استفاده از این ویژگی کامپوننت های سفارشی ای برای استفاده در فایل های View بنویسید و اما حالا ممکن است کامپوننت های شما داده هایی را بپذیرند. تمامی ویژگی ها و متد های عمومی تعریف شده در کلاس به صورت خودکار در فایل ویو کامپوننت در دسترس هستند و شما نیازی به فرستادن اطلاعات به فایل ویو ندارید. می توانید Attribute های HTML را به راحتی در کلاس خود مدیریت کنید، اینکار با استفاده از متغیر attribute$ در کلاس عملی خواهد بود. مثالی از کامپوننت App\View\Components\Alert:
<?php
namespace App\View\Components;
use Illuminate\View\Component;
class Alert extends Component
{
/**
* The alert type.
*
* @var string
*/
public $type;
/**
* Create the component instance.
*
* @param string $type
* @return void
*/
public function __construct($type)
{
$this->type = $type;
}
/**
* Get the class for the given alert type.
*
* @return string
*/
public function classForType()
{
return $this->type == 'danger' ? 'alert-danger' : 'alert-warning';
}
/**
* Get the view / contents that represent the component.
*
* @return \Illuminate\View\View|string
*/
public function render()
{
return view('components.alert');
}
}فایل ویو این کامپوننت به شکل زیر است:
<!-- /resources/views/components/alert.blade.php -->
<div class="alert " >
</div>حالا می توانید از کد زیر برای استفاده از کامپوننت Alert ساخته شده در بالا استفاده کنید:
<x-alert type="error" class="mb-4">
<x-slot name="heading">
Alert content...
</x-slot>
Default slot content...
</x-alert>این مثال ساده از استفاده کامپوننت ویو ها است. برای اطلاعات بیشتر می توانید به مستندات Blade در سایت لاراول مراجعه کنید. [note]توجه: استفاده @component در ویوها حذف نشده و نخواهد شد.(طبق گفته ی سایت لاراول)[/note] [subtitle]HTTP Client[/subtitle] لاراول در این نسخه از نسخه سبک و ساده تری از پکیج Guzzle استفاده کرده است. این کار حجم عظیمی از کدها را کاهش می دهد و باعث خوانایی کدهایی که مربوط به درخواست های HTTP هستند، می شود. این نسخه از Guzzle بیشترین تمرکز خود را برای یک تجربه توسعه دهندگی عالی دارد. مثالی از یک درخواست POST:
use Illuminate\Support\Facades\Http;
$response = Http::withHeaders([
'X-First' => 'foo',
'X-Second' => 'bar'
])->post('http://test.com/users', [
'name' => 'Taylor',
]);
return $response['id'];HTTP Client جدید همچنین توابع جدید و سازگاری را برای انجام تست های Http فراهم کرده است:
Http::fake([
// Stub a JSON response for GitHub endpoints...
'github.com/*' => Http::response(['foo' => 'bar'], 200, ['Headers']),
// Stub a string response for Google endpoints...
'google.com/*' => Http::response('Hello World', 200, ['Headers']),
// Stub a series of responses for Facebook endpoints...
'facebook.com/*' => Http::sequence()
->push('Hello World', 200)
->push(['foo' => 'bar'], 200)
->pushStatus(404),
]);اطلاعات بیشتر در مورد Http Client را می توانید از مستندات Http Client مطالعه بفرمایید. [subtitle]عملیات های Fluent String[/subtitle] برای کار کردن با رشته ها (String) قبلا با کلاس Illuminate\Support\Str کار می کردیم ولی مشکلاتی وجود داشت که اگر می خواستید بر روی رشته خود چندین متد را پیاده سازی کنید و کارهای مختلفی انجام بدهید ممکن بود حجم کدها بالا برود. در نسخه جدید لاراول ویژگی ای با عنوان Fluent String مطرح شده است. با استفاده از این کلاس می توانید رشته خود را به صورت زنجیر وار مدیریت کنید، در واقع وقتی این کلاس را فراخوانی می کنید، رشته ورودی شما را به شکل یک شی ( Object) تبدیل می کند و از متد های زیادی برای کار با رشته ها پشتیبانی می کند. برای ساختن یک شی Illuminate\Support\Stringable از متد Str::of استفاده کنید. مثالی از Fluent String:
return (string) Str::of(' Laravel Framework 6.x ')
->trim()
->replace('6.x', '7.x')
->slug();برای اطلاعات بیشتر می توانید به مستندات لاراول مراجعه کنید. [subtitle]بهبود Route Model Binding[/subtitle] تغییر چشمگیر دیگری در لاراول 7، Route Model Binding است. حالا بهتر می توانید آدرس های پروژه خود را مدیریت کنید. سفارشی سازی کلید اصلی: گاهی ممکن است بجای استفاده از id در آدرس های پروژه تان، ستون دیگری از دیتابیس را به عنوان مشخصه (primary key) قرار دهید تا بتوانید مدل تان را برگردانید:
Route::get('api/posts/{post:slug}', function (App\Post $post) {
return $post;
});Automatic Scoping: زمانی شما نیاز دارید تا در هنگام Binding در Route ها مقادیری را نسبت به مدل اول برگردانید که مدل دوم نیز فرزند آن می باشد. برای مثال، شما می خواهید پستی از وبلاگ تان را بر اساس slug و برای کاربری خاص نشان دهید:
use App\Post;
use App\User;
Route::get('api/users/{user}/posts/{post:slug}', function (User $user, Post $post) {
return $post;
});در این حالت، لاراول به صورت خودکار نام روابط بین این دو مدل را حدس می زند و برای شما پست ها را برمی گرداند. در مثال بالا، لاراول فرض را بر این می گذارد که مدل User رابطه ای با نام posts دارد که نشان دهنده ی رابطه با مدل Post است و مدل Post را برمی گرداند. برای اطلاعات بیشتر به مستندات Routing لاراول مراجعه کنید. [subtitle]Multiple Mail Drivers[/subtitle] لاراول حالا اجازه می دهد از چندین Mailer Driver برای یک پروژه استفاده کنید و هر درایور می تواند تنظیمات جداگانه ای داشته باشد. ممکن است بخواهید برای مطمئن شدن از ارسال ایمیل از سرویس های ایمیل مختلفی استفاده کنید، که با نسخه جدید لاراول این امکان برای شما فراهم شده است. می توانید از متد mailer برای ارسال ایمیل از تنظیمات mailer دلخواه خود استفاده کنید:
Mail::mailer('postmark')
->to($request->user())
->send(new OrderShipped($order));[subtitle]افزایش سرعت Route با استفاده از کش[/subtitle] با استفاده از سیستم کش بهبود یافته لاراول 7، در پروژه های بزرگ (بیشتر از 800 Route) روی درخواست ساده ای مثل Hello World تا 2 برابر افزایش سرعت مشاهده خواهد شد. برای این کار نیازی به تغییر در پروژه خود ندارید. [subtitle]پشتیبانی از CORS[/subtitle] یکی از عمده ترین مشکلات کار بین فریم ورک های فرانت اند و لاراول، مشکل CORS یا Cross-Origin Resource Sharing است. در نسخه جدید لاراول، پکیج CORS نوشته شده توسط Barry vd. He، بصورت پیشفرض قرار دارد. برای اطلاع از تنظیمات بیشتر CORS میتوانید به مستندات لاراول مراجعه کنید. [subtitle]Query Time Casts[/subtitle] زمانی نیاز دارید تا در هنگام اجرای کوئری، مقداری را Cast کنید:
use App\Post;
use App\User;
$users = User::select([
'users.*',
'last_posted_at' => Post::selectRaw('MAX(created_at)')
->whereColumn('user_id', 'users.id')
])->get();در این حالت مقدار last_posted_at به صورت خام و رشته خواهد بود. حال اگر بخواهیم این مقدار را به مقدار تاریخ تبدیل کنیم، می توانیم از متد withCasts استفاده کنیم:
$users = User::select([
'users.*',
'last_posted_at' => Post::selectRaw('MAX(created_at)')
->whereColumn('user_id', 'users.id')
])->withCasts([
'last_posted_at' => 'date'
])->get();[subtitle]بهبود MySQL 8+ Database Queue [/subtitle] در نسخه ی قبلی لاراول استفاده از صف ها در دیتابیس برای کاربرد Production، بهینه نبوده است. در لاراول 7 این امر بهبود یافته و پروژه هایی که از Mysql نسخه 8 به بالا استفاده می کنند، مشکلی نخواهند داشت. با استفاده از FOR UPDATE SKIP LOCKED ، درایور دیتابیس مطمئن تر و سازگار تر با کاربرد Production پروژه خواهد بود. [subtitle]دستور Artisan test[/subtitle] دستور phpunit برای انجام تست ها در لاراول وجود داشته است. حالا دستور دیگری به نام test برای انجام تست ها اضافه شده است. این دستور تنها رابط کاربری جالب تر و زیباتری را در کنسول فراهم کرده است.
آرگومان هایی که برای phpunit استفاده می شد، حالا نیز در test کاربرد دارد:
php artisan test --group=feature[subtitle]بهبود قالب Markdown Mail [/subtitle] قالب Markdown ایمیل نیز از نظر رابط کاربری تغییراتی داشته است. استفاده از پالت رنگی Tailwind CSS، قالب را مدرن تر کرده است. البته می توانید این قالب را نیز حتی بازنویسی کنید.
برای اطلاعات بیشتر میتوانید به مستندات ایمیل لاراول مراجعه کنید. [subtitle]Stub Customization[/subtitle] با استفاده از دستور make می توان کلاس های مختلفی در لاراول از جمله مدل ها، مایگریشن ها، کنترلر ها را ساخت. شما می توانید با استفاده از دستور stub، کلاس های بالا را به همراه ورودی های دلخواه خود بسازید. فایل ها در پوشه ی stubs در مسیر اصلی پروژه ذخیره می شوند. تغییر کوچکی نیز در فایل ها، هنگام اجرای دستور make اعمال می شود. [subtitle]تنظیمات Queue maxExceptions [/subtitle] در لاراول 7 می توانید برای Job های تعریف شده خودتان یک متغیر به نام maxExceptions بسازید و مقدار حداکثر استثنا را مشخص کنید تا در صورت دریافت خطا بیش از اندازه، آن Job مورد نظر لغو گردد. مثال:
<?php
namespace App\Jobs;
class ProcessPodcast implements ShouldQueue
{
/**
* The number of times the job may be attempted.
*
* @var int
*/
public $tries = 25;
/**
* The maximum number of exceptions to allow before failing.
*
* @var int
*/
public $maxExceptions = 3;
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
Redis::throttle('key')->allow(10)->every(60)->then(function () {
// Lock obtained, process the podcast...
}, function () {
// Unable to obtain lock...
return $this->release(10);
});
}
}در این مثال، Job مورد نظر، هر 10 ثانیه تلاش می کند تا با Redis ارتباط برقرار کند و برای 25 بار تلاش خود را ادامه می دهد. اگر چه با گرفتن 3 خطای غیرقابل مدیریت این job با شکست مواجه خواهد شد. [title]انتشار نسخه 7.14 لاراول[/title] دو موضوع مهمی که در انتشار نسخه 7.14 لاراول رخ داده است، اضافه شدن ایجاد ویژگی های View Component در هنگام استفاده از متد render و حدس زدن نوع فایل با استفاده از mime-type است. [subtitle]ویژگی های View Component ها در متد render[/subtitle] تایلر اوت ول (Tylor Outwell) به تازگی در نسخه جدید لاراول امکانی فراهم کرده است که با استفاده از آن می توانید یک Closure از ویژگی های هر View Component را برگردانید.
public function render()
{
return function ($data) {
// $data['attributes'];
// $this->attributes;
}
}[subtitle]حدس زدن نوع فایل بر اساس mime-type[/subtitle] یک متد جدید به کلاس File اضافه شده است که شما بر اساس mime-type فایل می توانید نوع فایل و حتی پسوند آن را پیدا کنید.
>>> File::name(public_path('image.png'))
=> "image"
>>> File::extension(public_path('image.png'))
=> "png"
>>> File::guessedExtension(public_path('image.png'))
=> "png"
>>> File::copy(public_path('image.png'), public_path('image'))
=> true
>>> File::name(public_path('image'))
=> "image"
>>> File::extension(public_path('image'))
=> ""
>>> File::guessedExtension(public_path('image'))
=> "png"[subtitle]متد toPsrRequest[/subtitle] متد جدید toPsrRequest در Http Client به شما اجازه ی دوباره سازی ویژگی TransferStat ها را در زمان استفاده از http fake می دهد.
Http::fake([
'https://external_api.com/403' => function (Request $request) {
$http_response = Http::response("", 403);
$http_response->TransferStats = new TransferStats($request->toPsrRequest());
return $http_response;
}
]);[subtitle]اضافه شدن متد addIf در استفاده از MessageBag[/subtitle] یک متد برای ایجاد شرط در Message Bag اضافه شده است که شما می توانید همچنین شرط های خود را در زمان استفاده از Message Bag ها ایجاد کنید.
$messageBag->addIf(
someCondition(),
'name',
'Example message.'
);جمع بندی
نسخه ی 7 لاراول تغییرات اندک ولی کاربردی بسیاری داشته است و مسیر پیشرفت خود را ادامه داده است. بعد از به اصطلاح به بلوغ رسیدن لاراول در نسخه 6 آن، این نسخه یعنی نسخه 7 بهبود بسیاری حاصل کرده است و هم توسعه دهندگان را راحت تر و هم کارایی را بیشتر کرده است. با استفاده از Route Caching، سرعت را بیشتر و با ارتقا و بهبود ویژگی هایی مثل Http Client راحتی بیشتری برای برنامه نویسان ارائه کرده است تا بار دیگر قدرت خود را به رخ بکشد و از میدان رقابت عقب نماند.
اگر به یادگیری بیشتر لاراول علاقه داری می تونی در دوره آموزش لاراول کاربردی (بسته پروژه محور) شرکت کنی، این دوره شامل ۱۲ پروژه کاربردی و پر استفاده در دنیای واقعی است، که تمامی پروژه ها به صورت کامل برنامه نویسی خواهند شد، تا دانشجو بتواند با روند ایجاد و تکمیل پروژه به صورت کامل آشنا شود.
بسیار عالی
خیلی ممنون ?