Geliştiriciler sürekli olarak benzer sorunlarla karşılaşmaktadır. Özellikler yerel makinenizde düzgün çalışır, ancak kodu gönderdikten sonra üretim aşamasında Call to undefined method hatasına neden olan sorunlar ortaya çıkabilir. Bu tür durumlarla karşılaşmamak için daha iyi test ve önleme yöntemleri kullanmalısınız.
<p>Şu an muhtemelen <strong>Laravel Pint</strong> kullanıyorsunuz. Ancak, Pint sadece kodunuzun nasıl göründüğünü kontrol eder, kodunuzun nasıl çalıştığına bakmaz. Bu durum, uygulamanızda büyük sorunlar yaratabilir.</p>
<p>Gerçekten istikrarlı bir uygulama geliştirmek için, özellikle API istikrarı için çok katmanlı bir savunma modeli oluşturmalısınız. Bu, statik analiz, mimari zorunluluklar, güvenlik taramaları ve sıkı AI yönergelerini içerir.</p>
<p>İşte hataları <em>önceden</em> yakalayacak modern bir kalite hattı kurma yöntemleri:</p>
<hr/>
<h2>
<a name="1-static-analysis-logic-checks-without-execution" href="#1-static-analysis-logic-checks-without-execution">
</a>
1. Statik Analiz: Çalıştırmadan Mantık Kontrolleri
</h2>
<p><strong>Problem:</strong> Tür hatalarını bulmak için manuel teste güveniyorsunuz.<br/><strong>Çözüm:</strong> Uygulamanızı gerçekten çalıştırmadan kod akışını anlamaya çalışan araçlar kullanmalısınız.</p>
<h3>
<a name="larastan-phpstan-for-laravel" href="#larastan-phpstan-for-laravel">
</a>
Larastan (PHPStan for Laravel)
</h3>
<p>Larastan ekleyebileceğiniz en etkili araçtır. Laravel’in "büyüsünü" anlamakta ve tür hatalarını, tanımsız değişkenleri, ve yanlış yöntem imzalarını bulmakta oldukça başarılıdır.</p>
<p><strong>Uygulama:</strong><br/></p>
<div class="highlight js-code-highlight">
<pre class="highlight shell"><code>composer require <span class="nt">--dev</span> larastan/larastan <svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px" viewbox="0 0 24 24" class="highlight-action crayons-icon highlight-action--fullscreen-off"><title>Exit fullscreen mode</title>
<path d="M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z"/>
</svg>
</div>
</div>
</div>
<p>Kök dizininizde bir <code>phpstan.neon</code> dosyası oluşturun. Başlangıç olarak <strong>Seviye 5</strong> ayarını kullanın; bu seviye, eski kod tabanları için yeterince affedici ama faydalı bir katılığa sahiptir.<br/></p>
<div class="highlight js-code-highlight">
<pre class="highlight yaml"><code><span class="na">includes</span><span class="pi">:</span>
<span class="pi">-</span> <span class="s">vendor/larastan/larastan/extension.neon</span>parameters:
paths:
– app/
level: 5
<svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px" viewbox="0 0 24 24" class="highlight-action crayons-icon highlight-action--fullscreen-off"><title>Exit fullscreen mode</title>
<path d="M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z"/>
</svg>
</div>
</div>
</div>
<blockquote>
<p><strong>İpucu:</strong> 500 hatayı birden düzeltmeye çalışmayın. Bir "temel" dosya kullanın. Bu, Larastan'a mevcut hataları göz ardı etmesini ama bugünden itibaren yaratılan her yeni hatayı rapor etmesini söyler.</p>
</blockquote>
<h3>
<a name="rector" href="#rector">
</a>
Rector
</h3>
<p>Larastan hataları bulurken, Rector kötü alışkanlıkları düzeltir. Kodunuzu derhal daha yeni PHP sürümlerine ve Laravel en iyi uygulamalarına yükseltir.</p>
<p><strong>Uygulama:</strong><br/></p>
<div class="highlight js-code-highlight">
<pre class="highlight shell"><code>composer require <span class="nt">--dev</span> rector/rector <svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px" viewbox="0 0 24 24" class="highlight-action crayons-icon highlight-action--fullscreen-off"><title>Exit fullscreen mode</title>
<path d="M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z"/>
</svg>
</div>
</div>
</div>
<p><code>npx rector init</code> komutunu çalıştırın. Eski dizi sözdizimini <code>array()</code> ile <code>[]</code> haline dönüştürebilir veya manuel mülk atamalarını PHP 8.2’deki <code>readonly</code> sınıflarıyla değiştirebilir.</p>
<hr/>
<h2>
<a name="2-enforce-architecture-with-tests" href="#2-enforce-architecture-with-tests">
</a>
2. Mimariyi Testlerle Zorlayın
</h2>
<p><strong>Problem:</strong> Spagetti kod yapısı. Yeni bir geliştirici, karmaşık vergi hesaplama mantığını bir Kontrolcü içinde yazıyor.<br/><strong>Çözüm:</strong> <strong>Pest Mimari Testleri</strong>.</p>
<p>Eğer projeniz bir Service-Repository desenini takip ediyorsa, insanların bunu takip etmesini ummak yerine bunu zorlamalısınız. Pest, dosya yapınızı test etmenize olanak tanır.</p>
<p><strong>Uygulama:</strong></p>
<p>Önce Pest kullandığınızdan emin olun ve ardından <code>tests/ArchTest.php</code> dosyanızı oluşturun:<br/></p>
<div class="highlight js-code-highlight">
<pre class="highlight php"><code><span class="cp"><?php </span?>test(‘kontrolcüler doğrudan modellere erişmemeli’)
->expect(‘App\Http\Controllers’)
->not->toUse(<span class=”s1>’App\Models’) // Servisler/Repository’ler kullanılsın
->ignoring(<span class=”s1>’App\Http\Controllers\Auth’);
test(<span class=”s1>’kontrolcüler inline validasyon kullanmamalı’)
->expect(<span class=”s1>’App\Http\Controllers’)
->not->toUse(<span class=”s1>’Illuminate\Support\Facades\Validator’);
test(<span class=”s1>’global değişkenler kesinlikle yasak’)
->expect([<span class=”s1>’dd’, <span class=”s1>’dump’, <span class=”s1>’env’])
->not->toBeUsed();
<svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px" viewbox="0 0 24 24" class="highlight-action crayons-icon highlight-action--fullscreen-off"><title>Exit fullscreen mode</title>
<path d="M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z"/>
</svg>
</div>
</div>
</div>
<blockquote>
<p><strong>Bunun önemi:</strong> Bu, "mimari kayma" sorunlarını önler. Eğer biri Repository desenini atlamaya çalışırsa, derleme hemen başarısız olur.</p>
</blockquote>
<hr/>
<h2>
<a name="3-git-hooks-the-first-line-of-defense" href="#3-git-hooks-the-first-line-of-defense">
</a>
3. Git Hooks: İlk Savunma Hattı
</h2>
<p><strong>Problem:</strong> CI/CD 10 dakika sürüyor. Eğer bir noktalı virgülü unuttuysanız, derlemenin başarısız olması için 10 dakikanızı boşa harcıyorsunuz.<br/><strong>Çözüm:</strong> <strong>Husky + Lint Staged</strong>.</p>
<p>Değiştirdiğiniz dosyalar üzerinde kontrol çalıştırmak istiyoruz, değil mi? Tam commitlemeden önce.</p>
<p><strong>Uygulama:</strong></p>
<ol>
<li>
<p><strong>Husky ve Lint Staged'i kurun:</strong><br/></p>
<pre class="highlight shell"><code>npm <span class="nb">install </span>husky lint-staged <span class="nt">--save-dev</span>npx husky init
<li>
<p><strong><code>package.json</code> dosyasını yapılandırın:</strong></p>
<p>Sistemin, PHP dosyaları için Pint ve Larastan’ı çalıştırmasını sağlayan bir yapılandırma ekleyin.<br/></p>
<pre class="highlight json"><code><span class="nl">"lint-staged"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="nl">" /*.php"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
</span><span class="s2">"./vendor/bin/pint"</span><span class="p">,</span><span class="w">
</span><span class="s2">"./vendor/bin/phpstan analyse --memory-limit=2G"</span><span class="w">
</span><span class="p">]</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre>
</li>
<li>
<p><strong>Pre-commit hatasını güncelleyin:</strong></p>
<p><code>.husky/pre-commit</code> dosyasına ekleyin:<br/></p>
<pre class="highlight shell"><code>npx lint-staged<p>Artık düzensiz kodla commit yapmaya çalıştığınızda commit işlemi engelleniyor. Hatalarınızı düzeltiyor ve tekrar deniyorsunuz.</p>
<hr/>
<h2>
<a name="4-security-amp-maintenance" href="#4-security-amp-maintenance">
</a>
4. Güvenlik & Bakım
</h2>
<p><strong>Problem:</strong> Kodunuz temiz, fakat bilinen bir güvenlik açığı olan bir kütüphane kullanıyorsunuz ya da sunucu ayarınız güvensiz.<br/><strong>Çözüm:</strong> <strong>Enlightn & Composer Audit</strong>.</p>
<h3>
<a name="enlightn" href="#enlightn">
</a>
Enlightn
</h3>
<p>Enlightn, bir kutudaki danışman gibidir. Performans, güvenlik ve güvenilirlik dahil 120’den fazla öğeyi kontrol eder. Örneğin, <code>env()</code> fonksiyonunu konfigürasyon dosyası dışında kullanıp kullanmadığınızı kontrol eder.<br/></p>
<div class="highlight js-code-highlight">
<pre class="highlight shell"><code>composer require <span class="nt">--dev</span> enlightn/enlightnphp artisan enlightn
<svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px" viewbox="0 0 24 24" class="highlight-action crayons-icon highlight-action--fullscreen-off"><title>Exit fullscreen mode</title>
<path d="M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z"/>
</svg>
</div>
</div>
</div>
<h3>
<a name="composer-audit" href="#composer-audit">
</a>
Composer Audit
</h3>
<p>Composer'da yerleşiktir. <code>composer.lock</code> dosyanızı bilinen güvenlik açıkları veritabanıyla karşılaştırır.</p>
<p><strong>Bunu CI hattınıza ekleyin:</strong><br/></p>
<div class="highlight js-code-highlight">
<pre class="highlight yaml"><code><span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Güvenlik açıklarını kontrol et</span>run: composer audit
<svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px" viewbox="0 0 24 24" class="highlight-action crayons-icon highlight-action--fullscreen-off"><title>Exit fullscreen mode</title>
<path d="M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z"/>
</svg>
</div>
</div>
</div>
<hr/>
<h2>
<a name="5-the-brain-strict-ai-instructions" href="#5-the-brain-strict-ai-instructions">
</a>
5. Zihin: Sıkı AI Yönergeleri
</h2>
<p><strong>Problem:</strong> AI asistanları genellikle "Junior" seviyesinde kodlar yazar ve inline validasyon veya doğrudan model sorguları gibi anti-patternler kullanır.<br/><strong>Çözüm:</strong> Özel Yönergeler.</p>
<p>Bunu çözmek için, depo dizininizde bir <code>.github/copilot-instructions.md</code> dosyası oluşturun. Bu, AI'nın bir <strong>Senior Architect</strong> kimliğine bürünmesini ve sıkı kurallara uymasını sağlar.</p>
<p><strong>Aşağıdaki kuralları dosyaya kesin olarak kopyalayın:</strong></p>
<p>Sen bir Senior Laravel Mimarısın. Temiz mimari, SOLID prensipleri ve sürdürülebilirlik önceliğin. Servis-Repository desenine ve "Yağlı Model, İnce Kontrolcü" felsefesine sıkı sıkıya bağlısın.<br/></p>
<div class="highlight js-code-highlight">
<pre class="highlight markdown"><code><span class="gu">## 🚫 SIKILIĞA YASAKLAMALAR (Anti-Patternler)</span>### 1. Inline Class Paths (FQCN) Kullanmayın
ASLA kod bloklarında Tam Nitelikli Sınıf İsimleri kullanmayın. Her zaman dosyanın en üstünde sınıfları use ile içe aktarın.
❌ Kötü: public function index(\Illuminate\Http\Request $request)
✅ İyi:
php
use Illuminate\Http\Request;
// …
public function index(Request $request)
### 2. Kontrolcülerde Doğrudan Model Sorguları Olmasın
ASLA bir Kontrolcü içinde doğrudan Eloquent sorguları yazmayın.
❌ Kötü: $users = User::where('active', 1)->get();
✅ İyi: $users = $this->userService->getActiveUsers(); veya $users = $this->userRepository->getAllActive();
### 3. Inline Validasyon Olmasın
ASLA $request->validate([...]) fonksiyonunu bir Kontrolcü yönteminde kullanmayın.
❌ Kötü: $request->validate(['email' => 'required']);
✅ İyi: Bir Form İsteği oluşturun ve tip belirtin: public function store(StoreUserRequest $request)
### 4. Ham JSON Yanıtları Olmasın
ASLA ham Modelleri, Dizileri veya response()->json() kodu ile API verilerini döndürmeyin.
❌ Kötü: return response()->json($user);
✅ İyi: Her zaman API Kaynaklarını kullanın: return new UserResource($user);
### 5. Özel Kontrolcü Yöntemleri Olmasın (İş Mantığı)
KAÇININ Kontrolcüler içinde iş mantığını işlemek için özel yardımcı yöntemler oluşturmaktan. Eğer bir Kontrolcü yöntemi çok karmaşık hale geliyorsa, mantık bir Servis, Eylem veya İş içinde olmalıdır.
❌ Kötü: private function calculateTax($order) { ... } Kontrolcü içinde.
✅ İyi: $this->taxCalculator->calculate($order); (Mantık özel bir sınıfa taşındı).
### 6. Blade/Görüntüde Mantık Olmasın
ASLA Blade dosyalarında sorguları veya karmaşık PHP mantığını yerleştirmeyin.
❌ Kötü: @foreach(User::all() as $user)
✅ İyi: Verileri Kontrolcüden veya ViewComposer ile geçirin.
## 🏗️ MİMARİ & KOD STANDARTLARI
### Servis-Repository Deseni
Kontrolcüler sadece şunları idare etmelidir:
1. İsteği almak (FormRequest aracılığıyla).
2. Bir Servis/Repository’e devretmek.
3. Bir Kaynak/Cevap döndürmek.
Tüm iş mantığı Servisler içinde bulunur.
* Tüm veritabanı mantığı Repositoryler (ya da hafifse Scopes) içinde yer alır.
### Tür Güvenliği & Modern PHP
Her zaman her dosyanın üstünde katı türleri kullanın: declare(strict_types=1);.
Her zaman yöntemlere dönüş türleri ekleyin: public function index(): AnonymousResourceCollection.
* Her zaman argümanları tip belirtin.
### Kod Kalitesi Kontrol Listesi
Önerilen kodu önerirken kontrol edin:
1. [ ] Tüm sınıflar use ile ithal edilmiş mi? (Inline FQCN yok)
2. [ ] Bu bir Serviste mi yer alıyor?
3. [ ] Validasyon bir FormRequest’te mi işleniyor?
4. [ ] Cevap bir Kaynak içinde mi kaplanmış?
5. [ ] Büyülü dizeler/sayılar Sabitler veya Enum’larla mı değiştirildi?
<svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px" viewbox="0 0 24 24" class="highlight-action crayons-icon highlight-action--fullscreen-off"><title>Exit fullscreen mode</title>
<path d="M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z"/>
</svg>
</div>
</div>
</div>
<hr/>
<h2>
<a name="conclusion" href="#conclusion">
</a>
Sonuç
</h2>
<p>Bu işlemleri uygulayarak, kodun iyi olduğunu <strong>umut etmekten</strong> <strong>garanti etmeye</strong> geçmiş olursunuz.</p>
<ol>
<li> <strong>Copilot</strong> talimatlarınız sayesinde daha iyi kod yazar.</li>
<li> <strong>Pint</strong> stil sorunlarını düzeltir.</li>
<li> <strong>Larastan</strong> mantık hatalarını yakalar.</li>
<li> <strong>Husky</strong> kötü commit'leri engeller.</li>
<li> <strong>Pest</strong> mimariyi zorlar.</li>
</ol>
<p>Bu, teknik borçları artırmadan bir kod tabanını ölçeklendirmenin yoludur.</p>
<h2>
<a name="enjoy" href="#enjoy">
</a>
Keyfini çıkarın!
</h2>Kaynak: Orijinal Makale


