Problem
Problem
Her Laravel geliştirici bu durumu bilir. Ekibin bir üyesi, önbelleği temizlemeye, migrations çalıştırmaya veya seeder tetiklemeye ihtiyaç duyar ama SSH erişimi yoktur. Bu durumda, Slack’te size mesaj atarlar. Siz SSH ile bağlanır, komutu çalıştırır, çıktıyı doğrular ve yaptığınız işi yapmaya devam edersiniz.
Bunun birçok takım üyesi ve birkaç ortam için tekrarı, gerçek bir verimlilik açığına dönüşebilir.
Bu sorunu çözmek için Laravel Artisan Runner adında bir paket geliştirdim. Bu paket, onaylanmış Artisan komutlarını temiz, Livewire destekli bir web arayüzü aracılığıyla açığa çıkarmanızı sağlar; tam denetim günlüğü, kuyruklu yürütme ve bildirimler ile birlikte.
Ne Yapar?
Ne Yapar?
Artisan Runner, esasen size üç şey sunar:
- Artisan komutlarını tarayıcıdan gezip, yapılandırmanızı ve çalıştırmanızı sağlayan bir web arayüzü
- Onaylı bir komut havuzu böylece yalnızca onaylanmış komutlar çalıştırılabilir
- Tam bir denetim günlüğü her yürütme için — kim, ne zaman, hangi parametrelerle ne yaptı
Her komut bir kuyruk işi üzerinden çalışır. Engelleyici HTTP istekleri yok. Uzun süren migrations üzerinde zaman aşımı yok.
Kurulum
Kurulum
composer require cleaniquecoders/laravel-artisan-runner
php artisan artisan-runner:install
php artisan migrate
Hepsi bu. Üç komut ve hazırsınız.
İnşa komutu, ayarları, migrations’ları, görünümleri ve varlıkları bir kerede yayınlar. Daha sonra bileşeni herhangi bir Blade görünümüne ekleyebilirsiniz:
<artisan-runner::command-runner/>Varsayılan rota /artisan-runner olup, web ve auth middleware’leri tarafından korunmaktadır.
Yapılandırma: Üç Keşif Modu
Yapılandırma: Üç Keşif Modu
Paket, hangi komutların mevcut olduğunu belirlemenin üç yolunu destekler.
Manuel (Varsayılan — En Güvenli)
Manuel (Varsayılan — En Güvenli)
Sadece açıkça listelediğiniz komutlar allowed_commands içinde mevcut olacaktır:
// config/artisan-runner.php
'discovery_mode' => ,
=> [
=> [
=> ,
=> ,
=> ,
=> [],
],
=> [
=> ,
=> ,
=> ,
=> [
[=> , => , => , => false],
[=> , => , => , => false],
],
],
Otomatik Keşif
Otomatik Keşif
Bütün Artisan komutlarını yüzeysel bir şekilde sunar, hariç tutma listesinin dışında:
=> ,
=> [, , , , ],
=> [, , , ],
Geliştirme için iyi. Ancak sıkı bir hariç tutma listesi olmadan üretimde önerilmez.
Seçim
Seçim
Ara bir yol — yalnızca açıkça dahil edilen komutlar keşfedilir, sonra manuel girişlerinizle birleştirilir:
=> ,
=> [, , , ],
Ayrıca komut listenizi oluşturmanıza yardımcı olacak bir CLI aracı da vardır:
php artisan artisan-runner:discover
php artisan artisan-runner:discover =json
php artisan artisan-runner:discover
Altında Ne Oluyor?
Mimari, temiz bir aksiyon tabanlı deseni takip eder:
Kullanıcı "Çalıştır" butonuna tıklar
→ Livewire CommandRunner bileşeni
→ RunCommandAction (onay listesi ile doğrular)
→ RunArtisanCommandJob kuyruğa gönderilir
→ Job artisan::call() yapar
→ Çıktı + çıkış kodu CommandLog'a kaydedilir
→ Bildirim gönderilir (aktifse)
Denetim Kaydı
Her yürütme bir CommandLog kaydı oluşturur:
CommandLog::create([
=> Str::uuid(),
=> ,
=> [=> true],
=> , // beklemede → çalışıyor → tamamlandı/başarısız
=> ,
=> ,
]);
Durum döngüsü basittir:
beklemede → çalışıyor → tamamlandı
→ başarısız
Her kayıt başlangıç zamanı, bitiş zamanı, tam çıktı ve çıkış kodunu takip eder. Livewire bileşeni her 5 saniyede bir güncelleme alır, böylece durum güncellemelerini gerçek zamanlı olarak görebilirsiniz.
Günlüklerinizi programatik olarak sorgulamak için:
use CleaniqueCoders\ArtisanRunner\Models\CommandLog;
use CleaniqueCoders\ArtisanRunner\Enums\CommandStatus;
// Son başarısızlar
CommandLog::where(, CommandStatus::Failed)->recent(7)->get();
// Kimler komut çalıştırdı
CommandLog::with()->latest()->take(20)->get();
Akıllı Parametre Gösterimi
UI, parametre tanımlarına dayalı olarak doğru girdi türünü otomatik olarak oluşturur:
- Argumentler (sıralı) → metin girdi
- Boolean bayrakları (
--force, --seed) → onay kutuları - Sayısal seçenekler (
--step=5) → sayı girdisi - String seçenekleri → metin girdi
Erken yaşadığım bir sorun: Livewire, -- önekli wire:model bağlamaları ile iyi çalışmıyor (örneğin, parameterValues.--force). Çözüm, dahili olarak indeks bazlı anahtarlar kullanarak bunları eşleştirmekti. Küçük bir ayrıntı ama bunu inşa eden herhangi birini zor durumda bırakırdı.
Bildirimler
Bir komut tamamlandığında veya başarısız olduğunda, paket, herhangi bir Laravel bildirim kanalı aracılığıyla yapılandırılabilir bir kullanıcıyı bilgilendirebilir:
=> [
=> true,
=> [, ],
=> [
=> \App\Models\User::,
=> ,
=> (, ),
],
],
Bildirim, komut adını, durumunu, çıkış kodunu ve yürütme süresini içerir. Slack, Discord veya ekibinizin kullandığı herhangi bir şeyle entegre edebilirsiniz.
Güvenlik: Varsayılan Olarak Paranoid
Bu, bir web arayüzünden kabuk komutları çalıştıran bir paket. Güvenlik isteğe bağlı değildir.
Öncelikli liste. Varsayılan mod manual‘dir. Onaylanmadıkça hiçbir şey çalışmaz.
Kimlik doğrulama korumalı rotalar. Varsayılan middleware ['web', 'auth']‘dir. Daha da sıkılaştırabilirsiniz:
=> [
=> [, , ],
],
Tehlikeli komutlar önceden hariç tutulur. Otomatik keşif modunda bile, down, db:wipe, migrate:fresh, tinker, ve serve gibi komutlar varsayılan olarak dışarıda bırakılır.
Tam denetim kaydı. Her yürütme, kim tarafından tetiklendiği ile kaydedilir (polimorfik ilişki – her model ile çalışır, yalnızca User ile değil).
Retry yok. Başarısız işler başarısız kalır. Siz araştırırsınız, üretimde migrate --force otomatik olarak denemez.
Zaman aşımı koruması. Komutlar 300 saniye sonra durdurulur. Koşmayan süreçler yok.
Livewire 3 + 4 Uyumluluğu
Paket, hem Livewire 3 hem de 4’ü destekler. Servis sağlayıcısı kaydı otomatik olarak işler:
if ((Livewire::class, )) {
// Livewire 4
Livewire::(, __DIR__ . );
} else {
// Livewire 3
Livewire::(, CommandRunner::);
}
Özellik bayrakları yok. Hiçbir yapılandırma anahtarı yok. Sadece çalışıyor.
Ne Zaman Kullanmalısınız?
Fikir:
- Teknik olmayan ekibin bakım görevlerini tetiklemek için ihtiyaç duyduğu admin panelleri
- Dağıtım hatlarında “dağıtım sonrası görevleri çalıştır” butonuna ihtiyaç duyduğunuz yerler
- Her kiracı için önbellek temizleme veya migrations gerektiren çok kiracılı uygulamalar
- Herkesin SSH erişimi olmayan ancak herkesin önbelleği temizlemesi gereken takımlar
İdeal değil:
- İnteraktif komutlar (
tinker, make:model) - 5 dakikayı aşan uzun süreli toplu işler
- Gerçek zamanlı akış çıktısına ihtiyaç duyan her şey (çıkışı tamamlandıktan sonra alır)
Yığın Uyumluluğu
Desteklenen PHP 8.3+ Laravel 11, 12, 13 Livewire 3, 4 Tailwind 4 (CDN aracılığıyla)
Deneyin
composer require cleaniquecoders/laravel-artisan-runner
php artisan artisan-runner:install
php artisan migrate
php artisan queue:work
Daha sonra tarayıcınızda /artisan-runner adresine gidin.
Kaynak kodu: github.com/cleaniquecoders/laravel-artisan-runner
Ben Nasrul Hazim, Malezya’dan bir yazılım mühendisiyim ve Laravel paketleri ve araçları geliştiriyorum. Daha fazla çalışmama nasrulhazim.com‘dan ulaşabilirsiniz.
Kaynak: Orijinal Makale


