<p><code>createLaraFoundry</code>, i18n’i kurar (arka uçtan gönderilen aynı Inertia paylaşılmış prop’ları ile), paylaşılan bileşenleri kaydeder. Ziggy ve Inertia eklentileri ana bilgisayarda kalır. CSS teması, ana bilgisayarın doğrudan <code>vendor/</code>'dan içe aktardığı bir <code>@theme</code> bloğudur:<br/></p>

<div class="highlight js-code-highlight">
    <pre class="highlight css"><code><span class="k">@import</span> <span class="s2">'tailwindcss'</span><span class="p">;</span>

@import ‘../../vendor/dmitryisaenko/larafoundry/resources/css/theme.css’;

<p>Bu, sıkıcı bir çözümdür ve tam da bu yüzden çalışır. Paket, bir uygulama olmaktan çıkıp, uygulamanın kullandığı bir kütüphane haline geldi. Risk kapatıldı.</p>

<p>i18n köprüsü, miras alınan ergonomiyi yansıtarak ana kodun değişiklik yapmadan taşınmasını sağlar - herhangi bir şablonda <code>{{ $t('key') }}</code> ile, herhangi bir içe aktarma gereği olmadan - fakat paket içerisinde, global bir çözüm yerine proper bir <code>useT()</code> kompozit vardır.</p>

<h2>
    <a name="the-review-gate-and-a-bug-it-caught" href="#the-review-gate-and-a-bug-it-caught"></a>
    Gözden geçirme kapısı ve yakaladığı bir hata
</h2>

<p><code>v0.1.0</code> sürümünü etiketlemeden önce, kodu <code>/security-review</code> ve <code>/code-review</code> sürelerini geçirdim, ayrıca anahtar kararları Laravel 13 dökümantasyonu ile karşılaştırdım. Güvenlik temiz geçti. Kod incelemesi ise bir hatayı ortaya çıkardı: flash-message toast bileşeninde.</p>

<p>Hata: otomatik olarak kapanan tostlar, mesajın <em>slot</em>’una göre ( <code>disappear-info</code> ) zamanlayıcıyı anahtarlandırıyordu, mesajın kendisi yerine. Yani eğer önceki mesajın zamanlayıcısı hala bekliyorsa ve yeni "kaybolma" mesajı gelirse, eski zamanlayıcı ateşlenir ve <em>yeni</em> mesaj erken kapanır. Klasik bir kimlik hatası.</p>

<p>Önce:<br/></p>

<div class="highlight js-code-highlight">
    <pre class="highlight javascript"><code><span class="c1">// slot'a göre zamanlayıcı - bir ikame mesaj, eski zamanlayıcıyı miras alır</span>

if (isDisappearType(m.type) && !timeouts[m.key]) {
timeouts[m.key] = setTimeout(() => closeMessage(m.key), AUTO_DISMISS_MS);
}

<p>Sonra - zamanlayıcı, mesajın içeriğine göre türetilmiş kimliğe bağlı hale geliyor ve bayat zamanlayıcılar, mesaj listesi değiştiğinde temizleniyor:<br/></p>

