İçeriğe geç →

Nasıl Yapılır ? Laravel/Lumen’e Repository Pattern ‘ı implement Etmek

Yeni bir seriye başlıyorum ” Nasıl Yapılır ?” serisi umarım birşeyler aktarabilirim size.Yanlışım varsa şimdiden affola.

Öncelikle RepositoryPattern’ı bilmeyenler için şu yazıdan öğrenebilirsiniz. Bu yazımızda Repository pattern’ı aslında şuanda lumene implemente edeceğim ve lütfen kodların açıklamalarını okuyun.

STRUCTURE

  • App\Repository\Repository.php | Class
  • App\Repository\RepositoryInterface.php | Interface

RepositoryInterface.php

<?php
namespace App\Repository;
use \Illuminate\Database\Eloquent\Model;
interface RepositoryInterface
{
    // Repo pattern modellere uygulanır
    public function __construct(Model $model);

    // tüm verileri çekeceğimiz method
    public function all();

    // bir veri oluşturmak için kullanacağımız method
    public function create(array $data);

    // bir update işlemi yapmak için kullanacağımız method
    public function update(array $data, int $id);

    // delete işlemini gerçekleştireceğimiz method
    public function delete(int $id);

    // bir veri göstereceğimiz method
    public function show(int $id);

}

RepositoryClass.php

<?php
namespace App\Repository;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\Relation;
// RepoInterface'imizi repository clasımıza implemente ediyoruz
class Repository implements RepositoryInterface
{
    // modeli tutacağımız property
    protected $model;

    // Repository'i oluştururken Construct Injection 'ı kullanıyoruz ve model üzerinden işlemlerimizi gerçekleştiriyoruz
    public function __construct(Model $model)
    {
        $this->model = $model;
    }

    public function all()
    {
        return $this->model->all();
    }

    public function create(array $data)
    {
        return $this->model->create($data);
    }

    public function find(int $id)
    {
        return $this->model->find($id);
    }

    public function findOrFail(int $id)
    {
        return $this->model->findOrFail($id);
    }

    public function update(array $data, int $id)
    {
        $record = $this->findOrFail($id);
        return $record->update($data);
    }

    public function delete(int $id)
    {
         return $this->model->findOrFail($id)->delete();
    }

    public function show(int $id)
    {
        return $this->model->findOrFail($id);
    }

    public function getModel(): Model
    {
        return $this->model;
    }

    public function setModel(Model $model): void
    {
        $this->model = $model;
    }

    public function with(Relation $relation)
    {
        return  $this->model->with($relation);
    }
}

UserController.php

<?php
namespace App\Http\Controllers;

use App\Repository\Repository;
use App\User;
use Illuminate\Http\Request;

class UserController extends Controller
{
    // modelimizi tutacağımız property
    protected $model;

    //constructa hangi modeli kullanacaksanız onu enjecte ediyorsunuz
    public function __construct(User $user)
    {
        // ve repository classını initiliaze ediyoruz.
        $this->model = new Repository($user);
    }

    public function create(Request $request)
    {
        // Gelen Requesti bir dizi filtreden geçiriyoruz
        $this->validate($request,[
            'password' => 'required|max:20',
            'email' => 'required|max:50|email',
       ]);

        //ve repository üzerinden create methoduyla modelin fillable alanları ile yeni bir datayı veritabanına ekliyoruz.
       if (!$this->model->create($request->only($this->model->getModel()->fillable))){
           throw new \Exception('there was an error creating user');
       }

       return response('User created')->setStatusCode(201);
    }

    public function update(Request $request,int $id)
    {
        $this->validate($request,[
            'password' => 'required|max:20',
            'email' => 'required|max:50|email',
        ]);

        if (!$this->model->update($request->only($this->model->getModel()->fillable),$id)){
            throw new \Exception("Update Failed");
        }
        return $this->model->find($id);
    }

    public function delete(int $id)
    {
        $this->model->delete($id);
        return response('User Deleted',200);
    }

    public function showAllUsers()
    {
        return $this->model->all();
    }

    public function showOneUser(int $id)
    {
        return $this->model->findOrFail($id);
    }

}

Kategori: php

Yorumlar

Bir cevap yazın

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