فریم ورک لاراول جز برترین فریم ورکهای PHP است که در ژوئن سال 2011 توسط Tylor Outwell برای اولین بار منتشر شد. آخرین نسخه منتشر شده از لاراول نسخه 7 آن است که در مورد آن صحبت خواهیم کرد. این فریم ورک بسیار محبوب است و در پروژههای بزرگ نیز کاربرد زیادی دارد و از آن بسیار استفاده میشود. یکی دیگر از مزایا لاراول این است که میتوان از آن در پروژههای کوچک نیز استفاده کرد.
بعد از معرفی لاراول 6 و تغییرات عمدهای که داشت، حتی لوگو لاراول نیز تغییر کرد، اینبار لاراول 7 با هدف بهبود و ارتقا نسخه 6 لاراول منتشر شده است.
نسخه 7 لاراول همراه با انتشارش، ویژگیهای جدید بسیاری با خود داشته است. همچنین این نسخه تغییرات زیادی داشته است، پس برای بروزرسانی نسخه از 6 به 7 نیاز دارید تغییراتی را اعمال کنید که در ادامه به آنها میپردازیم.
لاراول از نسخه 6 آن که تغییرات عمدهای نیز داشت، برای نسخههای بعدی خود متدی را تحت عنوان Semantic Versioning یا نسخه بندی معنایی ارائه کرد. در این روش هر شش ماه یکبار یک نسخه از لاراول ارائه میشود. این بدین معنی نیست که در هر نسخه تغییرات زیادی خواهیم داشت ولی ممکن است تغییرات کوچک اما کاربردی را در لاراولهای بعدی ببینیم.
لاراول نسخه 6 خود را به عنوان نسخه LTS معرفی کرد و این بدین معنی است که این نسخهها رفع باگها آنها تا 2 سال و رفع مسائل امنیتی تا 3 سال، پشتیبانی خواهد شد. برای نسخههای عمومی این پشتیبانی به صورت، رفع باگ تا 6 ماه و مسائل امنیتی تا 1 سال، انجام میشود.
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 |
برای بروز رسانی نسخه لاراول از 6 به نسخه 7 نیاز است تا پکیجهایی را بروز رسانی و یا وابستگیهایی را بررسی کنید که در ادامه توضیح خواهیم داد.
لاراول نسخه 7 همه پکیجهای فریم ورک سیمفونی خود را به نسخه 5 ارتقا داده است، پس نیاز دارید که قبل از بروز رسانی نسخه لاراول به 7 فریم ورک سیمفونی را به نسخه 5 بروز رسانی کنید.
حداقل نسخه پی اچ پی برای لاراول 7 به نسخه 7.2.5 رسیده است.
برای بروزرسانی به نسخه 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 زیر استفاده میکنید نیاز است که آنها را به ورژن ذکر شده ارتقا دهید.
تاثیر تغییرات: بالا
تغییرات کمی نیاز دارید تا خودتان را با بروزرسانی تطبیق دهید.
در مرحله اول نیاز است که متدهای 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'
ساختار بندی (Scaffolding)
تاثیر تغییرات: بالا
در نسخه قبلی یعنی 6 لاراول تمامی پکیجهای احراز هویت به مخزن laravel/ui منتقل شده بود که در حال حاضر نسخه 2 این پکیج منتشر شده است. اگر از چارچوب احراز هویت لاراول استفاده میکنید نیاز دارید که این پکیج رو بروز رسانی کنید.
اینترفیس مخزن توکن (The TokenRepositoryInterface)
تاثیر تغییرات: پایین
متد recentlyCreatedToken به اینترفیس Illuminate\Auth\Passwords\TokenRepositoryInterface اضافه شده است. اگر از این اینترفیس استفاده میکنید نیاز است که این متد را نیز به کلاس خودتان اضافه کنید.
متد کامپوننت (The component Method)
تاثیر تغییرات: متوسط
متد Blade::component به Blade::aliasComponent تغییر نام داده است. اگر از این متد استفاده میکنید نیاز است که به این نام تغییر دهید.
کامپوننت Blade و Blade X
تاثیر تغییرات: متوسط
لاراول 7 به صورت پیشفرض از component tags برای موتور قالب ساز Blade خود استفاده میکند. اگر تمایلی به استفاده از آن ندارید میتوانید با استفاده از متد withoutComponentTags در قسمت boot فایل AppServiceProvider، این قابلیت را غیرفعال کنید:
use Illuminate\Support\Facades\Blade;
Blade::withoutComponentTags();
متدهای 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');
}
سیستم Airlock یک سیستم سبک برای احراز هویت در اپلیکیشنهای تک صفحهای (SPA)، اپلیکیشنهای موبایل و رابطهای نرم افزاری (API) توکن بیس (Token Base) میباشد. سیستم Airlock به هر کاربر نرم افزار شما اجازه میدهد چندین توکن برای حساب خود ایجاد کند.میتوانید از هر توکن برای اجازه دادن به بخشی از برنامهتان استفاده کنید.
برای اطلاعات بیشتر به مستندات Airlock مراجعه کنید.
لاراول تنوع بسیاری از 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,
];
}
برای مطالعه بیشتر در مورد کست تایپها میتوانید به مستندات مدل ها مراجعه کنید.
یکی از ویژگیهای چشمگیر لاراول 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 {{ $classForType }}" {{ $attributes }}>
{{ $heading }}
{{ $slot }}
</div>
حالا میتوانید از کد زیر برای استفاده از کامپوننت Alert ساخته شده در بالا استفاده کنید:
<x-alert type="error" class="mb-4">
<x-slot name="heading">
Alert content...
</x-slot>
Default slot content...
</x-alert>
این مثال ساده از استفاده کامپوننت ویوها است. برای اطلاعات بیشتر میتوانید به مستندات Blade در سایت لاراول مراجعه کنید.
لاراول در این نسخه از نسخه سبک و سادهتری از پکیج 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 مطالعه بفرمایید.
برای کار کردن با رشتهها (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();
برای اطلاعات بیشتر میتوانید به مستندات لاراول مراجعه کنید.
تغییر چشمگیر دیگری در لاراول 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 لاراول مراجعه کنید.
لاراول حالا اجازه میدهد از چندین Mailer Driver برای یک پروژه استفاده کنید و هر درایور میتواند تنظیمات جداگانهای داشته باشد. ممکن است بخواهید برای مطمئن شدن از ارسال ایمیل از سرویسهای ایمیل مختلفی استفاده کنید، که با نسخه جدید لاراول این امکان برای شما فراهم شده است.
میتوانید از متد mailer برای ارسال ایمیل از تنظیمات mailer دلخواه خود استفاده کنید:
Mail::mailer('postmark')
->to($request->user())
->send(new OrderShipped($order));
با استفاده از سیستم کش بهبود یافته لاراول 7، در پروژههای بزرگ (بیشتر از 800 Route) روی درخواست سادهای مثل Hello World تا 2 برابر افزایش سرعت مشاهده خواهد شد.
برای این کار نیازی به تغییر در پروژه خود ندارید.
یکی از عمدهترین مشکلات کار بین فریم ورکهای فرانت اند و لاراول، مشکل CORS یا Cross-Origin Resource Sharing است. در نسخه جدید لاراول، پکیج CORS نوشته شده توسط Barry vd. He، بصورت پیشفرض قرار دارد.
برای اطلاع از تنظیمات بیشتر CORS میتوانید به مستندات لاراول مراجعه کنید.
زمانی نیاز دارید تا در هنگام اجرای کوئری، مقداری را 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();
در نسخهی قبلی لاراول استفاده از صفها در دیتابیس برای کاربرد Production، بهینه نبوده است. در لاراول 7 این امر بهبود یافته و پروژههایی که از Mysql نسخه 8 به بالا استفاده میکنند، مشکلی نخواهند داشت.
با استفاده از FOR UPDATE SKIP LOCKED ، درایور دیتابیس مطمئنتر و سازگارتر با کاربرد Production پروژه خواهد بود.
دستور phpunit برای انجام تستها در لاراول وجود داشته است. حالا دستور دیگری به نام test برای انجام تستها اضافه شده است. این دستور تنها رابط کاربری جالبتر و زیباتری را در کنسول فراهم کرده است.
آرگومانهایی که برای phpunit استفاده میشد، حالا نیز در test کاربرد دارد:
php artisan test --group=feature
قالب Markdown ایمیل نیز از نظر رابط کاربری تغییراتی داشته است. استفاده از پالت رنگی Tailwind CSS، قالب را مدرنتر کرده است. البته میتوانید این قالب را نیز حتی بازنویسی کنید.
برای اطلاعات بیشتر میتوانید به مستندات ایمیل لاراول مراجعه کنید.
با استفاده از دستور make میتوان کلاسهای مختلفی در لاراول از جمله مدلها، مایگریشنها، کنترلرها را ساخت. شما میتوانید با استفاده از دستور stub، کلاسهای بالا را به همراه ورودیهای دلخواه خود بسازید.
فایلها در پوشهی stubs در مسیر اصلی پروژه ذخیره میشوند. تغییر کوچکی نیز در فایلها، هنگام اجرای دستور make اعمال میشود.
در لاراول 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 با شکست مواجه خواهد شد.
دو موضوع مهمی که در انتشار نسخه 7.14 لاراول رخ داده است، اضافه شدن ایجاد ویژگیهای View Component در هنگام استفاده از متد render و حدس زدن نوع فایل با استفاده از mime-type است.
تایلر اوتول (Tylor Outwell) به تازگی در نسخه جدید لاراول امکانی فراهم کرده است که با استفاده از آن میتوانید یک Closure از ویژگیهای هر View Component را برگردانید.
public function render()
{
return function ($data) {
// $data['attributes'];
// $this->attributes;
}
}
یک متد جدید به کلاس 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"
متد جدید 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;
}
]);
یک متد برای ایجاد شرط در Message Bag اضافه شده است که شما میتوانید همچنین شرطهای خود را در زمان استفاده از Message Bagها ایجاد کنید.
$messageBag->addIf(
someCondition(),
'name',
'Example message.'
);
جمع بندی:
نسخهی 7 لاراول تغییرات اندک ولی کاربردی بسیاری داشته است و مسیر پیشرفت خود را ادامه داده است. بعد از به اصطلاح به بلوغ رسیدن لاراول در نسخه 6 آن، این نسخه یعنی نسخه 7 بهبود بسیاری حاصل کرده است و هم توسعهدهندگان را راحتتر و هم کارایی را بیشتر کرده است. با استفاده از Route Caching، سرعت را بیشتر و با ارتقا و بهبود ویژگیهایی مثل Http Client راحتی بیشتری برای برنامه نویسان ارائه کرده است تا بار دیگر قدرت خود را به رخ بکشد و از میدان رقابت عقب نماند.
اگر به یادگیری بیشتر لاراول علاقه داری میتونی در دوره آموزش لاراول کاربردی (بسته پروژه محور) شرکت کنی، این دوره شامل ۱۲ پروژه کاربردی و پر استفاده در دنیای واقعی است، که تمامی پروژهها به صورت کامل برنامه نویسی خواهند شد، تا دانشجو بتواند با روند ایجاد و تکمیل پروژه به صورت کامل آشنا شود.