UserService’iniz 800 satır ve 15 yöntem içeriyor. Bu bir sorun.
<p>Her büyüyen Laravel projesi bu aşamadan geçer. "Mantık kontrolör içinde olmaz" öğrenirsiniz, bir <code>UserService</code> oluşturursunuz ve geliştiğinizi hissedersiniz. Gerçekten de başlangıçta bir gelişme olur.</p>
<p>Fakat zaman geçtikçe <code>UserService</code> <code>create()</code>, <code>update()</code>, <code>deactivate()</code>, <code>sendWelcome()</code>, <code>exportCsv()</code>, <code>resetPassword()</code> gibi yöntemlerle dolup taşar. Bir gün dosyayı açtığınızda 800 satır, yapıcıda 15 bağımlılık olduğunu görürsünüz ve artık kimse bir şeyin nerede başladığını veya bittiğini anlayamaz.</p>
<p>Bir hizmet katmanı oluşturmadınız. Güzel bir adı olan bir <strong>God class</strong> oluşturdunuz.</p>
<h2>
<a name="sorun-her-seyi-yapan-service-iyi-yapmaz" href="#sorun-her-seyi-yapan-service-iyi-yapmaz"></a>
Sorun: Her şeyi yapan Service, hiçbir şeyi iyi yapmıyor
</h2>
<p>Klasik bir belirti, yapıcıdır:</p>
<div class="highlight js-code-highlight">
<pre class="highlight php"><code><span class="kd">class</span> <span class="nc">UserService</span>{
public function __construct(
private Mailer $mailer,
private CsvExporter $exporter,
private PaymentGateway $gateway,
private Geocoder $geocoder,
// …diğer 6 bağımlılık sadece bir yöntem için kullanılıyor
) {}
<span class="k">public</span> <span class="k">function</span> <span class="n">criar</span><span class="p">(</span><span class="kt">array</span> <span class="nv">$veriler</span><span class="p">)</span> <span class="p">{</span> <span class="cm">/* ... */</span> <span class="p">}</span>
<span class="k">public</span> <span class="k">function</span> <span class="n">exportarCsv</span><span class="p">()</span> <span class="p">{</span> <span class="cm">/* ... */</span> <span class="p">}</span>
<span class="k">public</span> <span class="k">function</span> <span class="n">resetarSenha</span><span class="p">(</span><span class="kt">User</span> <span class="nv">$kullanici</span><span class="p">)</span> <span class="p">{</span> <span class="cm">/* ... */</span> <span class="p">}</span>
<span class="c1">// + 12 yöntem birbirleriyle alakasız</span>}
<p>Dikkat edin: <code>resetarSenha()</code> kullanmak için Laravel, <code>CsvExporter</code> ve <code>PaymentGateway</code>'yi birlikte başlatmak zorunda, oysa bunların <strong>resetar senha</strong> ile hiçbir alakasının olmaması gerekir. Sorumluluklar hepsi tek bir düğümde bağlı.</p>
<p>Bu, "S" ile SOLID'in hafifçe ağladığı bir durum: bir sınıf, değişmek için bir sebep. Bu Service'in 15 sebebi var.</p>
<h2>
<a name="çözüm-action-classes-bir-sınıf-bir-eşya" href="#çözüm-action-classes-bir-sınıf-bir-eşya"></a>
Çözüm: Action Classes — bir sınıf, bir işlem
</h2>
<p>Fikir, o kadar basit ki komik: <strong>her işleme kendi sınıfı, bir tane de genel bir yöntemle (genellikle <code>handle()</code> veya <code>__invoke()</code>) sahip olmalı.</strong></p>
<div class="highlight js-code-highlight">
<pre class="highlight php"><code><span class="kd">class</span> <span class="nc">CreateUser</span>{
public function __construct(
private Mailer $mailer, // sadece bu işlem ihtiyacı var
) {}
<span class="k">public</span> <span class="k">function</span> <span class="n">handle</span><span class="p">(</span><span class="kt">array</span> <span class="nv">$veriler</span><span class="p">):</span> <span class="kt">User</span>
<span class="p">{</span>
<span class="nv">$user</span> <span class="o">=</span> <span class="nc">User</span><span class="o">::</span><span class="nf">create</span><span class="p">(</span><span class="nv">$veriler</span><span class="p">);</span>
<span class="nv">$this</span><span class="o">-></span><span class="n">mailer</span><span class="o">-></span><span class="nf">to</span><span class="p">(</span><span class="nv">$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">Welcome</span><span class="p">(</span><span class="nv">$user</span><span class="p">));</span>
<span class="k">return</span> <span class="nv">$user</span><span class="p">;</span>
<span class="p">}</span>}


