Onur Evren

Laravel Repository Pattern
  1. Anasayfa
  2. »
  3. Yazılım
  4. »
  5. Laravel Repository Pattern

Laravel Repository Pattern

Onur Evren - - 15 dk okuma süresi
0

Laravel, modern web uygulama geliştirmek için popüler bir PHP framework’üdür. Laravel Repository Pattern ise, veri depolama katmanını soyutlamaya ve uygulamanın bağımsızlığını artırmaya yardımcı olan bir tasarım kalıbıdır. Laravel ile birlikte kullanıldığında ise, bu kalıp daha da etkili hale gelebilir.

Laravel’de Repository Pattern kullanmak, uygulamanızın veri katmanının kontrolünü almanızı sağlar. Bu tasarım kalıbı, veritabanı işlemleri yapmak için kullandığınız model class’larını sarmalar ve kodunuzun daha modüler olmasını sağlar. Ayrıca, veri katmanındaki herhangi bir değişiklik, sadece repository class’larına yansıtılabilir, böylece kodunuzun geri kalanı bundan etkilenmez.

Repository Pattern’in en büyük avantajlarından biri, test edilebilirliği artırmasıdır. Repository class’ları, uygulamanızda kullanılan diğer class’larla ayrı tutularak, mock edilerek veya sahte nesnelerle değiştirilerek kolayca test edilebilir hale getirilebilir.

Repository Pattern Nedir?

Repository Pattern, veri tabanı işlemlerinin (create, read, update, delete) uygulama kodundan ayrılmasını sağlayan bir tasarım desenidir. Bu desen, bir ORM (Object-Relational Mapping) veya SQL sorguları kullanarak verileri alır, saklar ve geri döndürür.

Repository Pattern, veri kaynağına bağımlılığı azaltır ve uygulamanın test edilebilirliğini arttırır. Ayrıca, veri kaynağı üzerindeki değişikliklerin uygulama koduna minimum etkisi olmasını sağlar.

Laravel, Repository Pattern’i uygulamak için hazır bir yapı sunar. Bu yapıyı kullanarak, veri tabanı işlemlerini uygulama kodundan ayrı tutabilir ve daha düzenli bir kod yapısı elde edebilirsiniz.

Repository Pattern’in Avantajları Nelerdir?

  • Veritabanı işlemlerinin uygulama kodundan ayrılmasını sağlar.
  • Veritabanına erişimin yönetimini basitleştirir.
  • Kod tekrarını önler.
  • Uygulamanın test edilebilirliğini arttırır.
  • Uygulama kodunun daha düzenli ve okunaklı olmasını sağlar.

Laravel Repository Pattern Örneği

Şimdi, Laravel Repository Pattern’in nasıl kullanıldığını bir örnek üzerinde inceleyelim. Bu örnekte, bir “Users” tablosu oluşturup, bu tablodaki verileri CRUD işlemleriyle yöneteceğiz.

Adım 1: Veritabanı Tablosu Oluşturma

Öncelikle, verilerimizi barındıracak bir veritabanı tablosu oluşturmamız gerekiyor. Bunun için, migrations yapısını kullanacağız. users adında bir tablo oluşturmak için aşağıdaki komutu çalıştırabilirsiniz:

php artisan make:migration create_users_table --create=users

Bu, database/migrations dizini altında yeni bir migration dosyası oluşturacaktır. Dosyanın içeriğini aşağıdaki gibi düzenleyin:

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }

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

Bu migration, users tablosunu oluşturacak ve tablo sütunlarını tanımlayacaktır. Migration’ı çalıştırmak için aşağıdaki komutu kullanabilirsiniz:

php artisan migrate

Adım 2: Model Oluşturma

Şimdi, User modelini oluşturacağız. Bunun için, aşağıdaki komutu çalıştırın:

php artisan make:model User -m

Bu, yeni bir User modeli ve users tablosu için bir migration dosyası oluşturacaktır. Migration dosyasını daha önce yarattığımız dosya ile değiştirebilirsiniz.

Şimdi, User modelinin içeriğini aşağıdaki gibi düzenleyin:

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    use HasFactory;

    protected $fillable = [
        'name',
        'email',
        'password',
    ];
}

Bu model, users tablosu ile ilişkilendirilir ve $fillable özelliği ile sadece belirtilen alanların güncellenebileceğini belirtir.

Adım 3: Repository Oluşturma

Artık, veri tabanı işlemlerimizi gerçekleştirecek olan repository’yi oluşturabiliriz. Bu repository, User modeline erişecek ve CRUD işlemlerini gerçekleştirecektir.

Öncelikle, app/Repositories dizini altında yeni bir dosya oluşturalım. Bu dosyanın adını EloquentUserRepository koyalım ve içeriğini aşağıdaki gibi düzenleyelim:

namespace App\Repositories;

use App\Models\User;

class EloquentUserRepository implements UserRepositoryInterface
{
    public function all()
    {
        return User::all();
    }

    public function create(array $attributes)
    {
        return User::create($attributes);
    }

    public function update($id, array $attributes)
    {
        $user = User::findOrFail($id);

        $user->update($attributes);

        return $user;
    }

    public function delete($id)
    {
        $user = User::findOrFail($id);

        $user->delete();

        return true;
    }
}

