1 0
Read Time:4 Minute, 56 Second

Arkadaşlar merhaba bu yazımıda Laravel 8 ile gelen yenilikleri sürüm notlarından giderek size anlatmaya çalışacağım.

Laravel Jetstream

Bu güncelleme ile nerdeyse tüm uygulamalarda ihtiyaç duyduğumuz e-posta doğrulama, two-factor, kullanıcı girişi/kaydı, session yönetimi gibi bir çok özelliği içinde bulunduruyor. Bu bir laravel başlangıç iskeletidir.

Jetstream, Tailwind CSS kullanılarak tasarlanmıştır ve Livewire veya Inertia iskelet seçiminizi sunar

Jetstreama gitmek için tıklayın.

Models Directory

Laravel uygulama iskeleti artık bir app/Model dizini içeriyor. Önceki sürümlerde Eloquent model dosyalarını daha düzenli olması için app/models olarak biz açıyorduk.

Yeni sürümle birlikte app/Models klasörü varsa model klasörü olarak varsayacak yoksa eskisi gibi app klasörünü kullanmaya devam edecek.

Model Factory Classes

Eloquent model factory class olarak yeniden yazıldı. Birinci sınıf ilişki olacak şekilde geliştirildi. Örneğin, Laravel’in içerdiği UserFactory şöyle yazılır:

<?php

namespace Database\Factories;

use App\Models\User;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Str;

class UserFactory extends Factory
{
    /**
     * The name of the factory's corresponding model.
     *
     * @var string
     */
    protected $model = User::class;

    /**
     * Define the model's default state.
     *
     * @return array
     */
    public function definition()
    {
        return [
            'name' => $this->faker->name,
            'email' => $this->faker->unique()->safeEmail,
            'email_verified_at' => now(),
            'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
            'remember_token' => Str::random(10),
        ];
    }
}

Oluşturulan modelslarda bulunan yeni HasFactory özelliği sayesinde model factory şu şekilde kullanılır

use App\Models\User;

User::factory()->count(50)->create();

Factory’ler sınıf tabanlı olacağı için içlerine method yazabiliriz.

/**
 * Indicate that the user is suspended.
 *
 * @return \Illuminate\Database\Eloquent\Factories\Factory
 */
public function suspended()
{
    return $this->state([
        'account_status' => 'suspended',
    ]);
}

Bundan sonra bu şekilde kullanabiliriz

use App\Models\User;

User::factory()->count(5)->suspended()->create();

Üç gönderiye sahip bir kullanıcı oluşturmak için

$users = User::factory()
            ->hasPosts(3, [
                'published' => false,
            ])
            ->create();

Daha fazla bilgiye sahip olmak için veritabanı test belgelerini incelemenizde fayda var.

Migration Squashing

Projemizi daha fazla geliştirmeye başladığımızda veritabanında yaptığımız her değişiklik için yeni bir migration dosyamız olur. Bu yüzden migration dosyaları git gide artmaktadır.

Eğer MySQL veya PostgreSQL kullanıyorsak veritabanı şemalarımızı tek bir soyada tutarak eski dosyalarımızı silebiliriz

php artisan schema:dump

// Aşağıdaki komut migration dosyalarınıda otomatikman siler.
php artisan schema:dump --prune

Bu komutlardan birisini çalıştırdıktan sonra database/schema klasöründe şemamızı bulabiliriz.

Job Batching

Birkaç job işlemimizi aynı anda çalıştırmak istiyoruz fakat hatayı nasıl tespit edeceğiz ? veya tüm işlemlerin tamamlandığını nasıl anlarım ? gibi sorularınız varsa kafanızda then catch ve finally callbackleri ile sorularınız tarih oluyor.

use App\Jobs\ProcessPodcast;
use App\Podcast;
use Illuminate\Bus\Batch;
use Illuminate\Support\Facades\Bus;
use Throwable;

$batch = Bus::batch([
    new ProcessPodcast(Podcast::find(1)),
    new ProcessPodcast(Podcast::find(2)),
    new ProcessPodcast(Podcast::find(3)),
    new ProcessPodcast(Podcast::find(4)),
    new ProcessPodcast(Podcast::find(5)),
])->then(function (Batch $batch) {
    // All jobs completed successfully...
})->catch(function (Batch $batch, Throwable $e) {
    // First batch job failure detected...
})->finally(function (Batch $batch) {
    // The batch has finished executing...
})->dispatch();

return $batch->id;

Daha fazla bilgi için tıklayın

Improved Rate Limiting

Rate limiting işlemi için throttle middleware APIsini kullanıyoruz. Laravel 8 ile birlikte geliştirilen ve kullanım alanı arttırılan rate limiting özelliği için RateLimiter facade tanımlandı.

