<p>Laravel Observers temizdir ancak ayrı bir sınıf dosyası ve bir ServiceProvider'da kayıt çağrısı gerektirir. Mantık modelden kopuktur.</p>

<h3>
    <a name="doppar-array-style" href="#doppar-array-style"></a>
    Doppar — Array Style
</h3>

<div class="highlight js-code-highlight">
    <pre class="highlight php"><code><span class="kd">class</span> <span class="nc">Post</span> <span class="kd">extends</span> <span class="nc">Model</span>

{
protected array $hooks = [
‘before_created’ => [self::class, <span class=”s1>’generateSlug’],
‘after_created’ => [self::class, <span class=”s1>’clearCache’],
‘after_updated’ => [
<span class=”s1>’handler’ => AuditHook::class,
<span class=”s1>’when’ => [self::class, <span class=”s1>’shouldAudit’], // Koşullu!
],
];
public static function generateSlug(Model $model): void
{
$model->slug = str<span class=”p>()->slug($model->title);
}
public static function clearCache(Model $model): void
{
Cache::delete(<span class=”s1>’posts.all’);
Cache::delete(<span class=”s1>’post.’ . $model->id);
}
public static function shouldAudit(Model $model): bool
{
return $model->isDirtyAttr‘title’) || $model->isDirtyAttr‘status’);
}
}

<h3>
    <a name="doppar-raw-hook-endraw-attribute-style" href="#doppar-raw-hook-endraw-attribute-style"></a>
    Doppar — <code>#[Hook]</code> Attribute Style
</h3>

<div class="highlight js-code-highlight">
    <pre class="highlight php"><code><span class="kn">use</span> <span class="nc">Phaseolies\Database\Entity\Attributes\Hook</span><span class="p">;</span>

class Post extends Model
{
#[Hook(‘before_created’)]
public function generateSlug(): void
{
$this->slug = str<span class=”p>()->slug<span class=”p>($this->title);
}
#[Hook(‘before_created’)]
public function setDefaultStatus(): void
{
if (empty($this->status)) {
$this->status = <span class=”s1>’draft’;
}
}
#[Hook(‘after_created’)]
public function notifySubscribers(): void
{
(new NotifySubscribersJob($this->id))->dispatch();
}
#[Hook(‘after_deleted’)]
public function clearPostCache(): void
{
Cache::delete(<span class=”s1>’post.’ . $this->id);
}
}

<p>Doppar, üç farklı hook stilini destekler — inline array geri çağırmaları, sınıf tabanlı hook işleyicileri ve PHP nitelik hook'ları — gerekirse hepsi aynı model üzerinde. Koşullu <code>when</code> niteliği ise öne çıkan bir özellik: Hook'lar yalnızca çalıştığınızda tetiklenir.</p>

<p>Laravel'ın <code>#[Hook]</code> niteliği yoktur, $hooks dizisi yoktur ve yerleşik bir koşullu <code>when</code> koruması yoktur. Doppar'ın hook sistemi daha esnek, daha ifade edici ve daha iyi yerleştirilmiştir.</p>

<h2>
    <a name="task-scheduling-amp-cron" href="#task-scheduling-amp-cron"></a>
    Task Scheduling &amp; Cron
</h2>

<h3>
    <a name="laravel" href="#laravel"></a>
    Laravel
</h3>

<div class="highlight js-code-highlight">
    <pre class="highlight php"><code><span class="c1">// app/Console/Kernel.php</span>

protected function schedule(Schedule $schedule): void
{
$schedule->command(<span class=”s1>’emails:send’)->hourly();
$schedule->job(new GenerateReports)->daily();
}

<p>Daha sonra sunucunuzun crontab'ında:<br/></p>

<div class="highlight js-code-highlight">
    <pre class="highlight shell"><code><span class="k">*</span> <span class="k">*</span> <span class="k">*</span> <span class="k">*</span> <span class="k">*</span> php /path/to/artisan schedule:run <span class="o">&gt;&gt;</span> /dev/null 2&gt;&amp;1

<p>Laravel, sunucunun crontab'ında düzenleme ve Supervisor'ı daemon benzeri çalışma için ayarlamayı gerektirir. Herhangi bir DevOps hatası durumunda işleriniz sessizce durabilir.</p>

<h3>
    <a name="doppar" href="#doppar"></a>
    Doppar
</h3>

<div class="highlight js-code-highlight">
    <pre class="highlight shell"><code><span class="c"># Standart mod</span>

php pool cron:run

# Gerçek zamanlı daemon modu – hiçbir crontab gerekmez
php pool cron:run –daemon