Bu repository, UserRepositoryInterface arayüzünü uygular ve User modeline erişim sağlar. all(), create(), update() ve delete() metodları, sırasıyla tüm kullanıcıları listeler, yeni bir kullanıcı oluşturur, var olan bir kullanıcıyı günceller ve var olan bir kullanıcıyı siler.

Adım 4: Repository Arayüzü Oluşturma

Şimdi, oluşturduğumuz repository’yi kullanarak uygulama kodunu yazmadan önce, bir repository arayüzü oluşturmamız gerekiyor. Bu arayüz, repository’nin hangi metotları içermesi gerektiğini belirleyecek ve daha esnek bir yapı elde etmemizi sağlayacaktır.

Bunun için, app/Repositories dizini altında yeni bir dosya oluşturalım. Bu dosyanın adını UserRepositoryInterface koyalım ve içeriğini aşağıdaki gibi düzenleyelim:

namespace App\Repositories;

interface UserRepositoryInterface
{
    public function all();

    public function create(array $attributes);

    public function update($id, array $attributes);

    public function delete($id);
}

Bu arayüz, EloquentUserRepository arayüzünü uygulamak zorundadır.

Adım 5: Controller İşlemleri

Son olarak, veri tabanı işlemlerini gerçekleştireceğimiz controller’ımızı oluşturalım. Bu controller, repository’i kullanarak CRUD işlemlerini gerçekleştirecektir.

Öncelikle, app/Http/Controllers dizini altında yeni bir dosya oluşturalım. Bu dosyanın adını UserController koyalım ve içeriğini aşağıdaki gibi düzenleyelim:

namespace App\Http\Controllers;

use App\Repositories\UserRepositoryInterface;
use Illuminate\Http\Request;

class UserController extends Controller
{
    protected $userRepository;

    public function __construct(UserRepositoryInterface $userRepository)
    {
        $this->userRepository = $userRepository;
    }

    public function index()
    {
        $users = $this->userRepository->all();

        return view('users.index', compact('users'));
    }

    public function create()
    {
        return view('users.create');
    }

    public function store(Request $request)
    {
        $attributes = $request->only(['name', 'email', 'password']);

        $this->userRepository->create($attributes);

        return redirect()->route('users.index');
    }

    public function edit($id)
    {
        $user = $this->userRepository->find($id);

        return view('users.edit', compact('user'));
    }

    public function update(Request $request, $id)
    {
        $attributes = $request->only(['name', 'email', 'password']);

        $this->userRepository->update($id, $attributes);

        return redirect()->route('users.index');
    }

    public function destroy($id)
    {
        $this->userRepository->delete($id);

        return redirect()->route('users.index');
    }
}

Bu controller, UserController sınıfını genişletir ve repository’yi construct metodunda enjekte eder. index(), create(), store(), edit(), update() ve destroy() metodları, sırasıyla tüm kullanıcıları listeler, yeni bir kullanıcı oluşturur, var olan bir kullanıcıyı günceller, bir kullanıcıyı siler ve kullanıcının düzenleme sayfasını gösterir.

Laravel Repository Pattern, veri tabanı işlemlerini uygulama kodundan ayrı tutarak daha düzenli bir yapı oluşturmanızı sağlar. Bu desenin avantajlarından yararlanmak için, User modeline uygun bir repository ve controller oluşturduk. Umarım bu yazı, Laravel Repository Pattern hakkında fikir sahibi olmanızı sağlamıştır.

Repository Pattern’in avantajları nelerdir?

Repository Pattern, veri tabanı işlemlerinin uygulama kodundan ayrılmasını sağlar. Bu sayede, veri tabanına erişimin yönetimini basitleştirir, kod tekrarını önler ve uygulamanın test edilebilirliğini arttırır.

Laravel’de Repository Pattern nasıl kullanılır?

Laravel, Repository Pattern’i kullanmak için hazır bir yapı sunar. Veri tabanı işlemlerini gerçekleştiren repository’leri oluşturabilir ve bu repository’leri kullanarak controller’larınızda CRUD işlemlerini gerçekleştirebilirsiniz.

Repository Pattern ve ORM arasındaki fark nedir?

ORM (Object-Relational Mapping), veri tabanından aldığınız yapıyı nesne olarak kullanmanızı sağlar. Repository Pattern ise, veri tabanı işlemlerini uygulama kodundan ayrı tutarak daha düzenli bir yapı oluşturmanızı sağlar.

Repository Pattern, her proje için uygun mudur?

Repository Pattern, her proje için uygun olmayabilir. Basit projelerde veri tabanı işlemleri doğrudan controller içinde gerçekleştirilebilir. Ancak büyük ölçekli projelerde, Repository Pattern kullanarak veri tabanı işlemlerini uygulama kodundan ayrı tutmak daha düzenli bir kod yapısı elde etmenizi sağlar.

Repository Pattern yerine ORM kullanılabilir mi?

Evet, ORM (Object-Relational Mapping) kullanarak da veri tabanı işlemleri gerçekleştirilebilir. Ancak Repository Pattern’in avantajlarından yararlanmak isteyenler için Laravel, bu deseni uygulamak için hazır bir yapı sunar.

İlgili Yazılar

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir