<p>Geliştirme sürecinde önemli bir ders aldım: “Yüzeydeki çok sayıda benzer yapı, mimari tasarımın gerekliliğini gösterir.” Uygulamanızın mimarisini doğru yapılandırmak, ileride yapacağınız değişiklikleri kolaylaştırır. Bu yazıda, Laravel'de kullanılan bazı önemli yapıları ve en iyi uygulamaları ele alacağım: <strong>Store contract</strong> ve <strong>Eloquent</strong> sürücüsü ile ilgili deneyimlerim.</p>
<h2>
<a name="thread-1-when-the-same-pattern-shows-up-50-times-its-an-architecture-not-a-coincidence" href="#thread-1-when-the-same-pattern-shows-up-50-times-its-an-architecture-not-a-coincidence">
</a>
Thread 1 — Aynı yapının 50 defa ortaya çıkması, mimari bir zorunluluk olduğunu gösterir
</h2>
<p>Geliştirdiğim gözlemleme platformu, hata ve ölçümleri çeşitli çalışma zamanlarından alıyor. Buradaki ilginç nokta, depolama ile ilgili endişelerin her birinin aynı şekilde çözümlenmiş olması: bir <strong>Store contract</strong> ve onun arkasında bir <strong>Eloquent driver</strong>. Her biri için ayrı bir seam oluşturuldu.</p>
<p>Yapı her zaman şöyle:<br/></p>
<div class="highlight js-code-highlight">
<pre class="highlight php"><code><span class="kd">interface</span> <span class="nc">MetricStore</span>{
public function record(MetricSample $sample): void;
<span class="cd">/ @return iterable<metricpoint> */</metricpoint></span>
<span class="k">public</span> <span class="k">function</span> <span class="n">series</span><span class="p">(</span><span class="kt">ProjectId</span> <span class="nv">$project</span><span class="p">,</span> <span class="kt">TimeRange</span> <span class="nv">$range</span><span class="p">):</span> <span class="kt">iterable</span><span class="p">;</span>}
<div class="highlight js-code-highlight">
<pre class="highlight php"><code><span class="k">final</span> <span class="kd">class</span> <span class="nc">EloquentMetricStore</span> <span class="kd">implements</span> <span class="nc">MetricStore</span>{
public function record(MetricSample $sample): void
{
Metric::create($sample->toAttributes());
}
<span class="k">public</span> <span class="k">function</span> <span class="n">series</span><span class="p">(</span><span class="kt">ProjectId</span> <span class="nv">$project</span><span class="p">,</span> <span class="kt">TimeRange</span> <span class="nv">$range</span><span class="p">):</span> <span class="kt">iterable</span>
<span class="p">{</span>
<span class="k">return</span> <span class="nc">Metric</span><span class="o">::</span><span class="nf">query</span><span class="p">()</span>
<span class="o">-></span><span class="nf">forProject</span><span class="p">(</span><span class="nv">$project</span><span class="p">)</span>
<span class="o">-></span><span class="nf">whereBetween</span><span class="p">(</span><span class="s1">'recorded_at'</span><span class="p">,</span> <span class="nv">$range</span><span class="o">-></span><span class="nf">toBounds</span><span class="p">())</span>
<span class="o">-></span><span class="nf">orderBy</span><span class="p">(</span><span class="s1>'recorded_at'</span><span class="p">)</span>
<span class="o">-></span><span class="nf">cursor</span><span class="p">();</span>
<span class="p">}</span>}


