İçeriğe geç
CılgınYazılım

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
php-baslangic-sablonu/kunye.json
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?

  1. Proje dosyalarını sunucunuza kopyalayın (örn. XAMPP'ta htdocs veya kendi web sunucunuzun kök dizini)
  2. Tarayıcıda kurulum adresini açın — komut satırı gerekmez
  3. Sihirbazı tamamlayın: sihirbaz .env dosyasını yazar, tabloları kurar ve migration'ları çalıştırır
  4. Yönetici hesabınızı oluşturun; şablonu ilk kez deniyorsanız örnek veri kutusunu işaretleyin
  5. Son adımdaki düğmeyle kurulum klasörünü silin
  6. 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
KurulumAdı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
KimlikGiriş/kayıt/çıkış · beni hatırla · rol-yetki · kaba kuvvet koruması · sertleştirilmiş oturum
YönlendirmeTemiz SEO adresleri · {parametre} · GET/POST/PUT/PATCH/DELETE · gruplar
Hata yönetimiMerkezi işleyici · ölümcül hata yakalama · geliştirici ekranı · güvenli 404/403/419/500
GünlükKanal bazlı (app error security auth mail queue) · parola maskeleme · rotasyon
VeritabanıMigration + rollback + parti · seeder · Repository deseni
Depolamapublic / private disk · 9 katmanlı yükleme güvenliği · güvenli indirme
ÖnbellekDosya / veritabanı / kapalı sürücüleri · remember()
OlaylarYayıncı-dinleyici · hata yalıtımı · test için fake()
KuyrukVeritabanı kuyruğu · atomik ayırma · katlanan yeniden deneme
ZamanlayıcıTek cron satırı · üst üste binme koruması
E-postaSMTP / mail() / diske yazma · toplu gönderim · kuyruk · panel arayüzü
REST APIStandart yanıt zarfı · Bearer anahtarı · hız sınırı · sayfalama
ModüllerAç/kapa · kendi rotaları, tabloları, görünümleri, menüsü
PWAPanelden yönetilen künye (ad, simge, açılış adresi, görüntüleme modu, renk) · servis çalışanı · çevrimdışı sayfa
İçerikSayfa yönetimi — zengin metin editörü · adres (slug) üretimi · taslak/yayın · menü · sayfa bazlı SEO
SEOTemiz adresler · canonical · Open Graph · başlık şablonu · dinamik sitemap.xml & robots.txt (panelden ek kural)
AyarlarBölüm bölüm sayfalar · durum özetli genel bakış · kapsamlı kaydetme · logo ve favicon yükleme
İletişimForm + spam koruması · WhatsApp düğmesi (hazır mesajla) · sosyal medya bağlantıları
TemaTek 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üş
Konsolphp 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 migrate

Panelde /panel/stok hazır: listeleme, ekleme, silme. Modül kendi
rotaları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:

KaynakAdres
Kod kütüphanesi (tüm konular)
Bu şablonun sayfası
Depo ve sürümler
Mimari ve genişletme rehberiSISTEM.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üzPanel
MenüYapışkan üst çubuk; hamburger açılır panel, kendi içinde kayarSol menü off-canvas çekmeceye döner (arka plan örtüsü + ESC)
Tema düğmesiHamburgerin dışında — menüyü açmadan tek dokunuşÜst çubukta sabit
Dokunma hedefleriDüğmeler ≥ 44px, menü satırları 46pxDüğmeler ≥ 44px, sayfalama 40px
FormlarAlanlar 16px — iOS'un otomatik yakınlaştırması engellenirAynı
YerleşimHero 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 ekranenv(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 InjectionHazırlıklı sorgular; sıralama sütunu beyaz listeden
XSSe() 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
CSRFHer POST'ta token (form alanı veya X-CSRF-Token)
Oturum çalmahttponly + samesite + secure + parmak izi + yenileme
Kaba kuvvetHız sınırı + kilit (kimlik+IP)
Path traversalSegment bazlı doğrulama + realpath()
Kötücül yüklemeGerç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/ ve upload/ yazılabilir
  • [ ] php cy mail:test baş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 KendiModulun

Ardı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ğinizde
numara 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.css ile site-sections.css arası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ına book ve code simgeleri
Güncelliyorsanız: php cy migrate çalıştırın. Tek migration var,
veritabanındaki ölü sistem_surum ayarı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

cy-php-starter
Dosya seçilmedi

İ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.

Projenizi Anlatın

Yorumlar

1 konuşma
Ahmet Karaca
Kurulum sihirbazı veritabanını da kendi oluşturuyor mu?

Soru sorun veya yorum yazın

Yorumunuz onaylandıktan sonra yayınlanır. Teknik sorularınıza ekibimiz yanıt verir.

Yayınlanmaz; yalnızca gerektiğinde size ulaşmak için.

En az 10 karakter.

İlgili kod örnekleri

Tüm kod örnekleri