Uygulama İskeleti İleri
PHP Başlangıç Şablonu
Her yeni projenin altına konan hazır temel: kurulum sihirbazı, rol tabanlı panel, migration, kuyruk, olay sistemi, modüller, REST API ve PWA. Composer, framework ve CDN yok.
- PHP 8.1
- PDO
- MySQL
- Bootstrap 5
- JavaScript
- PWA
- REST API
- seviye
- "İleri"
- dosya
- 273
- satir
- ~42.756
- boyut
- "3.7 MB"
- veritabani
- "yeni_proje"
- lisans
- "MIT"
- inceleme
- 171
- begeni
- 13
- yayin
- ""
Ekran görüntüleri 3 görsel
Bu örnek ne yapıyor?
- Tarayıcıdan çalışan kurulum sihirbazı: .env üretir, tabloları ve migration'ları kurar, yönetici hesabı açar
- Kimlik ve yetki hazır: giriş/kayıt, beni hatırla, rol-yetki, kaba kuvvet koruması, sertleştirilmiş oturum
- Altyapı katmanları hazır: yönlendirme, hata yönetimi, günlük, migration, depolama, önbellek, olaylar, kuyruk, zamanlayıcı
- Açılıp kapanabilen modül sistemi: her modülün kendi rotaları, tabloları, görünümleri ve menüsü var
- REST API: standart yanıt zarfı, Bearer anahtarı, hız sınırı ve sayfalama
- PWA desteği ve panelden yönetilen künye; sayfa yönetimi, SEO alanları ve dinamik sitemap
- Çekirdek iş mantığını bilmez: olay yayınlar, modüller dinler — yirmi komutluk konsol (php cy) ile üreteçler
- Composer, framework ve CDN yok; paylaşımlı hostingte de komut satırı olmadan kurulur
Nerede işe yarar?
- Yeni bir müşteri projesine sıfırdan başlarken hazır bir temel olarak
- ERP, CRM, CMS, blog veya SaaS gibi farklı işlerin altına aynı altyapıyı koymak
- Framework kullanmadan katmanlı bir PHP mimarisi öğrenmek ya da öğretmek
- Paylaşımlı hostingte komut satırı olmadan kurulabilen bir yönetim paneli gerektiğinde
- Var olan bir projeye kuyruk, olay veya modül altyapısı eklerken referans almak
Gereksinimler
- PHP 8.1+ (pdo_mysql, mbstring, json; gd ve fileinfo önerilir) · MySQL 5.7+ veya MariaDB 10.3+ · Apache (mod_rewrite) ya da Nginx
Nasıl kurulur?
- Proje dosyalarını sunucunuza kopyalayın (örn. XAMPP'ta htdocs veya kendi web sunucunuzun kök dizini)
- Tarayıcıda kurulum adresini açın — komut satırı gerekmez
- Sihirbazı tamamlayın: sihirbaz .env dosyasını yazar, tabloları kurar ve migration'ları çalıştırır
- Yönetici hesabınızı oluşturun; şablonu ilk kez deniyorsanız örnek veri kutusunu işaretleyin
- Son adımdaki düğmeyle kurulum klasörünü silin
- mod_rewrite yoksa .env içinde APP_PRETTY_URLS değerini false yapın
Nasıl çalışıyor?
Bu şablon nedir?
Her yeni PHP projesinde baştan yazdığınız teknik altyapıyı hazır sunar.
Belirli bir iş uygulaması değildir; ERP, CRM, CMS, blog, SaaS, REST
API ya da iç uygulama — hepsinin altına aynı sağlam temeli koyar.
Composer yok, framework yok, CDN yok. İndirin, kurulum/ adresini
açın, birkaç adımda çalışan bir site + panel elde edin.
Tek cümlelik felsefe
Core, uygulamanın ne iş yaptığını bilmez. Yalnızca **nasıl
çalıştığını** sağlar.
// YANLIŞ — çekirdek iş mantığını biliyor
UserService::register($data);
ErpPersonel::olustur($user);
// DOĞRU — çekirdek duyurur, modül dinler
Events::dispatch(new UserRegistered($user));
Neler hazır?
| Katman | İçerik |
|---|---|
| Kurulum | Adım adım sihirbaz · .env üretimi · tabloları ve migration'ları kurar · yönetici hesabı · isteğe bağlı örnek veri · tek tuşla kendini silme |
| Kimlik | Giriş/kayıt/çıkış · beni hatırla · rol-yetki · kaba kuvvet koruması · sertleştirilmiş oturum |
| Yönlendirme | Temiz SEO adresleri · {parametre} · GET/POST/PUT/PATCH/DELETE · gruplar |
| Hata yönetimi | Merkezi işleyici · ölümcül hata yakalama · geliştirici ekranı · güvenli 404/403/419/500 |
| Günlük | Kanal bazlı (app error security auth mail queue) · parola maskeleme · rotasyon |
| Veritabanı | Migration + rollback + parti · seeder · Repository deseni |
| Depolama | public / private disk · 9 katmanlı yükleme güvenliği · güvenli indirme |
| Önbellek | Dosya / veritabanı / kapalı sürücüleri · remember() |
| Olaylar | Yayıncı-dinleyici · hata yalıtımı · test için fake() |
| Kuyruk | Veritabanı kuyruğu · atomik ayırma · katlanan yeniden deneme |
| Zamanlayıcı | Tek cron satırı · üst üste binme koruması |
| E-posta | SMTP / mail() / diske yazma · toplu gönderim · kuyruk · panel arayüzü |
| REST API | Standart yanıt zarfı · Bearer anahtarı · hız sınırı · sayfalama |
| Modüller | Aç/kapa · kendi rotaları, tabloları, görünümleri, menüsü |
| PWA | Panelden yönetilen künye (ad, simge, açılış adresi, görüntüleme modu, renk) · servis çalışanı · çevrimdışı sayfa |
| İçerik | Sayfa yönetimi — zengin metin editörü · adres (slug) üretimi · taslak/yayın · menü · sayfa bazlı SEO |
| SEO | Temiz adresler · canonical · Open Graph · başlık şablonu · dinamik sitemap.xml & robots.txt (panelden ek kural) |
| Ayarlar | Bölüm bölüm sayfalar · durum özetli genel bakış · kapsamlı kaydetme · logo ve favicon yükleme |
| İletişim | Form + spam koruması · WhatsApp düğmesi (hazır mesajla) · sosyal medya bağlantıları |
| Tema | Tek renk seçin, panelin ve sitenin tamamı yeniden renklensin |
| Mobil | Ön yüz ve panelin tamamı mobil öncelikli · 44px dokunma hedefleri · yapışkan menü · iOS yakınlaştırma ve çentik payı çözülmüş |
| Konsol | php cy — 20 komut, üreteçler dahil |
Klasör yapısı
├── index.php Web giriş noktası
├── cy Konsol giriş noktası (php cy …)
├── sw.js Servis çalışanı (PWA)
│
├── app/
│ ├── bootstrap.php Web + CLI ortak önyükleme
│ ├── Core/ ÇEKİRDEK (iş mantığı içermez)
│ │ ├── Api/ Cache/ Console/ Database/ Events/ Exceptions/
│ │ ├── Log/ Mail/ Modules/ Queue/ Schedule/ Storage/
│ │ └── Auth Config Csrf Database Env ErrorHandler Flash
│ │ Middleware RateLimiter Request Response Router
│ │ Session Setting Uploader Url Validator View
│ ├── Events/ Listeners/ Jobs/
│ ├── Models/ Entity'ler (ORM DEĞİL) + Role
│ ├── Repositories/ SQL yalnızca burada
│ ├── Http/Controllers/ Panel · Api · Site
│ └── Support/helpers.php
│
├── config/ app db session log cache queue api storage
│ upload security validation events
├── routes/ web.php · events.php · schedule.php
├── database/ migrations/ · seeders/
├── modules/ Eklenebilir modüller (Ornek/ = çalışan örnek)
├── views/ layouts · partials · emails · errors · sayfalar
├── assets/ css · js · images (CDN yok)
├── storage/ logs · cache · files · mail (web'e kapalı)
├── upload/ Yüklenen görseller (PHP çalıştırma kapalı)
└── kurulum/ Sihirbaz + database.sql + demo.sql (sonra SİLİN)
İsteğin yolculuğu
Tarayıcı → .htaccess → index.php → bootstrap → Session/Güvenlik
→ Ayarlar → Modüller → Router → Middleware → Controller
→ Repository → View / JSON
Konsol
php cy # tüm komutlar
php cy yardim migrate # ayrıntılı yardım# Şema
php cy make:migration "urunlere aciklama ekle"
php cy migrate php cy migrate --pretend
php cy migrate:status php cy migrate:rollback --step=3
php cy migrate:fresh --seed
# Üreteçler
php cy make:module Stok # çalışır durumda CRUD modülü
php cy make:controller Urun --api
php cy make:model Urun --repository
php cy make:seeder Urun
# Modüller
php cy module php cy module --enable=Stok
# Bakım
php cy cache:clear --expired php cy config:cache
php cy log:purge --list php cy queue:work --max=30
php cy schedule:run --list php cy mail:test [email protected]Cron — tek satır yeter:
* * * * * cd /yol/site && php cy schedule:run >> /dev/null 2>&1
Modül eklemek
php cy make:module Stok
php cy module --enable=Stok
php cy migratePanelde
/panel/stok hazır: listeleme, ekleme, silme. Modül kendirotalarını, tablolarını, görünümlerini ve menü girdisini taşır.
Kapalı modül hiç yüklenmez — rotaları tanımlanmaz, sınıfları
yüklenmez, olayları dinlenmez.
Sık kullanılanlar
// Adres ve varlık (hepsi köke göreli)
url('panel/ayarlar'); asset('css/site.css');
// Ayarlar
config('db.host'); // config/ dosyaları (geliştirici)
setting('site_adi'); // ayarlar tablosu (yönetici, panelden)
// Yetki
can('users.delete');
// Marka rengi (Ayarlar → Sistem → Tema Rengi)
Theme::brand(); // '#7c3aed' — doğrulanmış
Theme::styleTag(); // düzenlere basılan <style> bloğu
// Günlük
Logger::info('…', ['id' => 3], 'auth');
Logger::security('Şüpheli istek', ['ip' => $ip]);
// Önbellek
Cache::remember('rapor', 900, fn () => $agirHesap());
// Olay
Events::dispatch(new UserRegistered($user));
// Kuyruk
Queue::push(new RaporUret(3));
// Dosya
Uploader::store($request->file('belge'), ['disk' => 'private', 'group' => 'belge']);
// API yanıtı
ApiResponse::paginated($items, $total, $page, $perPage);
Örnek kodlar ve belgeler
Şablonun her parçası için çalışan örnek kod, açıklamalı anlatım ve
kopyalanabilir parçacıklar Çılgın Yazılım Kod Kütüphanesi'nde:
| Kaynak | Adres |
|---|---|
| Kod kütüphanesi (tüm konular) | |
| Bu şablonun sayfası | |
| Depo ve sürümler | |
| Mimari ve genişletme rehberi | SISTEM.md |
Bu bağlantılar sitenin alt bilgisinde de sabit durur (Örnek Kodlar
sütunu); kurduğunuz projede gezinirken bir tık uzaktadır.
Mobil
Ön yüz ve panel ayrı ayrı mobil için tasarlanmıştır — masaüstü
düzeninin küçültülmüş hâli değildir.
| Konu | Ön yüz | Panel |
|---|---|---|
| Menü | Yapışkan üst çubuk; hamburger açılır panel, kendi içinde kayar | Sol menü off-canvas çekmeceye döner (arka plan örtüsü + ESC) |
| Tema düğmesi | Hamburgerin dışında — menüyü açmadan tek dokunuş | Üst çubukta sabit |
| Dokunma hedefleri | Düğmeler ≥ 44px, menü satırları 46px | Düğmeler ≥ 44px, sayfalama 40px |
| Formlar | Alanlar 16px — iOS'un otomatik yakınlaştırması engellenir | Aynı |
| Yerleşim | Hero eylemleri tek sütun; iletişimde form önce gelir | Özet kartlar 2 sütun; tablolarda ikincil sütunlar ad hücresine iner |
| Modallar | — | Alttan açılan sayfa görünümü, gövde kendi içinde kayar |
| Çentikli ekran | env(safe-area-inset-*) payları | Aynı |
Kırılma noktaları iki yüzde de aynıdır: 992px (tablet) ve 768px
(telefon); 360px altı için ayrıca sadeleştirme vardır.
Güvenlik
| Tehdit | Önlem |
|---|---|
| SQL Injection | Hazırlıklı sorgular; sıralama sütunu beyaz listeden |
| XSS | e() kaçışlama + CSP (script-src 'self', satır içi JS yok) |
| CSP çakışması | Analytics kodunun adresi ve sha256 özeti otomatik tanıtılır; politika gevşetilmez |
| CSRF | Her POST'ta token (form alanı veya X-CSRF-Token) |
| Oturum çalma | httponly + samesite + secure + parmak izi + yenileme |
| Kaba kuvvet | Hız sınırı + kilit (kimlik+IP) |
| Path traversal | Segment bazlı doğrulama + realpath() |
| Kötücül yükleme | Gerçek MIME + beyaz/kara liste + rastgele ad + GD yeniden üretimi |
| Dosya ifşası | app/ config/ storage/ views/ .env cy web'e kapalı |
| Bilgi sızması | Yayında yığın izi ve dosya yolu gösterilmez |
Panel → Sistem Bilgisi sayfası bunların canlı denetimini yapar ve
her sorunun nasıl çözüleceğini yazar.
Canlıya çıkış
# .env
APP_ENV=production
APP_DEBUG=false
LOG_LEVEL=info
php cy config:cache && php cy migrate
- [ ]
kurulum/klasörü silindi - [ ] HTTPS aktif
- [ ]
storage/veupload/yazılabilir - [ ]
php cy mail:testbaşarılı - [ ] Cron kuruldu
- [ ] Sistem Bilgisi sayfasındaki tüm denetimler yeşil
Nginx kullanıyorsanız
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ ^/(app|config|storage|views|database|modules|kurulum)/ { deny all; }
location ~ /\.env { deny all; }
location ~ ^/cy$ { deny all; }
location ~* ^/upload/.*\.php$ { deny all; }
Yeni projeye başlarken
git clone https://github.com/CilginYazilim/cy-php-starter yeni-proje
cd yeni-proje && rm -rf .git
# kurulum/ adresini aç, sihirbazı tamamla
# ("Örnek verileri de yükle" kutusunu işaretlemeyin)
rm -rf modules/Ornek app/Jobs/OrnekIs.php
php cy make:module KendiModulunArdından Panel → Site Ayarları'ndan site adını, logoyu ve tema
rengini kendinize göre ayarlayın; arayüz anında yeni renginizi alır.
Sürüm
Sürüm numarası kodda, tek yerde durur:
// config/app.php
'version' => '1.1.0',Panel → Sistem Bilgisi sayfası bu değeri okur. Şablonu güncellediğinizdenumara kendiliğinden gelir; veritabanında ayrıca tutulmaz.
1.1.0
Mobil
- Ön yüz menüsü yapışkan hâle geldi; hamburger açılır panel kendi içinde
kayıyor, simgesi açıkken çarpıya dönüyor
- Tema düğmesi hamburgerin dışına alındı — menüyü açmadan erişilebiliyor
- Ön yüzdeki düğme ve menü satırları 44–46px dokunma hedefine çıkarıldı
- Ön yüz form alanlarına 16px kuralı eklendi (iOS'un otomatik
yakınlaştırması artık düzeni bozmuyor); daha önce yalnızca panelde vardı
- Ana sayfadaki hero eylemleri telefonda tek sütuna iniyor
- İletişim sayfasında telefonda form önce, bilgi kartları sonra geliyor
- Alt bilgi sütunları telefonda alt alta diziliyor; sabit WhatsApp düğmesi
artık alt bilginin son satırını kapatmıyor
- Panelde özet kartların tek sütuna inme sınırı 400px'ten 360px'e çekildi —
eski sınır iPhone 12/13/14 (390px) ve SE (375px) dahil neredeyse her
telefonu kapsıyor, kontrol paneli gereksiz yere uzuyordu
Düzeltmeler
site.cssilesite-sections.cssarasındaki çakışan kurallar
temizlendi. Bunlardan biri telefonda hero kartının logosunu tamamen
gizliyordu (.cy-hero__logo { display: none })
- Sürüm numarası tek kaynağa indirildi. Üç farklı yerde üç farklı değer
duruyordu: kurulum/database.sql "2.1.0", Sistem Bilgisi varsayılanı
"1.0.0", GitHub sürüm etiketi "v1.0.0"
Eklenenler
- Alt bilgide Örnek Kodlar sütunu: kod kütüphanesi, şablonun sayfası
ve depo bağlantısı
icon()yardımcısınabookvecodesimgeleri
Güncelliyorsanız:php cy migrateçalıştırın. Tek migration var,
veritabanındaki ölüsistem_surumayarını siler.
**Ayrıntılı mimari, tasarım kararları ve genişletme rehberi için:
SISTEM.md**
Örnek kodlar: cilginyazilim.com/kutuphane
MIT Lisansı · Çılgın Yazılım · cilginyazilim.com
Kaynak kod ağaçtan bir dosya seçin
İncelemek istediğiniz dosyayı ağaçtan seçin.
Güvenlik gereği kaynak dosyalardaki parola, API anahtarı ve benzeri gizli değerler gösterilmeden önce maskelenir (••••••••).
Sık sorulan sorular
Bu bir framework mü, yoksa hazır bir uygulama mı?
İkisi de değil. Belirli bir iş uygulaması değildir; ERP, CRM, CMS, blog ya da SaaS — hepsinin altına aynı temeli koyar. Framework de değildir, çünkü Composer paketi olarak kurulmaz: dosyaları kopyalayıp üzerine yazmaya başlarsınız. Temel ilke şudur: çekirdek uygulamanın ne iş yaptığını bilmez, yalnızca nasıl çalıştığını sağlar.
Kurulum için komut satırı gerekiyor mu?
Hayır. Tarayıcıda kurulum adresini açmanız yeterlidir. Sihirbaz .env dosyasını yazar, tabloları kurar, migration'ları çalıştırır (önbellek, kuyruk, API anahtarları) ve yönetici hesabınızı açar. Paylaşımlı hostingte de eksiksiz kurulur. Son adımdaki düğme kurulum klasörünü kendisi siler.
Composer ya da npm gerekiyor mu?
Hayır. Composer yok, framework yok, CDN yok. Tüm varlıklar proje içindedir; internet bağlantısı olmayan bir sunucuda da çalışır. Bunun bedeli hazır paketlerden yararlanmamaktır, kazancı ise bağımlılık güncellemesi yüzünden bozulan bir projeyle uğraşmamaktır.
İş mantığı nereye yazılır?
Modüllere. Çekirdek yalnızca olay yayınlar; modüller o olayları dinler. Bu yüzden çekirdekte "kullanıcı kaydolunca şunu yap" gibi bir satır bulunmaz, onun yerine bir olay duyurulur ve ilgilenen modül işini yapar. Her modülün kendi rotaları, tabloları, görünümleri ve menüsü vardır ve panelden açılıp kapatılabilir.
Temiz adresler çalışmazsa ne yapmalıyım?
.env dosyasında APP_PRETTY_URLS değerini false yapın. Uygulama index.php?r=… biçimine döner ve başka hiçbir şey değişmez; adres üretimi tek merkezden yapıldığı için uygulama kodunda değişiklik gerekmez.
Örnek verileri yüklemeli miyim?
Şablonu ilk kez deniyorsanız evet: listeleri ve filtreleri dolu görürsünüz. Gerçek bir projeye başlıyorsanız kutuyu boş bırakın, veritabanınız tertemiz kalır. Örnek veri son kurulum adımında bir onay kutusudur, sonradan da yüklenebilir.
Bu örneğin daha gelişmişi projenizde mi lazım?
İhtiyacınızı anlatın; bu yapıyı sizin sisteminize uyarlayalım ya da size özel geliştirelim.
Yorumlar
1 konuşmaSoru sorun veya yorum yazın
Yorumunuz onaylandıktan sonra yayınlanır. Teknik sorularınıza ekibimiz yanıt verir.
İlgili kod örnekleri
İleri
uygulama-iskeleti/php-job-queue
Veritabanı Tabanlı İş Kuyruğu
- PHP 8
- PDO
- MySQL 8
- SKIP LOCKED
- +2
74 inceleme 17 canlı açılış 1 beğeni
Orta
uygulama-iskeleti/php-scheduler-cron
Zamanlanmış Görevler (Scheduler)
- PHP 8
- PDO
- MySQL
- Bootstrap 5
- +2
41 inceleme 26 canlı açılış
İleri
uygulama-iskeleti/php-ai-integration
Yapay Zekâ Entegrasyonu (Claude API)
- PHP 8
- PDO
- MySQL
- Bootstrap 5
- +2
40 inceleme 25 canlı açılış