use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Support\Facades\RateLimiter;

RateLimiter::for('global', function (Request $request) {
    return Limit::perMinute(1000);
});

RateLimiterı dinamik olarak tanımlayabiliriz

RateLimiter::for('uploads', function (Request $request) {
    return $request->user()->vipCustomer()
                ? Limit::none()
                : Limit::perMinute(100);
});

IP adresi başına dakikada 60 isteğe izin vermek için by methodunu kullanırız.

RateLimiter::for('uploads', function (Request $request) {
    return $request->user()->vipCustomer()
                ? Limit::none()
                : Limit::perMinute(100)->by($request->ip());
});

Improved Maintenance Mode

Bu güncelleme ile secret seçeneğini kullanarak bakım modundaki uygulamamıza erişim sağlayabiliriz.

php artisan down --secret="1630542a-246b-4b66-afa1-dd72a4c43515"

Bu işlemden sonra Laravel tarayıcınızda bir bakım modu atlama çerezi yayınlanacaktır

https://example.com/1630542a-246b-4b66-afa1-dd72a4c43515

Closure Dispatch / Chain

Joblarımız çalışırken başarısız olarak sonuçlandığında hataları yakalamak için catch metodunundan yararlanırız.

use Throwable;

dispatch(function () use ($podcast) {
    $podcast->publish();
})->catch(function (Throwable $e) {
    // This job has failed...
});

Dynamic Blade Components

Blade component’i render etmemiz için kullanılır. dynamic-component yardımıyla yapabiliriz

<x-dynamic-component :component="$componentName" class="mt-4" />

Event Listener Improvements

Event listenerlar artık closure olarak tanımlanabilmekte.

use App\Events\PodcastProcessed;
use Illuminate\Support\Facades\Event;

Event::listen(function (PodcastProcessed $event) {
    //
});

Illuminate\Events\queueable fonksiyonu

use App\Events\PodcastProcessed;
use function Illuminate\Events\queueable;
use Illuminate\Support\Facades\Event;

Event::listen(queueable(function (PodcastProcessed $event) {
    //
}));

Time Testing Helpers

Test işlemleri sırasında ara sıra zamanla ilgili fonksiyonları şuana veya ileri bir zamana almak isteyebiliriz.

public function testTimeCanBeManipulated()
{
    // geleceğe yolculuk...
    $this->travel(5)->milliseconds();
    $this->travel(5)->seconds();
    $this->travel(5)->minutes();
    $this->travel(5)->hours();
    $this->travel(5)->days();
    $this->travel(5)->weeks();
    $this->travel(5)->years();

    // geçmişe yolculuk...
    $this->travel(-5)->hours();

    // belirli bir zamana yolculuk...
    $this->travelTo(now()->subHours(6));

    // şimdiki zamana...
    $this->travelBack();
}

Artisan serve Improvements

Bu güncelleme sonucunda yerel .env dosyamızda ortam değişkeni değişiklikleri algılandığında otomatik yeniden yükleme özelliği kazandırılmıştır.

Tailwind Pagination Views

Laravel 8 de Boostrap yerine Tailwind CSS varsayılan olarak desteklenecek.

Boostrap kullanmaya devam etmek istiyorsanız, paginator sınıfının useBootstrap methodunu AppServiceProvider içinde çağırmanız yeterlidir.

use Illuminate\Pagination\Paginator;
/**
 * Bootstrap any application services.
 *
 * @return void
 */
public function boot()
{
    Paginator::useBootstrap();
}

Routing Namespace Updates

Laravel 8 güncellemesi ile property varsayılan RouteServiceProvider içinde değil. Yeni route tanımlamaları şu şekilde

use App\Http\Controllers\UserController;

Route::get('/users', [UserController::class, 'index']);

action tabanlı methodlar

action([UserController::class, 'index']);

return Redirect::action([UserController::class, 'index']);

Eğer Laravel 7.x Route sistemini kullanmak isterseniz RouteServiceProvider içinde $namespace propertysini tanımlamanız yeterlidir.

Evet arkadaşlar Laravel 8 ile ilgili güncelleme yazımız buraya kadar. Tüm detayla ulaşmak için Laravel dökümanlarına göz atınız.

Yeni Laravel Sürümlerinde görüşmek üzere..

Happy
Happy
0 %
Sad
Sad
0 %
Excited
Excited
0 %
Sleepy
Sleepy
0 %
Angry
Angry
0 %
Surprise
Surprise
0 %

Average Rating

5 Star
0%
4 Star
0%
3 Star
0%
2 Star
0%
1 Star
0%

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir