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 |
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'
use Illuminate\Support\Facades\Blade;
Blade::withoutComponentTags();
/**
* 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');
}
<?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,
];
}
برای مطالعه بیشتر در مورد کست تایپها میتوانید به مستندات مدل ها مراجعه کنید.
<?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 در سایت لاراول مراجعه کنید.
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 مطالعه بفرمایید.
return (string) Str::of(' Laravel Framework 6.x ')
->trim()
->replace('6.x', '7.x')
->slug();
برای اطلاعات بیشتر میتوانید به مستندات لاراول مراجعه کنید.
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 لاراول مراجعه کنید.
Mail::mailer('postmark')
->to($request->user())
->send(new OrderShipped($order));
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();
php artisan test --group=feature
<?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 با شکست مواجه خواهد شد.
public function render()
{
return function ($data) {
// $data['attributes'];
// $this->attributes;
}
}
>>> 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"
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;
}
]);
$messageBag->addIf(
someCondition(),
'name',
'Example message.'
);
جمع بندی:
نسخهی 7 لاراول تغییرات اندک ولی کاربردی بسیاری داشته است و مسیر پیشرفت خود را ادامه داده است. بعد از به اصطلاح به بلوغ رسیدن لاراول در نسخه 6 آن، این نسخه یعنی نسخه 7 بهبود بسیاری حاصل کرده است و هم توسعهدهندگان را راحتتر و هم کارایی را بیشتر کرده است. با استفاده از Route Caching، سرعت را بیشتر و با ارتقا و بهبود ویژگیهایی مثل Http Client راحتی بیشتری برای برنامه نویسان ارائه کرده است تا بار دیگر قدرت خود را به رخ بکشد و از میدان رقابت عقب نماند.
اگر به یادگیری بیشتر لاراول علاقه داری میتونی در دوره آموزش لاراول کاربردی (بسته پروژه محور) شرکت کنی، این دوره شامل ۱۲ پروژه کاربردی و پر استفاده در دنیای واقعی است، که تمامی پروژهها به صورت کامل برنامه نویسی خواهند شد، تا دانشجو بتواند با روند ایجاد و تکمیل پروژه به صورت کامل آشنا شود.