# Tamamen yönetilen yerel daemon
php pool cron:daemon start
php pool cron:daemon stop
php pool cron:daemon restart
php pool cron:daemon status

<p>Doppar’ın çift modlu zamanlama motoru, ya bir sistem cron ile çalışır ya da kendi kendine yönetilen bir arka plan daemon olarak çalışır. Hiçbir Supervisor yok. Hiçbir systemd yok. Hiçbir crontab düzenlemesi gerekmiyor. Framework, PID takibi, <code>SIGTERM/SIGINT</code> yönetimi, hata kurtarma ve günlüğe alma işlemlerini dahili olarak yönetir — ayrıca saniye seviyesinde görev ayrıntısını destekler, bu da crontab tabanlı yaklaşımlar tarafından asla gerçekleştirilemez.</p>

<h2>
    <a name="frozen-services" href="#frozen-services"></a>
    Frozen Services
</h2>

<p>Laravel'de eşdeğeri yoktur. Doppar'ın <code>#[Immutable]</code> konteyner özelliği, katı bir yaşam döngüsü sınırı uygular — servisler başlangıçta yapılandırılabilir ve çalıştırmada kalıcı olarak dondurulur. Mutasyon, gelenek ile değil, nesne seviyesinde yakalanır.</p>

<div class="highlight js-code-highlight">
    <pre class="highlight markdown"><code><span class="gu">## Yaşam Döngüsü Aşamaları</span>
AşamaAçıklama
Aşama 1: Başlatconfig(), env(), database ile yapılandır — tüm yazmalara izin verilir
Aşama 2: DondurmaKonteyner freeze() çağrısında bulunur — özellikler anlık görüntü alınır ve ardından kilitlenir
Aşama 3: Çalışma ZamanıOkumalar şeffaf çalışır — her yazma ImmutableViolationException fırlatır

<div class="highlight js-code-highlight">
    <pre class="highlight php"><code><span class="na">#[Immutable]</span>

class PaymentService
{
use EnforcesImmutability;
public string $gateway = <span class=”s1>’stripe’;
public float $taxRate = 0.08;
}

// Servis sağlayıcı (başlatma penceresi – yazılabilir)
$payment->taxRate = config‘payment.tax_rate’);
$this->app->singleton(PaymentService::class,
fn<span class=”p>() => $payment);

// Çalışma zamanında — dondurulmuş, okumalar çalışır, yazmalar atılır
$payment->calculateTotal<span class=”p>(100); // ✓ çalışır
$payment->taxRate = 0.0;
// ✗ ImmutableViolationException:
// Cannot mutate $taxRate on [PaymentService]

<h3>
    <a name="feature-comparison" href="#feature-comparison"></a>
    Feature Comparison
</h3>

<div class="highlight js-code-highlight">
    <pre class="highlight markdown"><code>| Özellik                           | PHP readonly sınıf       | Laravel singleton            | Doppar #[Immutable]              |

|———————————-|————————–|———————|———————————-|
| config()/env() üzerinden yapılandırma | ✗ Mümkün değil post-yeni | ✗ Sadece gelenek | ✓ Başlatma penceresinde |
| Mutasyona istisna | Genel PHP Hatası | ✗ istisna yok | ✓ Typed ImmutableViolationException |
| Servis Sağlayıcı başlatması ile çalışır | ✗ | ✓ | ✓ Bunun için tasarlanmış |
| Nesne seviyesinde zorunluluk sağlanır| PHP motoru | ✗ | ✓ __set() aracılığıyla |

<p>Laravel, başlatma sonrası hizmet değişmezliğini zorunlu kılacak bir mekanizmaya sahip değildir. Doppar, bir kod inceleme yönergesini, bir framework düzeyinde güvenceye dönüştürür. Sessiz paylaşılan durum hatalarının tamamı artık mevcut olamaz.</p>

<h2>
    <a name="temporal-timetravel-orm" href="#temporal-timetravel-orm"></a>
    Temporal Time-Travel ORM
</h2>

<p>Laravel, yerleşik bir denetim geçmişine sahip değildir. Geliştiriciler gözlemciler, üçüncü taraf paketler veya özel çözümler ile ekleme yapmak zorundadır. Doppar’ın <code>#[Temporal]</code> niteliği, her modele bir bütün, sorgulanabilir bir zaman makinesi kazandırır — yalnızca bir satır ile etkinleştirilir.</p>

<p>Laravel — manuel gözlemci yaklaşımı<br/></p>

<div class="highlight js-code-highlight">
    <pre class="highlight php"><code><span class="c1">// App\Observers\ContractObserver.php</span>

