Laravel 9 ile Gelen Yeni Özellikler

Bu yazımda sizlere Laravel’in son versiyonu ile gelen yeni özellikleri özetleyerek anlatmaya çalışacağım.

Laravel 9 ile gelen yeni özelliklere örnek olarak; Symfony 6.0 bileşenleri, Symfony Mailer, geliştirilmiş route:list çıktısı, Laravel Scout veritabanı sürücüsü, yeni Eloquent accessor / mutator kullanımı, Enums aracılığıyla route binding yapılması gibi özellikleri sıralayabiliriz.
Symfony Mailer
Laravel 9'daki en büyük değişikliklerden biri, Aralık 2021'den itibaren artık bakımı ve geliştirmesi yapılmayan SwiftMailer’den Symfony Mailer’a geçilmesidir. Laravel 8'den Laravel 9'a geçişte Symfony Mailer kullanabilmek için; Eğer kurulu ise “Wildbit/swiftmailer-postmark” composer paketi uygulamadan kaldırılmalıdır. Bunun yerine, uygulamaya “symfony/postmark-mailer” ve “symfony/http-client” composer paketleri eklenmelidir.
Önceki sürümlerde “Illuminate\Mail\Message” sınıfı eksik metotları “Swift_Message” sınıfı aracılığıyla gerçekleştirilmekteyken Laravel 9 ile “Symfony\Component\Mime\Email” sınıfı ile gerçekleştirilmektedir. Bu nedenle, SwiftMailer’e dayanan herhangi bir kod, karşılık gelen Symfony Mailer karşılıklarıyla güncellenmelidir.Symfony Mailer
Laravel 9'daki en büyük değişikliklerden biri, Aralık 2021'den itibaren artık bakımı ve geliştirmesi yapılmayan SwiftMailer’den Symfony Mailer’a geçilmesidir. Laravel 8'den Laravel 9'a geçişte Symfony Mailer kullanabilmek için; Eğer kurulu ise “Wildbit/swiftmailer-postmark” composer paketi uygulamadan kaldırılmalıdır. Bunun yerine, uygulamaya “symfony/postmark-mailer” ve “symfony/http-client” composer paketleri eklenmelidir.
Önceki sürümlerde “Illuminate\Mail\Message” sınıfı eksik metotları “Swift_Message” sınıfı aracılığıyla gerçekleştirilmekteyken Laravel 9 ile “Symfony\Component\Mime\Email” sınıfı ile gerçekleştirilmektedir. Bu nedenle, SwiftMailer’e dayanan herhangi bir kod, karşılık gelen Symfony Mailer karşılıklarıyla güncellenmelidir.
Laravel 9’da Minimum PHP Versiyonu 8.0
Laravel 9, Symfony 6.0 bileşenlerine sahip olduğundan ve Symfony 6.0’ın da minimum PHP 8.0 gerektirdiğinden, bu da Laravel 9'un minimum PHP’nin 8.0 versiyonunda çalışabilmesine neden olmuştur.
Symfony Mailer
Laravel 9'daki en büyük değişikliklerden biri, Aralık 2021'den itibaren artık bakımı ve geliştirmesi yapılmayan SwiftMailer’den Symfony Mailer’a geçilmesidir. Laravel 8'den Laravel 9'a geçişte Symfony Mailer kullanabilmek için; Eğer kurulu ise “Wildbit/swiftmailer-postmark” composer paketi uygulamadan kaldırılmalıdır. Bunun yerine, uygulamaya “symfony/postmark-mailer” ve “symfony/http-client” composer paketleri eklenmelidir.
Önceki sürümlerde “Illuminate\Mail\Message” sınıfı eksik metotları “Swift_Message” sınıfı aracılığıyla gerçekleştirilmekteyken Laravel 9 ile “Symfony\Component\Mime\Email” sınıfı ile gerçekleştirilmektedir. Bu nedenle, SwiftMailer’e dayanan herhangi bir kod, karşılık gelen Symfony Mailer karşılıklarıyla güncellenmelidir.


