OpenSynergic / leconfe

6 stars 0 forks source link

[WIP] Implement Repository Pattern #225

Closed thisnugroho closed 2 months ago

thisnugroho commented 3 months ago

Related issue: https://github.com/OpenSynergic/leconfe/issues/213

Kenapa menggunakan repository pattern

Repository Pattern memungkinkan pemisahan yang jelas antara logika aplikasi (application logic) dan akses data (data access), Jadi query tidak dilakukan secara langsung melalui model, melainkan melalui repository terlebih dulu, yang kemudian bertanggung jawab untuk menjalankan query ke database menggunakan model.

Contoh penggunaan dalam hal menerima abstract yang masuk.

$submission = Submission::find(1);
$submission->state()->accept();
$submission = Repository::submission()->find(1);
Repository::submission()->getState($submission)->accept();
rahmanramsi commented 3 months ago

Mungkin bisa dibikin base nya dulu de, jadi semua repo tinggal extend itu. Kayanya cukup aja SubmissionRepository tanpa perlu BaseSubmissionRepository. Perlu base global aja yg mencakup fungsi yg umum untuk digunakan semua repo

namespace App\Repositories;

use Illuminate\Database\Eloquent\Model;

abstract class BaseRepository
{
    protected string $model;

    abstract public function getModel();

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

    public function update(Model $model, array $data)
    {
        $model->update($data);

        if (method_exists($model, 'meta') && array_key_exists('meta', $data) && is_array($data['meta'])) {
            $model->setManyMeta($data['meta']);
        }

        return $model;
    }

    public function delete(Model $model)
    {
        return $model->delete();
    }

}