class ContractObserver
{
public function updated(Contract $c): void
{
AuditLog::create([
<span class=”s1>’model’ => Contract::class,
<span class=”s1>’record’ => $c->id,
<span class=”s1>’before’ => $c->getOriginal(),
<span class=”s1>’after’ => $c->toArray(),
<span class=”s1>’changed’ => $c->getDirty(),
]);
}
}
// AppServiceProvider — ayrı olarak kaydedilmelidir
Contract::observe(ContractObserver::class);
// Her model için bunu tekrarlayın. Sürekli olarak bakım yapın.

<p>Doppar — bir niteliği ile her şey çalışıyor</p>

<div class="highlight js-code-highlight">
    <pre class="highlight php"><code><span class="na">#[Temporal]</span>

class Contract extends Model
{
protected $creatable = [
<span class=”s1>’title’, <span class=”s1>’status’, <span class=”s1>’amount’, <span class=”s1>’client_id’
];
}

// Bir kez çalıştır — contracts_history tablosunu oluşturur
// php pool migrate:temporal

// Kontrolcüleriniz hiç değişmez.
// Geçmiş otomatik olarak birikir.

<p><code>#[Temporal]</code> niteliği ile birlikte gelen tüm özellikler:</p>

<div class="highlight js-code-highlight">
    <pre class="highlight php"><code><span class="nc">Contract</span><span class="o">::</span><span class="nf">at</span><span class="p">(</span><span class="s1>'2024-01-01'</span><span class="p">)</span>
<span class="o">-&gt;</span><span class="nf">find</span><span class="p">(</span><span class="mi">42</span><span class="p">);</span>

<p>Time-travel sorgusu — herhangi bir zaman noktası</p>

<div class="highlight js-code-highlight">
    <pre class="highlight php"><code><span class="c1">// Kontrat 42, 1 Ocak'ta nasıl görünüyordu?</span>

$contract = Contract::at(<span class=”s1>’2024-01-01′)
->find(42);

echo $contract->status; // ‘draft’
echo <span<class=”nv”>$contract->amount; // 5000

// Koleksiyonlar da – aynı akıcı API
$actives = Contract::at(<span class=”s1>’2024-06-01′)
->where(<span class=”s1>’status’, <span class=”s1>’active’)
->orderBy(<span class=”s1>’amount’, <span class=”s1>’DESC’)
->get();

<p>Diff, geri sar, kurtar</p>

<div class="highlight js-code-highlight">
    <pre class="highlight php"><code><span class="nv">$contract</span> <span class="o">=</span> <span class="nc">Contract</span><span class="o">::</span><span class="nf">find</span><span class="p">(</span><span class="mi">42</span><span class="p">);</span>

// İki tarih arasındaki yapısal diff
$diff = $contract->diff(<span class=”s1>’2024-01-01′, <span class=”s1>’2024-06-01′);
// [‘changes’ => [‘status’ => [‘from’=>’draft’, ‘to’=>’active’]]]

// Okunabilir tarihsel örnek
$old = $contract->rewindTo(<span class=”s1>’2024-01-01′);
echo $old->status; // ‘draft’ — canlı kayıt etkilenmez

// Geri sar ve devam et (geçmişe kaydedilir)
$contract->restoreTo(<span class=”s1>’2024-01-01′);

<p>Laravel'de yerleşik bir geçici işlevsellik yoktur. Standart yaklaşım (bir denetim tablosu için model gözlemcisi yazmak) ayrı bir dosya, ayrı bir kayıt gerektirir ve her model için sürdürülmesi gerekir.</p>

<p>Doppar’ın <code>#[Temporal]</code> niteliği, tüm özelliği etkinleştirir — geçmiş tablosu, yaşam döngüsü hook'ları, zaman yolculuğu sorguları, diff motoru, geri sarma, kurtarma ve aktör izleme — bir niteliği ve bir komut ile.</p>

<h2>
    <a name="observable-model-properties" href="#observable-model-properties"></a>
    Observable Model Properties
</h2>

<p>Laravel, model seviyesi olaylar sunar. aftersave() içine bağlanıyorsunuz ve ardından hangi sütunun değiştiğini manuel olarak kontrol ediyor, eski ve yeni değerleri karşılaştırıyor ve koşullu olarak mantık çalıştırıyorsunuz. Bu çalışır ama temiz bir şekilde ölçeklenmez.</p>

<p>Doppar bir seviye daha ileri gitti. <code>#[Watches]</code> ile, reaktif izleyicileri doğrudan özelliğin kendisinde bildirirsiniz:<br/></p>

<div class="highlight js-code-highlight">
    <pre class="highlight php"><code><span class="na">#[Watches(OrderStatusChanged::class)]</span>

protected $status;

#[Watches(TriggerFraudReview::class, when: FraudThreshold::class)]
protected $total;

<p><code>$order-&gt;status</code> değiştiğinde ve veritabanına ulaştığında — izleyiciniz otomatik olarak eski değer ile yeni değer ile birlikte çalışır ve tam model örneğini alır. Manuel kirli kontrolü yok. Dağınık if ifadeleri yok. Nitelik, sözleşmedir.</p>

<h4>
    <a name="what-makes-it-stand-out" href="#what-makes-it-stand-out"></a>
    Ne öne çıkarıyor:
</h4>

<p><strong>Özellik seviyesinde</strong> — tablo seviyesinde değil, yaşam döngüsü seviyesinde değil. Değiştirilen tam sütun.</p>

<p><strong>Koşullu</strong> — bir model yöntemine veya özel bir durum sınıfına ekleyebilirsiniz. İzleyici yalnızca gerektiğinde çalışır.</p>

<p><strong>DI ile çözülmüş</strong> — izleyici ve koşullar konteynerden çözülür. Tam bağımlılık enjeksiyonu, tamamen test edilebilir.</p>

<p><strong>Tekrar edilebilir</strong> — bir özelliğe birden fazla <code>#[Watches]</code> ekleyebilirsiniz. Her biri bağımsız olarak değerlendirilir.</p>

<p><strong>Sıfır yük</strong> — yansıma her sınıf için bir işlem başına bir kere çalışır, sonuç önbelleğe alınır. İzlenmeyen modeller için hiçbir maliyet yoktur.</p>

<h2>
    <a name="doppar-benchmark-result" href="#doppar-benchmark-result"></a>
    Doppar Benchmark Sonucu
</h2>

<p>Doppar, en başından itibaren hız için tasarlanmıştır. Her tekrarlanan yürütme akıllıca bellekte tutularak optimizasyon yapılır. Üçüncü taraf bağımlılıklar en aza indirilmiştir — çoğu özellikler doğrudan çekirdeğe entegre edilmiştir.</p>

<p>Benchmark sonucu: Doppar, 1,000 eşzamanlı kullanıcı ile 318+ istek/saniye sürdü, 50,000 istekte %100 başarı oranı ve ağır veritabanı yükü altında ortalama yanıt süreleri 3 saniyenin altında kaldı.</p>

<p>Bu, karşılaştırılabilir Laravel benchmarklarına göre 7–8 kat daha yüksek bir verimlilik anlamına gelir.</p>

<p>Bu marjinal bir iyileşme değil. 7–8 katlık bir verimlilik farkı mimaridir. Yüksek trafik API'leri, gerçek zamanlı uygulamalar veya maliyet duyarlı altyapılar inşa ediyorsanız, Doppar’ın performans hikayesi görmezden gelinemez.</p>

<h2>
    <a name="verdict" href="#verdict"></a>
    Karar
</h2>

<p>Laravel ekosistem açısından kazanır. Eğer büyük bir topluluğa, birçok Stack Overflow cevabına, binlerce pakete ve savaş testinden geçmiş bir üretim geçmişine ihtiyacınız varsa, Laravel bugünkü en güvenli seçimdir. Bu konumu hak etmiştir.</p>

<p>Doppar ise neredeyse tüm teknik konularda kazanır. Inline <code>#[Bind]</code> DI, <code>#[Hook]</code> niteliği sistemi, akıcı istek boru hattı, yerel cron daemon ve 7–8 katlık performans avantajı, Laravel ile karşılaştırıldığında, artımlı iyileştirmeler değil - doğrudan modern PHP 8 tasarım prensipleri üzerine inşa edilmiş mimari atılımlardır.</p>

<p>Soru şu değil: hangi framework daha iyi inşa edildi? Teknik anlamda Doppar gerçekten etkileyici ve hemen hemen her kafa kafaya karşılaştırmada Laravel'den üstündür. Soru şu: projenizin ihtiyacı olan kanıtlanmış bir ekosistem mi yoksa performans ilkeli, geliştirici deneyimi birinci mimari mi?</p>

<p>2026'daki yeşil alan projeleri için? Doppar’a ciddi bir şans verin.</p>

<p>Doppar'ı deneyin: <a href="https://doppar.com">doppar</a></p>

Kaynak: Orijinal Makale

Bu Makaleyi Paylaş