Laravel’de en sık kullanılan tasarım desenlerini gerçek dünya örnekleriyle keşfedin. Repository’den Strateji desenine kadar – PHP geliştirme becerilerinizi bir üst seviyeye çıkarın.
<p>Laravel kodlarının bazılarının neden şık ve sürdürülebilir olduğunu, bazılarının ise karmaşık bir hale geldiğini hiç merak ettiniz mi? Sırrı tasarım desenlerinde - Laravel'in de içsel olarak kullandığı, test edilmiş çözümlerde yatıyor.<br/>Sizlere Laravel geliştirme yeteneklerinizi dönüştürecek 12 deseni göstereceğim. 🚀</p>
<h2>
<a name="why-design-patterns-matter" href="#why-design-patterns-matter"></a>
🎯 Neden Tasarım Desenleri Önemli?
</h2>
<p>Tasarım desenleri size:</p>
<ul>
<li>Daha okunabilir ve temiz kod</li>
<li>Daha iyi test yetenekleri</li>
<li>Diğer geliştiricilerle ortak bir kelime dağarcığı</li>
<li>Büyüyen uygulamalar için ölçeklenebilir mimari</li>
</ul>
<p>Laravel zaten birçok bu deseni içsel olarak kullanıyor. Bunları anlamak, framework ile çalışmak demektir, karşısında değil.</p>
<h2>
<a name="repository-pattern" href="#repository-pattern"></a>
1️⃣ Repository Deseni
</h2>
<p>Problem: Kontrolcüleriniz fazla kalabalık, veritabanı mantığı her yerde.<br/>Çözüm: Veri erişimini repository'lerde merkezi hale getirin.<br/></p>
<div class="highlight js-code-highlight">
<pre class="highlight php"><code><span class="kd">interface</span> <span class="nc">UserRepositoryInterface</span> <span class="p">{</span>
<span class="k">public</span> <span class="k">function</span> <span class="n">find</span><span class="p">(</span><span class="nv">$id</span><span class="p">);</span>
<span class="k">public</span> <span class="k">function</span> <span class="n">create</span><span class="p">(</span><span class="kt">array</span> <span class="nv">$data</span><span class="p">);</span>
<span class="p">}</span>
<span class="kd">class</span> <span class="nc">EloquentUserRepository</span> <span class="kd">implements</span> <span class="nc">UserRepositoryInterface</span> <span class="p">{</span>
<span class="k">public</span> <span class="k">function</span> <span class="n">find</span><span class="p">(</span><span class="nv">$id</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="nc">User</span><span class="o">::</span><span class="nf">find</span><span class="p">(</span><span class="nv">$id</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="c1">// ServiceProvider'da Bağlayın</span>
<span class="nv">$this</span><span class="o">-></span><span class="n">app</span><span class="o">-></span><span class="nf">bind</span><span class="p">(</span><span class="nc">UserRepositoryInterface</span><span class="o">::</span><span class="n">class</span><span class="p">,</span> <span class="nc">EloquentUserRepository</span><span class="o">::</span><span class="n">class</span><span class="p">);</span>
</code></pre>
</div>
<p>Gerçek kullanım: Veritabanını, kontrolcülere dokunmadan önbellek veya API ile değiştirebilirsiniz.</p>
<h2>
<a name="service-container-di" href="#service-container-di"></a>
2️⃣ Servis Konteyneri (DI)
</h2>
<p>Laravel'in süper gücü: Otomatik bağımlılık enjeksiyonu.<br/></p>
<div class="highlight js-code-highlight">
<pre class="highlight php"><code><span class="kd">class</span> <span class="nc">OrderController</span> <span class="kd">extends</span> <span class="nc">Controller</span> <span class="p">{</span>
<span class="k">public</span> <span class="k">function</span> <span class="n">store</span><span class="p">(</span><span class="kt">OrderService</span> <span class="nv">$orderService</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="nv">$orderService</span><span class="o">-></span><span class="nf">processOrder</span><span class="p">(</span><span class="nv">$request</span><span class="o">-></span><span class="nf">all</span><span class="p">());</span>
<span class="p">}</span>
<span class="p">}</span>
</code></pre>
</div>
<p>Manuel instansiyasyon yapmaya gerek yok! Laravel bunu otomatik olarak çözüyor. 🎩✨</p>
<h2>
<a name="factory-pattern" href="#factory-pattern"></a>
3️⃣ Fabrika Deseni
</h2>
<p>Olayları kesin sınıflar belirtmeden oluşturun.<br/></p>
<div class="highlight js-code-highlight">
<pre class="highlight php"><code><span class="kd">class</span> <span class="nc">NotificationFactory</span> <span class="p">{</span>
<span class="k">public</span> <span class="k">static</span> <span class="k">function</span> <span class="n">create</span><span class="p">(</span><span class="nv">$type</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="k">match</span><span class="p">(</span><span class="nv">$type</span><span class="p">)</span> <span class="p">{</span>
<span class="s1">'email'</span> <span class="o">=></span> <span class="k">new</span> <span class="nc">EmailNotification</span><span class="p">(),</span>
<span class="s1">'sms'</span> <span class="o">=></span> <span class="k">new</span> <span class="nc">SmsNotification</span><span class="p">(),</span>
<span class="s1">'push'</span> <span class="o">=></span> <span class="k">new</span> <span class="nc">PushNotification</span><span class="p">(),</span>
<span class="p">};</span>
<span class="p">}</span>
<span class="p">}</span>
</code></pre>
</div>
<p>Gerçek kullanım: Çok kanallı bildirimler, ödeme geçitleri.</p>
<h2>
<a name="strategy-pattern" href="#strategy-pattern"></a>
4️⃣ Strateji Deseni
</h2>
<p>Bir arayüzde birden fazla algoritma.<br/></p>
<div class="highlight js-code-highlight">
<pre class="highlight php"><code><span class="kd">interface</span> <span class="nc">PaymentStrategy</span> <span class="p">{</span>
<span class="k">public</span> <span class="k">function</span> <span class="n">pay</span><span class="p">(</span><span class="nv">$amount</span><span class="p">);</span>
<span class="p">}</span>
<span class="kd">class</span> <span class="nc">CreditCardPayment</span> <span class="kd">implements</span> <span class="nc">PaymentStrategy</span> <span class="p">{</span>
<span class="k">public</span> <span class="k">function</span> <span class="n">pay</span><span class="p">(</span><span class="nv">$amount</span><span class="p">)</span> <span class="p">{</span> <span class="cm">/* ... */</span> <span class="p">}</span>
<span class="p">}</span>
<span class="kd">class</span> <span class="nc">PayPalPayment</span> <span class="kd">implements</span> <span class="nc">PaymentStrategy</span> <span class="p">{</span>
<span class="k">public</span> <span class="k">function</span> <span class="n">pay</span><span class="p">(</span><span class="nv">$amount</span><span class="p">)</span> <span class="p">{</span> <span class="cm">/* ... */</span> <span class="p">}</span>
<span class="p">}</span>
</code></pre>
</div>
<p>Gerçek kullanım: Farklı nakliye hesaplayıcıları, fiyatlandırma stratejileri.</p>
<h2>
<a name="observer-pattern" href="#observer-pattern"></a>
5️⃣ Gözlemci Deseni
</h2>
<p>Laravel Etkinlikleri = Gözlemci Deseni 🎯<br/></p>
<div class="highlight js-code-highlight">
<pre class="highlight php"><code><span class="c1">// Etkinlik</span>
<span class="kd">class</span> <span class="nc">UserRegistered</span> <span class="p">{</span>
<span class="k">public</span> <span class="k">function</span> <span class="n">__construct</span><span class="p">(</span><span class="k">public</span> <span class="nv">$user</span><span class="p">)</span> <span class="p">{}</span>
<span class="p">}</span>
<span class="c1">// Dinleyici</span>
<span class="kd">class</span> <span class="nc">SendWelcomeEmail</span> <span class="p">{</span>
<span class="k">public</span> <span class="k">function</span> <span class="n">handle</span><span class="p">(</span><span class="kt">UserRegistered</span> <span class="nv">$event</span><span class="p">)</span> <span class="p">{</span>
<span class="nc">Mail</span><span class="o">::</span><span class="nf">to</span><span class="p">(</span><span class="nv">$event</span><span class="o">-></span><span class="n">user</span><span class="p">)</span><span class="o">-></span><span class="nf">send</span><span class="p">(</span><span class="k">new</span> <span class="nc">WelcomeEmail</span><span class="p">());</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="c1">// Tetikleyici</span>
<span class="nf">event</span><span class="p">(</span><span class="k">new</span> <span class="nc">UserRegistered</span><span class="p">(</span><span class="nv">$user</span><span class="p">));</span>
</code></pre>
</div>
<p>Gerçek kullanım: E-postaları gönderme, analizleri güncelleme, webhook'ları tetikleme - hepsi bağımsız.</p>
<h2>
<a name="decorator-pattern" href="#decorator-pattern"></a>
6️⃣ Dekoratör Deseni
</h2>
<p>Laravel Middleware = Dekoratör Deseni 🎭<br/></p>
<div class="highlight js-code-highlight">
<pre class="highlight php"><code><span class="kd">class</span> <span class="nc">LogRequest</span> <span class="p">{</span>
<span class="k">public</span> <span class="k">function</span> <span class="n">handle</span><span class="p">(</span><span class="nv">$request</span><span class="p">,</span> <span class="kt">Closure</span> <span class="nv">$next</span><span class="p">)</span> <span class="p">{</span>
<span class="nc">Log</span><span class="o">::</span><span class="nf">info</span><span class="p">(</span><span class="s1">'Request: '</span> <span class="mf">.</span> <span class="nv">$request</span><span class="o">-></span><span class="nf">path</span><span class="p">());</span>
<span class="k">return</span> <span class="nv">$next</span><span class="p">(</span><span class="nv">$request</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">}</span>
</code></pre>
</div>
<p>Temel mantığı değiştirmeden işlevselliğin katmanlarını ekleyin.</p>
<h2>
<a name="singleton-pattern" href="#singleton-pattern"></a>
7️⃣ Singleton Deseni
</h2>
<p>Tek bir örnek ile her şeyi yönetin.<br/></p>
<div class="highlight js-code-highlight">
<pre class="highlight php"><code><span class="c1">// ServiceProvider'da</span>
<span class="nv">$this</span><span class="o">-></span><span class="n">app</span><span class="o">-></span><span class="nf">singleton</span><span class="p">(</span><span class="nc">ConfigManager</span><span class="o">::</span><span class="n">class</span><span class="p">);</span>
</code></pre>
</div>
<p>Gerçek kullanım: Veritabanı bağlantıları, önbellek yöneticileri.</p>
<h2>
<a name="adapter-pattern" href="#adapter-pattern"></a>
8️⃣ Adaptör Deseni
</h2>
<p>Uyumsuz arayüzlerin çalışmasını sağlamak.<br/></p>
<div class="highlight js-code-highlight">
<pre class="highlight php"><code><span class="kd">interface</span> <span class="nc">PaymentGateway</span> <span class="p">{</span>
<span class="k">public</span> <span class="k">function</span> <span class="n">charge</span><span class="p">(</span><span class="nv">$amount</span><span class="p">);</span>
<span class="p">}</span>
<span class="kd">class</span> <span class="nc">StripeAdapter</span> <span class="kd">implements</span> <span class="nc">PaymentGateway</span> <span class="p">{</span>
<span class="k">public</span> <span class="k">function</span> <span class="n">charge</span><span class="p">(</span><span class="nv">$amount</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="nv">$this</span><span class="o">-></span><span class="n">stripe</span><span class="o">-></span><span class="n">charges</span><span class="o">-></span><span class="nf">create</span><span class="p">([</span><span class="s1">'amount'</span> <span class="o">=></span> <span class="nv">$amount</span><span class="p">]);</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="kd">class</span> <span class="nc">PayPalAdapter</span> <span class="kd">implements</span> <span class="nc">PaymentGateway</span> <span class="p">{</span>
<span class="k">public</span> <span class="k">function</span> <span class="n">charge</span><span class="p">(</span><span class="nv">$amount</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="nv">$this</span><span{".}Kaynak: Orijinal Makale


