Jangan Gunakan Model Obesrvers Di Laravel - CRUDPRO

Jangan Gunakan Model Obesrvers Di Laravel

Jangan Gunakan Model Observer Di Laravel

Apakah Anda Seorang Laravel Developer? Anda mungkin akrab dengan fitur Model Observer Eloquent. Ini adalah trait ajaib dari Framework yang memungkinkan Anda merespons kejadian CRUD (Create, Read, Update, Delete) pada model dalam aplikasi Anda.

Anda akan menemukan banyak tutorial tentang apa itu model observer dan bagaimana menggunakannya. Tapi yang membuat saya khawatir adalah tidak ada yang mempertanyakan apakah layak menggunakannya sejak awal.

Hanya karena Anda bisa melakukan sesuatu bukan berarti Anda harus melakukannya. Pemrogram pemula sering kali menganggap model observer Eloquent berguna. Dan sejujurnya, saya benci mengambil jalan pintas. Saya sudah lama berhenti menggunakannya.

Pemrogram pemula mungkin tergoda untuk menggunakan metode ini, misalnya untuk bereaksi terhadap pembuatan objek. Akhirnya kode akan mulai menggunakan keajaiban yang disediakan oleh Framework bukannya ditulis oleh buku. Akibatnya, kode tersebut terikat pada Framework dan tidak dapat digunakan kembali.

Kelemahan lain adalah menguji dan men-debug kode tersebut. Tidak mungkin untuk dengan mudah dan cepat menguji bagian kode ini tanpa menjalankan seluruh Framework.

Salah satu artikel terbaru saya di Medium menginspirasi saya untuk menulis publikasi ini. Dalam artikel ini, salah satu programmer merekomendasikan menggunakan model observer. Dia mencontohkan membuat artikel slug. Singkatnya, kodenya terlihat seperti ini:

//model-observer-slug.php
<?php
 
namespace App\Observers;
 
use App\Models\Article;
 
class ArticleObserver
{   
    public function saving(Article $article)
    {
        $article->slug = str_slug($article->title);
    }
}

Sebaliknya, yang diperlukan hanyalah menerapkan dasar-dasar seni pemrograman. Pola factory dapat membantu di sini. Efek akhir setelah refactoring adalah:

//model-observer-factory.php
<?php

namespace App\Factory;

use App\Models\Article;
use App\Models\User;

final class ArticleFactory
{
    public function create(User $author, string $title): Article
    {
        $article = new Article();
        $article->author = $author;
        $article->title = $title;
        $article->slug = str_slug($title);
        
        return $article;
    }
}

Dengan memperkenalkan factory dan menggunakannya sebagai titik awal untuk artikel apa pun, Anda dapat menerapkan aturan bisnis yang sewenang-wenang ke aplikasi Anda. Berikut ini contoh penggunaan di controller:

//model-observer-action.php
<?php

class ArticleController
{
    private ArticleFactory $articleFactory;

    public function __construct(UserFactory $articleFactory)
    {
        $this->articleFactory = $articleFactory;
    }

    public function create(Request $request): response
    {
        $article = $this->articleFactory->create(
            Auth::user(),
            $request->input('title'),
        );
        
        $article->save();
        
        // …
    }
}

Kode debug yang ditulis dengan cara ini mudah. Pengujian unit factory seperti itu menjadi sangat menyenangkan dan mudah.

//model-observer-test.php
<?php

class ArticleFactoryTest extends TestCase
{
    private ArticleFactory $sut;

    protected function setUp(): void
    {
        $this->sut = new ArticleFactory();
    }

    public function testItCreatesArticleWithSlug(): void
    {
        $article = $this->sut->create(
            new User(),
            'Article title test'
        );
        
        self::assertEquals('article-title-test', $article->slug);
    }
}

Fungsionalitas yang sama dapat dibuat lebih baik dengan menerapkan pola desain yang sederhana dan terbukti. Tidak ada sihir atau trik yang diperlukan. Selain itu, ketergantungan Framework yang lebih sedikit berarti lebih sedikit sakit kepala saat bermigrasi ke versi yang lebih tinggi.

Permintaan untuk semua orang: Tolong jangan ambil jalan pintas. Buat kode yang indah dan sederhana menggunakan metodologi dan pola desain yang telah terbukti.