<div class="highlight js-code-highlight">
    <pre class="highlight javascript"><code><span class="p">.</span><span class="nf">map</span><span class="p">((</span><span class="nx">m</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">({</span> <span class="p">...</span><span class="nx">m</span><span class="p">,</span> <span class="na">id</span><span class="p">:</span> <span class="s2">`</span><span class="p>${</span><span class="nx">m</span><span class="p">.</span><span class="nx">slot</span><span class="p">}</span><span class="s2">:</span><span class="p>${</span><span class="nx">m</span><span class="p">.</span><span class="nx">content</span><span class="p">}</span><span class="s2">`</span> <span class="p">}));</span>

// aynı slot’taki yeni bir mesaj, öncekinin zamanlayıcısını miras alamaz
if (isDisappearType(m.type) && !timeouts[m.id]) {
timeouts[m.id] = setTimeout(() => closeMessage(m), AUTO_DISMISS_MS);
}

<p>Bir güvenlik sorunu değil. Sadece "bir zamanlama bildirimleri çok hızlı kayboluyor" raporu üreten türden bir durumdur ki bu durumu talep üzerine asla tekrar üretemezsiniz. Bunu sorunu çözmeden etiketlemeleri daha iyi, altı ay içinde peşinden koşmaktan daha iyidir.</p>

<h2>
    <a name="testing" href="#testing"></a>
    Test
</h2>

<p>Bu sürümde 39 Pest testi var. Bunlar dekorasyon değil - bunlardan ikisi yukarıdaki hataların <em>eski</em> hatalar olmasının nedenidir:<br/></p>

<div class="highlight js-code-highlight">
    <pre class="highlight php"><code><span class="nf">it</span><span class="p">(</span><span class="s1">'istek anahtarı aracılığıyla temel Filter'dan miras alınan yöntemler asla çağrılmaz'</span><span class="p">,</span> <span class="k">function</span> <span class="p">()</span> <span class="p">{</span>
        <span class="c1">// kitle-yöntem-çağırma koruyucusu</span>
    <span class="p">});</span>

    <span class="nf">it</span><span class="p">(</span><span class="s1">'yapılandırılmış varsayılan geçersiz olduğunda güvenli bir yere geri döner'</span><span class="p">,</span> <span class="k">function</span> <span class="p">()</span> <span class="p">{</span>
        <span class="c1">// yanlış yapılandırılmış varsayılan, izin listesini atlamamalıdır</span>
    <span class="p">});</span>

    <span class="nf">it</span><span class="p">(</span><span class="s1">'toplam/son_sayfa olmadan basit bir sayfa ayarlayıcıyı normalleştirir'</span><span class="p">,</span> <span class="k">function</span> <span class="p">()</span> <span class="p">{</span>
        <span class="c1">// lastPage()/total() eksik olan sayfalayıcılar hata vermemelidir</span>
    <span class="p">});</span>

<p>Locale ve filtre takımları, önemli olan durumları kapsar: her çözüm kaynağı doğrulanır, desteklenmeyen kodlar reddedilir, temel sınıf yöntemleri giriştin erişilemez, boş filtre değerleri atlanır, <code>SimplePaginator</code>'daki pagination yüklerinin patlamadığı kontrol edilir.</p>

<p>CI, tüm itişlerde PHP 8.2 / 8.3 / 8.4 boyunca Pest ile Pint'i çalıştırır. Eski repo test iş akışını devre dışı bıraktı - <code>*.yml_old</code> adlı dosya. Bunu geri almak, yeşil durumu görmek kendine has bir tatmin.</p>

<h2>
    <a name="what-id-tell-myself-before-starting" href="#what-id-tell-myself-before-starting"></a>
    Başlarken kendime söyleyeceklerim
</h2>

<ul>
    <li>
        <strong>Çıkarma, bir gözden geçirme olarak gizlenmiş bir yeniden yapılandırmadır.</strong> Değer, kodu taşımaktan değil; taşırken her bir satırı, taze ve biraz daha paranoyak gözlerle yeniden okumaktan gelir. Bulacağınız hatalar için bütçe ayırın.
    </li>
    <li>
        <strong>Bir kütüphane, bir uygulama değildir.</strong> Ön yüz riski, paket sayfa çözümlemesini sahiplenmeyi bıraktığında ortamdan kayboldu ve sadece modüller sundu.
    </li>
    <li>
        <strong>Sınırda doğrulama yapın, her kaynağa.</strong> Locale izin listesi tek bir kontrol değil - bu aynı kontrolün kullanıcı tercihi, oturum, çerez, başlık, coğrafya ve varsayılan üzerinde uygulanmasıdır. Bunlardan biri unuttuğunuzdur.
    </li>
    <li>
        <strong>Testler, derin bir riskin düzeltme hatasına dönüşmesinin yoludur.</strong> Kitle-yöntem-çağırma açığı üretimde zararsızdı, tam da o anda değildi. Pest testi, durumunun "belki iyidir"den "kesinlikle kapandı"ya dönüşmesini sağladı.
    </li>
</ul>

<h2>
    <a name="honest-scope" href="#honest-scope"></a>
    Dürüst kapsam
</h2>

<p><code>v0.1.0</code>'ın ne olduğunu ve ne olmadığını netleştirelim: bu temel katman. Kimlik doğrulama, kullanıcılar, çoklu kiracılık, yönetici, faturalama – tüm bu, ilerideki aşamalardır, henüz gönderilmedi. Paket açıklaması tüm iddialı hedefleri belirtiyor; etiket, primitive sunuyor. Bir etiketi fazla abartmaktansa, <code>composer require</code> işlemini sizinle gönderdiğiniz bir şeyle eşleştirmek daha iyidir.</p>

<p>Bir Laravel + Inertia + Vue SaaS geliştiriyorsanız ve kesişen parçaları düz bir şekilde paketlemenin ne anlama geldiğini merak ettiyseniz, bu, insanların önünde açık bir şekilde inşaa edilen, gerçek bir şeyden çıkarılan başlangıçtır.</p>

<hr/>

<p><strong>LaraFoundry</strong>, kamuya açık olarak inşa edilmiş ve üretim CRM/ERP'den çıkarılmış bir açık kaynak Laravel SaaS çekirdeğidir.</p>

Kaynak: Orijinal Makale

Bu Makaleyi Paylaş