Laravel 6 İle Gelen Yenilikler

Kaan Osman Arslan
ClevelTeam
Published in
4 min readNov 24, 2019

Yeni Logo ve Yeni Website Tasarımı

Laravel 6 ile birlikte laravel.com sitesinin tasarımı ve logosu yenilendi.

Semantic Versiyonlama

Laravel 6 ile birlikte semantik versiyonlama standartına geçiş yapıldı. Bu standart ile uygulama major.minor.patch olarak versiyonlanıyor. Laravelin sitesinde yılda iki kere(şubat ve ağustos aylarında) major versiyon, haftada bir(daha sık veya daha seyrek olabilir) minor ve patch versiyon çıkacaklarını belirtiyorlar.

Major Versiyon : Büyük değişiklikler

Minor Versiyon : Yeni özellik eklemeleri

Patch Versiyon: Hata düzeltmeleri vs.

Lazy Collections

Laravel 6 büyük verilerle çalışırken bellek kullanımını düşük tutmayı sağlayan LazyCollection özelliği ile birlikte geliyor.

Örneğin 10000 kullanıcının olduğu bir kullanıcı tablosunda işlem yapmamız gerekiyor. Normal şekilde User modelindeki 10000 kullanıcı için bellekte yer açılır.

$users = App\User::all()->filter(function ($user) {
return $user->id > 500;
});

Laravel 6'da query builderın cursor methodu LazyCollection örneği döndürecek şekilde güncellendi. Bu sayede her kullanıcı yalnız çağrılması gerektiğinde belleğe yüklenir. Aynı anda bütün kullanıcılar belleğe yüklenmediği için bellek daha verimli şekilde kullanılmış olur ve birim zamanda kullanılan bellek miktarından tasarruf sağlanır.

$users = App\User::cursor()->filter(function ($user) {
return $user->id > 500;
});
foreach ($users as $user) {
echo $user->id;
}

Elequent Subquery İyileştirmeleri

Laravel 6 da yeni eklenen addSelect fonksiyonu ile alt sorgular yazmak eskisinden daha kolay hale geldi. Ayrıca alt sorgularda artık orderBy fonksiyonu kullanılabiliyor.

Örneğin destination ve flight tablolarımızın olduğunu düşünelim. Tüm ulaşım noktaları ve bu noktalara son ulaşan uçuşun adını aşağıdaki gibi tek sorguda elde edebiliyoruz.

return Destination::addSelect(['last_flight' => Flight::select('name')
->whereColumn('destination_id', 'destinations.id')
->orderBy('arrived_at', 'desc')
->limit(1)
])->get();

Job Middleware

Laravel 6 ile birlikte gelen job middleware katmanı sayesinde job sınıflarının tek bir sorumluluğunun olması ve kod karmaşıklığının azaltılması sağlandı. Job sınıfının sorumlu olduğu iş dışındaki durumlar job middleware katmanında yapılıp job sınıfının middleware fonksiyonunda çağrılarak kullanılabiliyor.

Örneğin bir job sınıfında rate limit sınırlaması vermek için job sınıfının handle metodunda kod yazmamız gerekiyordu.

/**
* Execute the job.
*
* @return void
*/
public function handle()
{
Redis::throttle('key')->block(0)->allow(1)->every(5)->then(function () {
info('Lock obtained...');

// Handle job...
}, function () {
// Could not obtain lock...

return $this->release(5);
});
}

Laravel 6 ile birlikte joblar için bu tarz işleri middleware katmanında yapabiliyoruz.

<?php

namespace App\Jobs\Middleware;

use Illuminate\Support\Facades\Redis;

class RateLimited
{
/**
* Process the queued job.
*
* @param mixed $job
* @param callable $next
* @return mixed
*/
public function handle($job, $next)
{
Redis::throttle('key')
->block(0)->allow(1)->every(5)
->then(function () use ($job, $next) {
// Lock obtained...

$next($job);
}, function () use ($job) {
// Could not obtain lock...

$job->release(5);
});
}
}

Daha sonra oluşturduğumuz job middleware sınıfını job sınıfınınmiddleware fonksiyonunda çağırıp kullanabiliyoruz.

use App\Jobs\Middleware\RateLimited;

/**
* Get the middleware the job should pass through.
*
* @return array
*/
public function middleware()
{
return [new RateLimited];
}

Gelişmiş Yetkilendirme Yanıtları

Laraveldeki yetkilendirme sisteminde kullanılan gatelerden son kullanıcılara yapılan dönüşler pek kolay değildi. Laravel 6 ile birlikte gelen Gate::inspect fonksiyonu ile son kullanıcılara verilen yetkilendirme yanıtları daha kolay hale geldi.

/**
* Determine if the user can view the given flight.
*
* @param \App\User $user
* @param \App\Flight $flight
* @return mixed
*/
public function view(User $user, Flight $flight)
{
return $this->deny('Explanation of denial.');
}

Yukarıdaki policyden dönen yanıtları Gate::inspect methoduyla kolayca alabiliyoruz.

$response = Gate::inspect('view', $flight);

if ($response->allowed()) {
// User is authorized to view the flight...
}

if ($response->denied()) {
echo $response->message();
}

Daha Gelişmiş Hata Sayfası

Laravel 6 ile birlikte hata gösterimi için artık Ignition paketi kullanılıyor. Bu paket ile birlikte daha kullanıcı dostu bir tasarım, çözüm önerisi, hata paylaşımı gibi güzel özellikleri olan bir hata sayfası kullanabiliyoruz.

Laravel ui Paketi

Laravel 6 ile birlikte laravel uygulamasının frontend iskeletini oluşturmak için gereken sınıflar Laravel ui adında bir pakete alınarak frontend iskeletinin frameworkten soyutlanması sağlandı. Bu paket ile vue, react veya bootstrap kullanan bir frontend iskeleti oluşturmak artık çok daha kolay bir hale geldi.

Örneğin aşağıdaki komutlar ile vuejs kullanan bir frontend iskeleti oluşturabiliyoruz.

composer require laravel/ui --devphp artisan ui vue --auth

Parola Doğrulama

Bazı durumlarda yapılan işleme devam etmek için kullanıcı giriş yapılmış olsa da parola doğrulaması yapılmak istenebilir. Laravel 6 ile gelen laravel ui paketi bunun için hazır bir yapı ile birlikte geliyor.

Örneğin profilini güncellemek için parola doğrulaması yapılması gerektiği durumda aşağıdaki gibi kolayca route dosyasından parola doğrulama ekranına yönlendirebiliyoruz.

Route:get('settings/profile/edit','Settings/ProfileController@edit')
->middleware(['auth', 'password.confirm']);

Laravel Vapor Uyumluluğu

Laravel 6 ile artık laravel uygulamalarını AWS Lambda üzerinde deploy edilip yönetilmesini kolaylaştıran laravel vapor paketi ile tam uyumluluk sağlanıyor.

--

--