// Laravel 8.x...
$message
->setFrom('johndoe@mailer.com')
->setTo('example@example.org')
->setSubject('Subject')
->setBody('

HTML

', 'text/html')
->addPart('Plain Text', 'text/plain');

// Laravel 9.x...
$message
->from('johndoe@mailer.com')
->to('example@example.org')
->subject('Test Subject')
->html('

HTML

')
->text('Plain Text');

“Route:list” İçin Yeni Görünüm
Laravel’in önceki sürümlerinde de olan bu komutun çıktısı büyük projelerde veya çok uzun olan route tanımlarında karmaşık olabiliyordu. Bu yeni görüntüsü ile route listesi daha okunabilir bir hal almıştır.
Controller Route Grup
Bu özellik Laravel 8.80 ile gelmiş olmasına rağmen, kod tekrarını engelleyebilmek için iyi bir yöntem olduğundan bu özelliğe de yer vermek istedim. Ortak controller kullanan route’ları “Route::controller” şeklinde tanımlayarak controller adını tekrar etmekten kurtulabiliriz . Tanımlama sırasında route->controller_method tanımı yeterlidir:

use App\Http\Controllers\TicketController;
Route::controller(TicketController::class)->group(function () {
Route::prefix('tickets')->group(function () {
Route::get('/', 'index');
Route::get('/{ticket}', 'show');
Route::post('/', 'store');
});
});

Anonymous Migrations
Laravel 8.37 ile bu özellik gelmiş olsa da gözden kaçmaması için tekrar hatırlatmak için yer vermek istedim. Laravel 9'da da kullanımı benzer şekildedir. Uzun ve karmaşık migration class isimleri yerine isimsiz (anonim) migration class yapısı kullanımına geçildi. Ayrıca migration dosyaları için taslak dosyalar da (Stubs) oluşturulabilir.

use App\Models\User;
return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('tickets', function (Blueprint $table) {
$table->id();
$table->foreignIdFor(User::class)->constrained();
$table->string('title');
$table->text('description')->fullText();
$table->string('status')->default('unresolved');
$table->timestamps();
});
}

/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('tickets');
}
};

Yeni Yardımcı Fonksiyonlar
Laravel 9’a iki yeni, kullanışlı yardımcı fonksiyon eklendi.

‘str’ fonksiyonu, verilen metinsel ifade için yeni bir ‘Illuminate\Support\Stringable’ örneği döndürür. Bu fonksiyon, ‘Str::of’ kullanımıyla aynıdır:

return str('Laravel')->append(' Framework');
// 'Laravel Framework'
return str()->snake('LaravelFramework');
// 'laravel_framework'

Not: ‘str’ fonksiyonuna herhangi bir parametre gönderilmez ise, fonksiyon bir ‘Illuminate\Support\Str’ return eder.

“to_route” fonksiyonu, isimlendirilmiş route için bir yeniden yönlendirme HTTP yanıtı oluşturarak, route’larınızdan ve controller’larınızdan isimlendirilmiş route’lara yeniden yönlendirmek için kullanılır:

return to_route('tickets.show', ['ticket' => 1]);

Satır İçi Blade Şablonları Oluşturma
Laravel 8.80 ile gelen bu özellik ile metinlerde Blade şablonlarını kullanmak iyi bir yöntem olduğu için hatırlatmak istedim. Laravel 9'da da kullanımı benzer şekildedir. Blade şablon metinlerinin HTML çıktısını Blade Facade’ın render fonksiyonu ile alınabilir. Bu render fonksiyonu blade şablon metni ve isteğe bağlı kullanılacak bir veri dizisi ile çalıştırılabilir.

use Illuminate\Support\Facades\Blade;
return Blade::render('Hello, {{ $name }}', ['name' => 'World']);

Scoped Bindings
Laravel’in önceki sürümlerinde, bir route tanımında ikinci modelin, önceki modelin alt öğesi olacak şekilde kapsamasını istediğinizde ikinci modele özellik tanımlaması yapmak gerekiyordu.

use App\Models\Ticket;
use App\Models\User;
Route::get('users/{user}/tickets/{ticket:id}',
function (User $user, Ticket $ticket) {
return $ticket;
});

Ancak, Laravel 9 ile ikinci modele özellik tanımlaması yapılmadan ikinci modeli de kapsayacak şekilde yapabilirsiniz.

use App\Models\Ticket;
use App\Models\User;
Route::get('users/{user}/tickets/{ticket}',
function (User $user, Ticket $ticket) {
return $ticket;
})->scopeBindings();

Laravel Scout Database Engine
Uygulamanız küçük veya orta ölçekli veritabanlarıyla çalışıyorsa veya yüksek trafiğe sahip değilse, artık “Algolia” veya “MeiliSerach” gibi özel bir arama servisleri yerine Scout’ın veritabanı motorunu kullanabilirsiniz. Veritabanı motoru, sorgunuz için uygun arama sonuçlarını belirlemek için mevcut veritabanınızdan sonuçları filtrelerken “where like” ifadelerini ve tam metin dizinlerini kullanır.
Full Text Indexes
Laravel 8.79 ile bu özellik gelmiş olsa da arama sorgularında daha hızlı sonuç alındığından, kullanımı da Laravel 9'da benzer olduğundan eklemek istedim. MySQL veya PostgreSQL kullanırken, tam metin index’leri oluşturmak için, migration dosyalarında sütun tanımlarken fullText() metodu eklenebilir.

Schema::create('tickets', function (Blueprint $table) {
$table->text('description')->fullText();
});

Tam metin index’i olan sütunlarda sorgulama yapmak için “whereFullText” ve “orWhereFullText” yöntemlerini kullanılabilir.

use App\Models\Ticket;
return Ticket::whereFullText('description', 'Hello')->get();

Route Bindings With Enums
PHP’nin 8.1 versiyonu ile Enumlar deskteklenebilir hale gelmiştir. Laravel 9 ile route tanımınıza bir Enum bağlayabilirsiniz. Laravel, route path’ine karşılık gelen url geçerli bir Enum değeriyse route’ı çağırır, aksi halde otomatik olarak HTTP 404 yanıtı döndürecektir. Yalnızca {status} route path’i geçerli bir Enum değeriyse çağrılacak bir route tanımlayabilirsiniz.

use App\Enums\TicketStatus;
Route::get('/tickets/statuses/{status}', function (TicketStatus $status) {
return $status->value;
});

Enum Eloquent Model Attribute Casting
Laravel 9 ile, modele ait öznitelikleri Enum’lara dönüştürebilirsiniz. Bunu yapabilmeniz için modele ait “$casts” özellik dizisine Enum’a dönüştürmek istediğiniz özelliği ve Enum değerini belirtebilirsiniz.

use App\Enums\TicketStatus;
class Ticket extends Model
{
use HasFactory;

protected $casts = [
'status' => TicketStatus::class,
];
}

Gelişmiş Eloquent Accessors / Mutators
Laravel’in önceki sürümlerinde, erişimcileri ve mutatörleri tanımlamanın tek yolu, modelinizde ön ekli ve camel case biçimde yazılan fonksiyonlar tanımlamaktı.

class Ticket extends Model
{
use HasFactory;

public function getStatusAttribute($value)
{
return ucfirst($value);
}

public function setStatusAttribute($value)
{
$this->attributes['status'] = $value;
}
}

Laravel 9 ile tek, ön eksiz ve dönüş türü “Illuminate\Database\Eloquent\Casts\Attribute” olan bir fonksiyon ile erişimci ve mutatör tanımlayabilirsiniz.

class Ticket extends Model
{
use HasFactory;

public function status(): Attribute
{
return new Attribute(
get: fn ($value) => ucfirst($value),
set: fn ($value) => $value
);
}
}

İrfan SELVİ
Gizliliğe genel bakış

Bu web sitesi, size mümkün olan en iyi kullanıcı deneyimini sunabilmek için çerezleri kullanır. Çerez bilgileri tarayıcınızda saklanır ve web sitemize döndüğünüzde sizi tanımak ve ekibimizin web sitesinin hangi bölümlerini en ilginç ve yararlı bulduğunuzu anlamasına yardımcı olmak gibi işlevleri yerine getirir.