İçeriğe geç
Çılgın Yazılım

Uygulama İskeleti İleri

PHP Başlangıç Şablonu (CY PHP Starter)

Her yeni PHP projesinin altına konan açık kaynak PHP başlangıç şablonu: iki ekranlı kurulum sihirbazı, rol tabanlı yönetim paneli, e-posta doğrulama ve parola sıfırlama, mobil uygulama API'si, panelden açılan modüller, demo modu ve PWA. Composer, framework ve CDN yok.

  • PHP 8.1
  • PDO
  • MySQL
  • MariaDB
  • Bootstrap 5
  • JavaScript
  • REST API
  • PWA
php-baslangic-sablonu/kunye.json
seviye
"İleri"
dosya
568
satir
~63.992
boyut
"5.5 MB"
veritabani
"yeni_proje"
lisans
"MIT"
inceleme
322
begeni
13
yayin
""

Ekran görüntüleri 14 görsel

Bu örnek ne yapıyor?

  • İki ekranlı kurulum sihirbazı: "Bağlantıyı dene" ile veritabanını sınar, .env'i yazar, tabloları ve migration'ları kurar, yönetici hesabı açar; bitince kendini kilitler
  • Rol tabanlı yönetim paneli (Yönetici, Editör, Üye): 96 rotanın her birine kimin erişebildiği tests/rol-matrisi.php'de kodla tutulur
  • Kimlik akışları hazır: kayıtta e-posta doğrulaması, "parolamı unuttum", beni hatırla, güvenilen cihaz ve kaba kuvvet koruması
  • KVKK araçları: aydınlatma onayı, IP saklama süresi ve otomatik silme, 7 gün beklemeli "hesabımı sil", hazır Gizlilik ve KVKK sayfası
  • Mobil uygulama API'si: kullanıcı adı ve parolayla token, süreli Bearer anahtarı, yalnız okuma / okuma+yazma kapsamı, açık cihazları tek tek kapatma
  • Panelden tek tıkla açılan modüller; CRUD, onay akışı ve RBAC'ı gösteren Örnek Modül kopyalanacak şablon olarak gelir
  • Herkese açık deneme siteleri için demo modu: tek tıkla giriş, örnek hesaplara kilit, 3 saatte bir kendini sıfırlama
  • Altyapı katmanları: migration, kuyruk, olaylar, zamanlayıcı, önbellek, e-posta, PWA ve 24 komutluk konsol (php cy)
  • 339 birim testi ve 54 duman testi; GitHub Actions her itmede PHP 8.1–8.4 ve MySQL 8 ile gerçek kurulum yapar
  • Composer, framework ve CDN yok: SSH'siz paylaşımlı hostingde tarayıcıdan kurulur, migration'lar panelden çalışır

Nerede işe yarar?

  • Yeni bir müşteri projesine başlarken giriş, panel ve kurulum gibi her seferinde yazılan altyapıyı hazır almak
  • ERP, CRM, CMS, blog ya da SaaS gibi farklı işlerin altına aynı temeli koymak
  • Mobil uygulamaya kullanıcı girişi ve token tabanlı REST API sunan bir arka uç gerektiğinde
  • SSH erişimi olmayan paylaşımlı hostingde yönetim paneli kurmak ve güncellemek
  • Rol tabanlı yetkiyi (RBAC) ve onay akışını çalışan bir örnek modül üzerinden öğrenmek
  • Herkese açık, kendini sıfırlayan bir ürün demosu yayınlamak
  • Framework kullanmadan katmanlı bir PHP mimarisi öğrenmek ya da öğretmek

Gereksinimler

  • PHP 8.1+ (8.1–8.4 ile sınanır; 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. Projeyi ZIP olarak indirin ya da git clone https://github.com/CilginYazilim/cy-php-starter ile klonlayın
  2. Klasörü web sunucunuzun klasörüne koyun (XAMPP'te htdocs/); site adresi klasör adına göre oluşur
  3. Tarayıcıda http://siteniz/kurulum/ adresini açın; canlı sunucuda sihirbaz storage/kurulum-anahtari.txt dosyasındaki anahtarı ister
  4. ekranda veritabanı bilgilerini yazıp "Bağlantıyı dene"ye basın; veritabanı yoksa sihirbaz oluşturur (kullanıcının yetkisi varsa)
  5. ekranda site adını, yönetici hesabını ve seçenekleri (örnek veri, demo modu, açılacak modüller) girip "Kur"a basın
  6. Bitiş ekranından panele girin ve "Kurulum klasörünü sil" düğmesine basın
  7. mod_rewrite yoksa .env içinde APP_PRETTY_URLS=false yapın; uygulama index.php?r=… biçimine döner

Nasıl çalışıyor?

Bu şablon nedir?

CY PHP Starter, Çılgın Yazılım'ın açık kaynaklı **PHP başlangıç
şablonudur** (starter kit, boilerplate). Her yeni PHP projesinde baştan
yazdığınız teknik altyapıyı — kurulum sihirbazı, giriş ve rol-yetki
sistemi, yönetim paneli, migration, kuyruk, REST API, PWA — hazır ve test
edilmiş olarak sunar.

Belirli bir iş uygulaması değildir; ERP, CRM, CMS, blog, SaaS, REST
API ya da şirket içi uygulama — hepsinin altına aynı sağlam temeli koyar.

Composer yok, framework yok, CDN yok. Saf PHP 8.1+ ve PDO/MySQL ile
yazılmıştır; paylaşımlı hostingde bile komut satırı olmadan kurulur.
İndirin, kurulum/ adresini açın, birkaç adımda çalışan bir site ve
yönetim paneli 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));

Framework mü, bu şablon mu?

Laravel ya da Symfony gibi tam bir framework çoğu proje için doğru
seçimdir. Bu şablon, şu durumlar için yazıldı:

İhtiyaçCY PHP StarterTam framework
SSH'siz paylaşımlı hostingTarayıcıdan kurulur, migration'lar panelden çalışırÇoğunlukla Composer ve komut satırı ister
Bağımlılık güncellemesiYok — vendor/ klasörü yokDüzenli composer update
Kodu baştan sona okuyabilmekSaf PHP, küçük ve açıklamalı çekirdekFramework'ün kendi kavram katmanı
Hazır paket ekosistemiYok — ihtiyacınızı kendiniz yazarsınızÇok geniş

Neler hazır?

Katmanİçerik
Kurulumİki ekranlı sihirbaz · "Bağlantıyı dene" · anlaşılır veritabanı hataları · .env üretimi · tabloları ve migration'ları kurar · yönetici hesabı · tek tıkla örnek veri · adım adım rapor · canlı sunucuda kurulum anahtarı
KimlikGiriş/kayıt/çıkış · kayıtta e-posta doğrulaması · parolamı unuttum (tek kullanımlık bağlantı) · "parolanız değişti" ve eski adrese "e-posta adresiniz değişti" e-postaları · beni hatırla · güvenilen cihaz · rol-yetki · kaba kuvvet koruması · sertleştirilmiş oturum
KVKKKayıt ve iletişim formunda aydınlatma onayı · IP/tarayıcı saklama süresi ve otomatik silme · hesabımı sil (7 gün bekleme, girişle iptal) · hazır "Gizlilik ve KVKK" sayfası
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 · kilitlenmeye dayanıklı
ZamanlayıcıTek cron satırı · üst üste binme koruması
E-postaSMTP / mail() / diske yazma · toplu gönderim · kuyruk · panel arayüzü · yeni üye bildirimi · yöneticinin açtığı hesaba "parolanızı belirleyin" bağlantısı (parola mektuba yazılmaz) · üye duyuruları Hesabım'dan ya da imzalı tek tıkla kapatır
REST APIStandart yanıt zarfı · süreli Bearer anahtarı (yalnızca SHA-256 özeti saklanır) · yalnız okuma / okuma+yazma kapsamı · hız sınırı · sayfalama · JSON gövde
Mobil uygulamaKullanıcı adı/parolayla giriş → token · çıkış · açık cihazlar ve tek tek kapatma · örnek dosya listesi/indirme · rehber
ModüllerPanelden tek tıkla aç/kapa · kendi rotaları, tabloları, görünümleri, menüsü, rollere dağıttığı yetkileri ve örnek verisi · CRUD, onay akışı ve RBAC'ı gösteren Örnek Modül kurulumda açık gelir
Demo moduHerkese açık deneme sitesi için: giriş ekranında Yönetici / Editör / Üye ile tek tıkla giriş · örnek hesaplara parola, kullanıcı, ayar ve e-posta kilidi · 3 saatte bir kendini sıfırlar
Örnek veriTek kaynak (DemoData): 6 hesap, sayfalar, mesajlar, e-postalar, markalı vitrin · panelden ya da php cy demo:temizle ile tek tıkla kaldırılır
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ü · editörden görsel yükleme · kapak görseli · 30 dakikalık imzalı önizleme · adres (slug) üretimi · taslak/yayın · menü · sayfa bazlı SEO
Ana sayfaBütün bölümler ve metinler panelden (Ayarlar → Ana Sayfa): karşılama, özellikler, adımlar, rolleri deneyin, kod örneği, SSS, son bant — koda gömülü metin yok
SEOTemiz adresler · canonical · Open Graph · JSON-LD (Organization, WebSite, SoftwareApplication, WebPage, BreadcrumbList) · 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 · tablolar telefonda karta döner · 44px dokunma hedefleri · yapışkan menü · iOS yakınlaştırma ve çentik payı çözülmüş
Konsolphp cy — 24 komut, üreteçler ve XAMPP'siz geliştirme sunucusu (php cy serve) dahil
Testler339 birim testi (rol matrisi, XSS, politika — veritabanı gerektirmez) · 54 duman testi · GitHub Actions'ta PHP 8.1–8.4 ve MySQL 8 ile gerçek kurulum

Demo hesaplar

Örnek veriyle kurulumda (ve canlı demoda)
şu hesaplar gelir. Ortak parola yalnızca demo modunda ya da geliştirme
ortamında giriş ekranında görünür; satıra tıklamak yeterlidir.

RolKullanıcı adıNe görür, ne yapar
Yöneticiali.yoneticiHer ekran. Demo modunda parola, kullanıcı, ayar ve e-posta işlemleri kilitli
Editörelif.editorSayfaları yazar, mesajları yanıtlar, Örnek Modül'de onay bekleyenleri yayınlar
Üyemehmet.uyeKendi profili ve Örnek Modül'de kendi kayıtları (yazar, onaya gönderir)
Pasif üyeayse.pasifGiriş yapamaz — durum denetimini gösterir
Askıdaki üyecan.askidaGiriş yapamaz
Onay bekleyenzeynep.onayE-posta doğrulanmadan giriş yapamaz

Ana sayfadaki "Rolleri deneyin" kartları (/giris?demo=elif.editor)
giriş ekranında o hesabı vurgular; rol adı da olur (/giris?demo=editor,
admin, uye). Parola adreste asla taşınmaz. Gerçek bir
sitede örnek veriyi Panel → Sistem → Örnek veriyi kaldır ile tek
tıkla silin.

Rol ve yetki matrisi

Ekran / işlemYöneticiEditörÜyeZiyaretçi
Kontrol paneli, Hesabım, Örnek Modül✅✅✅girişe yönlenir
Mesajlar, E-posta geçmişi, Sayfalar✅✅❌ 403girişe yönlenir
Kullanıcılar, Ayarlar, Sistem✅❌ 403❌ 403girişe yönlenir
API anahtarı üretmek✅✅❌—
GET /api/v1/ben, mobil oturum✅✅✅401
GET /api/v1/kullanicilar✅❌ 403❌ 403401
GET /api/v1/sayfalar✅✅✅✅
Örnek Modül: başkasının kaydını düzenle/sil✅❌❌—
Örnek Modül: onay bekleyeni yayınla✅✅❌—

Bu tablo kodda da yazılıdır: tests/rol-matrisi.php
96 rotanın her biri için kimin erişebildiğini tutar; bir rotanın yetkisi
değişirse birim testi kırılır. Duman testi aynı matrisi demo hesaplarla,
demo modu açık ve kapalı olarak gerçek HTTP isteğiyle sınar. Demo
kilidi yetkiden SONRA çalışır: yetkisi olmayan "yetkiniz yok" görür.


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 · gelistirme-sunucusu.php (php cy serve)
│
├── config/                 app db session log cache queue api storage
│                           upload security validation events
├── routes/                 web.php · events.php · schedule.php
├── database/               migrations/ · seeders/ · ornek-veritabani.sql
├── 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ı)
├── docs/                   MOBIL-API.md · ekran görüntüleri (yalnızca GitHub'da; ZIP'te yok)
├── tests/                  unit · smoke · kurulum · sema · rol-matrisi · ornek-sql (web'e kapalı)
└── kurulum/                Sihirbaz + database.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

# Örnek veri ve demo
php cy db:seed                     php cy demo:reset    php cy demo:temizle

# XAMPP'siz geliştirme sunucusu → http://127.0.0.1:8000
php cy serve                       php cy serve --port=8080

# 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]

# API anahtarı (süre verilmezse 90 gün; süresiz için açıkça --suresiz)
php cy api:token admin "Mobil uygulama" --gun=90
php cy api:token admin --liste     php cy api:token admin --iptal=3

Çekirdek migration'lar geri alınamaz. Şablonla gelen her migration
(sihirbazın kurdukları ve güncellemelerle gelenler) "temel parti" (0)
olarak işaretlenir; migrate:rollback ve migrate:fresh yalnızca
SİZİN eklediğiniz ve modüllerden gelen migration'ları etkiler.
php cy migrate:status bunları 0 (kurulum) diye gösterir.
SSH yoksa: bekleyen migration'lar Panel → Sistem Bilgisi
sayfasındaki düğmeyle çalıştırılır; panel her sayfada uyarır.

Cron — tek satır yeter:

* * * * * cd /yol/site && php cy schedule:run >> /dev/null 2>&1

REST API

Dış istemciler (mobil uygulama, başka bir sunucu) /api/v1/… uçlarına
Bearer anahtarıyla bağlanır. Anahtar **Panel → Hesabım → API
Anahtarları** ekranından ya da php cy api:token ile üretilir; açık hali
yalnızca bir kez gösterilir, veritabanında yalnızca SHA-256 özeti durur.

curl -H "Authorization: Bearer cy_…" https://siteniz.com/api/v1/ben
UçKorumaAçıklama
POST api/v1/oturumanahtarsız (kaba kuvvet korumalı)Mobil giriş: kullanici, parola, cihaz → token
DELETE api/v1/oturumanahtarBu cihazdan çıkış
GET api/v1/oturumlar · DELETE api/v1/oturumlar/{id}anahtarAçık cihazlar; başka cihazı kapatma
GET api/v1/benanahtarGiriş yapan kullanıcı, token kapsamı ve türü
GET api/v1/dosyalar · api/v1/dosyalar/{ad}anahtarÖrnek dosya listesi ve indirme
GET api/v1/kullanicilar?sayfa=1&boyut=25&ara=…anahtar + users.viewSayfalanmış kullanıcı listesi
GET api/v1/sayfalaranahtarsız, hız sınırlıYayındaki içerik sayfaları
GET api/v1/sayfalar/{slug}anahtarsız, hız sınırlıTek sayfanın içeriği

Mobil uygulama için oturum

Mobil uygulama anahtarı elle almaz; kullanıcı adı ve parolayla giriş yapar,
dönen token'ı güvenli depoda saklar:

curl -X POST https://siteniz.com/api/v1/oturum \
     -H "Content-Type: application/json" \
     -d '{"kullanici":"mehmet.uye","parola":"…","cihaz":"Pixel 8"}'
# → { "success": true, "data": { "token": "••••••••", "son_gecerlilik": "…", "kullanici": { … } } }

curl -H "Authorization: Bearer cy_…" https://siteniz.com/api/v1/dosyalar
curl -X DELETE -H "Authorization: Bearer cy_…" https://siteniz.com/api/v1/oturum

Giriş, panel girişiyle aynı kaba kuvvet korumasından geçer. Token
30 gün geçerlidir (API_SESSION_DAYS); kullanıcı açık cihazlarını
Panel → Hesabım → Bağlı cihazlar'da görür ve tek tek kapatır.
Akış, hata kodları, JavaScript ve Flutter örnekleri:
Mobil API rehberi.

Anahtarlar

  • Anahtarla gelen istekler durumsuzdur: oturum açılmaz, çerez dönmez.

Anahtar iptal edildiği an erişim biter.

  • Anahtar, sahibinin yetkilerinden fazlasına erişemez; sahibi pasife

alınırsa anahtarı da çalışmaz.

  • Panelden anahtar üretmek mevcut parolayı ister; süre 30/90/180/365

gün, kapsam yalnız okuma (varsayılan) ya da okuma + yazma seçilir.
Yalnız okuma anahtarı GET dışında 403 kapsam_yetersiz alır. Parola değişince kullanıcının **bütün anahtarları iptal
edilir**; "Diğer cihazlardan çıkış" da isteğe bağlı olarak iptal eder.

  • Tarihler ISO 8601 biçimindedir (2026-10-06T14:05:00+03:00).
  • Bakım modunda API de 503 döner (bakımı aşma yetkisi olanın anahtarı hariç).
  • Kendi uçlarınız için örnek: app/Http/Controllers/Api/V1Controller.php

ve routes/web.php içindeki api/v1 grubu.


Testler

php tests/unit.php                                   # veritabanı gerektirmez
php tests/smoke.php http://localhost/proje           # kurulu siteye HTTP denetimi
php tests/smoke.php http://localhost/proje --kullanici=admin --parola=…
php tests/kurulum.php http://127.0.0.1:8000 --db-adi=bos_db --ornek-veri --demo   # sihirbazı uçtan uca
php tests/sema.php --eski=eski-database.sql          # yükseltilen şema = yeni kurulum mu?
php tests/ornek-sql.php --db-adi=ornek_db             # örnek veritabanı SQL dosyasını üretir

unit.php 339 testi veritabanı olmadan çalıştırır; aralarında **rol
matrisi** (96 rotanın her biri için kimin erişebildiği), 18 XSS vektörü,
Örnek Modül politikası ve kurulum şeması tutarlılığı vardır. smoke.php
siteyi değiştirmez: kurulum kilidi, gizli dosyalar (.env, .git/), açık
yönlendirme, kaba kuvvet kilidi, kullanıcı tespiti, oturum çerezi, mobil
API akışı ve — örnek veriyle kurulmuş sitede — demo hesaplarla **rol
matrisini** (GET ve CSRF'li POST) dışarıdan sınar. Kısa sürede arka arkaya
çalıştırırsanız IP kilidi devreye girer; ilgili testler "atlandı" görünür
(koruma çalışıyor demektir).

GitHub Actions her itmede iki iş çalıştırır (.github/workflows/ci.yml):
PHP 8.1–8.4'te sözdizimi + birim testleri; ardından **MySQL 8 ile gerçek
kurulum** — depo yerleşik PHP sunucusunda açılır, sihirbaz HTTP üzerinden
örnek veriyle çalıştırılır, duman testi demo modu açık ve kapalı iki
kez koşar ve v1.2.0'dan bu yana her sürümden yükseltilen şemanın yeni
kurulumla birebir aynı olduğu denetlenir.


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.

SSH erişimi yoksa modülü panelden açın: Sistem Bilgisi → Modüller
bölümündeki düğme modülü açar ve tablolarını kurar. Kapatmak hiçbir
veriyi silmez; menüsü, sayfaları ve yetkileri devreden çıkar.

Kapalı modül hiç yüklenmez — rotaları tanımlanmaz, sınıfları
yüklenmez, olayları dinlenmez.

Modül yetkilerini kendisi dağıtır — çekirdeğin Role.php'sine
dokunulmaz:

"yetkiler": { "editor": ["stok.view", "stok.create"], "uye": ["stok.view"] }

Örnek Modül: kopyalanacak şablon

modules/Ornek kendi modülünüzü yazarken örnek alacağınız, kurulumda
açık gelen eksiksiz bir modüldür: liste, ekleme, düzenleme, silme ve
onay akışı (üye yazar, editör onaylar, sonra yayına çıkar).

RolGörürYapar
YöneticiHer kaydıHer kaydı düzenler, siler, yayınlar
EditörYayındakileri, onay bekleyenleri, kendi kayıtlarınıOnaylar ve yayınlar; yalnızca kendi kaydını düzenler
ÜyeYayındakileri ve kendi kayıtlarınıYazar, düzenler, onaya gönderir; yayınlayamaz

Rol yetkisi module.json'da, kayıt düzeyi kural OrnekPolicy'dedir.
Görünüm ve denetleyici aynı sınıfa sorar; elle gönderilen yetkisiz
istek 403, görülemeyen kayda istek 404 alır. Adım adım rehber:
modules/Ornek/README.md.

module.json içinde "kurulumda_acik": true yazan her modül
sihirbazda işaretli gelir.


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:

KaynakBağlantı
Tüm konularÇılgın Yazılım Kod Kütüphanesi
Bu şablonun tanıtım sayfasıPHP Başlangıç Şablonu
Çalışan örnekCanlı demo
Mimari ve genişletme rehberiSistem Kılavuzu (SISTEM.md)
Mobil uygulama bağlantısıMobil API rehberi (docs/MOBIL-API.md)
Sürüm notlarıDeğişiklik Günlüğü (CHANGELOG.md) · GitHub sürümleri
Kaynak kodGitHub deposu

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; tablolar 768px altında etiketli kartlara döner, yatay kaydırma yok
Modallar—Alttan açılan sayfa görünümü, gövde kendi içinde kayar
Uzun formlar—Sayfa düzenleyicide Kaydet/Önizle altta yapışık çubukta
Ç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

Şablon iki ayrı güvenlik incelemesinden (1.3.0 ve 1.4.0) ve bağımsız bir
rol/yetki test raporundan (1.6.0) geçti. Her bulgu yerel bir kurulumda
yeniden üretildi, düzeltildi ve testle sınandı.

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
Oturum karışmasıKuruluma özel çerez adı, çerez yolu ve oturum klasörü (storage/sessions); oturum APP_KEY'e bağlı
Parola değişikliğiDiğer cihazlardaki oturumlar, "beni hatırla" jetonu ve API anahtarları anında geçersiz ("oturum sürümü"); parolayı değiştiren cihaz açık kalır
Çalınan "beni hatırla" çereziJeton her kullanımda KOŞULLU döndürülür; eski jeton ve parola değişiminden sonraki jeton çalışmaz
Kaba kuvvetDeneme parola doğrulanmadan ÖNCE yazılır (paralel istekler sınırı aşamaz); kimlik kilidi + IP başına farklı kimlik sayan, giderek artan bekleme; IPv6 /64 tek adres sayılır; güvenilen cihaz takılmaz; vekil arkasında TRUSTED_PROXIES
Kullanıcı tespitiVar olan/olmayan hesap aynı sürede ve aynı mesajla yanıtlanır; kayıt formu kayıtlı adreste de aynı yanıtı verir
Kayıt formu kötüye kullanımıE-posta doğrulaması (imzalı, tablosuz bağlantı) · imzalı ve zorunlu form zaman damgası · hatalı gönderimler de sayılır · kilitli sayaç
Açık yönlendirme"Girişten sonra dön" adresi yalnızca uygulama içi, beyaz listeli yol
Kurulum ele geçirmeSihirbaz .env / kilit dosyası varken hiçbir adımı çalıştırmaz
Path traversalSegment bazlı doğrulama + realpath(); görünüm adları beyaz listeden
Kötücül yüklemeGerçek MIME + beyaz/kara liste + rastgele ad + GD yeniden üretimi + piksel/bellek sınırı
Spam rölesiOtomatik yanıt varsayılan kapalı, ziyaretçi metnini içermez, aynı adrese günde bir
Dosya ifşasıapp/ config/ storage/ views/ .env .git/ cy web'e kapalı
Bilgi sızmasıYayında yığın izi ve dosya yolu gösterilmez; varsayılan APP_DEBUG=false
Yanlış rota tanımıBilinmeyen ara katman adı hata fırlatır (rota sessizce herkese açılmaz)
Herkese açık demoDemo modunda örnek hesaplar parolayı, kullanıcıları, ayarları değiştiremez, e-posta gönderemez; kilit yetki denetiminden SONRA çalışır; anahtar .env'de (panelden kapatılamaz); demo kapalıyken unutulan örnek hesaplar için panel uyarır
Parola sıfırlamaTek kullanımlık, 60 dakikalık bağlantı; yalnızca özet saklanır; her durumda aynı yanıt; IP ve adres başına sınır; başarıda bütün oturumlar ve anahtarlar kapanır; sahibine "parolanız değişti" e-postası
Yönetici hesaplarıYalnızca yönetici değiştirir/siler/pasife alır; yönetici rolünü yalnız yönetici verir; e-posta/parola değişirken işlemi yapanın parolası istenir; son yönetici kuralı atomik
İçerikte dış görselSayfa içeriğindeki görsel yalnızca kendi alan adınızdan (ya da CSP_IMG_SRC) gelebilir
Yetki gerilemesiRol matrisi birim testi + CI'da MySQL 8 ile demo açık/kapalı duman testi

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
APP_KEY=<64 onaltılık karakter, kuruluma özel>
# Cloudflare / yük dengeleyici / nginx ters vekil arkasındaysa:
TRUSTED_PROXIES=<vekil adresleri>

php cy config:cache && php cy migrate
  • [ ] kurulum/ klasörü silindi
  • [ ] Demo sitesi değilse APP_DEMO=false ve örnek veri kaldırıldı

(Panel → Sistem → Örnek veriyi kaldır ya da php cy demo:temizle)

  • [ ] E-posta ayarları yapıldı (kayıt formu ve "Parolamı unuttum" ancak o zaman açılır)
  • [ ] Ayarlar → Sistem → KVKK sayfası ve IP saklama süresi kontrol edildi
  • [ ] Panelin üstünde kırmızı/turuncu uyarı yok (debug, bekleyen migration, APP_KEY, örnek hesaplar)
  • [ ] 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
  • [ ] Apache'de mod_deflate + mod_filter (sıkıştırma), mod_expires

ve mod_headers (tarayıcı önbelleği) açık

Sıkıştırma ve önbellek. .htaccess CSS, JS, JSON ve SVG'yi
sıkıştırır; sürümlü dosyalara (?v=…) bir yıllık immutable önbellek
verir. Bunun için sunucuda mod_deflate, mod_filter ve mod_headers
açık olmalıdır (mod_expires varsa sürümsüz görseller de önbelleğe
girer). Paylaşımlı hostinglerin çoğunda açıktır. XAMPP'ta
apache/conf/httpd.conf içinde mod_deflate, mod_filter ve
mod_expires satırlarının başındaki # silinip Apache yeniden
başlatılır. Modül kapalıysa site yine çalışır, yalnızca dosyalar
sıkıştırılmadan gider.
"Hata ayıklama açık" uyarısı yalnızca yerel olmayan adreste
görünür: localhost'ta APP_DEBUG=true bilinçli bir geliştirme
ayarıdır. Canlı sunucuda bu uyarıyı görürseniz .env → APP_DEBUG=false.

Nginx kullanıyorsanız

location / {
    try_files $uri $uri/ /index.php?$query_string;
}

# Nokta ile başlayan her şey (.env, .git/, .github/ …) — .well-known hariç
location ~ /\.(?!well-known) { deny all; }

location ~ ^/(app|config|storage|views|database|modules|routes|tests|docs|kurulum)/ { deny all; }
location ~ ^/cy$   { deny all; }

location ~* ^/upload/.*\.(php\d?|phtml|phar|pl|py|cgi|sh)$ { deny all; }
location ^~ /upload/ {
    add_header X-Content-Type-Options nosniff;
    add_header Content-Security-Policy "default-src 'none'; img-src 'self' data:; style-src 'unsafe-inline'; sandbox";
}

# API'nin Bearer anahtarı PHP-FPM'e iletilsin
fastcgi_param HTTP_AUTHORIZATION $http_authorization;
Kurulum bittiyse kurulum klasörünü silin; Nginx'te yukarıdaki kural
zaten kapatır, sihirbazı açmak için kuralı geçici olarak kaldırmanız gerekir.

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 veriyle kur" ve "Demo modu" kapalı,
#  Modüller bölümünde "Örnek Modül" işaretsiz)

rm -rf modules/Ornek app/Jobs/OrnekIs.php

php cy make:module KendiModulun

Ardından Panel → Site Ayarları'ndan site adını, marka adını, logoyu
ve tema rengini, Ana Sayfa grubundan da ana sayfanın bölümlerini ve
metinlerini kendinize göre ayarlayın; arayüz anında yeni renginizi alır.


Sürüm

Güncel kararlı sürüm 1.6.2 (7 Ekim 2026). Sürüm numarası kodda, tek yerde
durur:

// config/app.php
'version' => '1.6.2',

Panel → Sistem Bilgisi sayfası bu değeri okur. Şablonu güncellediğinizde
numara kendiliğinden gelir; veritabanında ayrıca tutulmaz.

Sürüm geçmişi

SürümTarihÖne çıkanlar
1.6.22026-10-07ZIP'ten kurulum testi: pakette .gitignore; örnek veri kaldırılınca Hakkımızda nötr; duyurudan tek tıkla çıkış (RFC 8058) ve tarayıcıya dayanıklı onay; hesap açılışında "Hesabınızı etkinleştirin"; bakımda üye girişi kapalı; JS sıkıştırma ve uzun önbellek; 70 KB'tan 6 KB'a logo
1.6.12026-10-07Form yardım metinleri ve karakter sayacı; e-posta değişikliği, hesap silme, yeni üye ve hesap açılışı bildirimleri; duyuru tercihi; koyu temada WCAG AA kontrast; ana sayfa menüyle aynı hizada; demo parolaları yalnızca demo modunda; SQL dosyasıyla kurulum (database/ornek-veritabani.sql)
1.6.02026-10-07Parola sıfırlama; mobil uygulama oturum API'si; KVKK araçları ve hesap silme; iki ekranlı kurulum; panelden yönetilen ana sayfa; tablolar mobilde kart; CI'da MySQL 8 ile rol matrisi
1.5.12026-10-07Veritabanı performansı: sık çalışan sorgular için eksik indeksler; giriş denemeleri temizliğinin kilitlenmesi giderildi
1.5.02026-10-07Demo modu (tek tıkla giriş, örnek hesaplara kilit); panelden modül aç/kapa; modüllerin rollere yetki dağıtması ve onay akışlı RBAC örnek modülü; sade panel tasarımı
1.4.02026-10-06İkinci güvenlik incelemesi: boşluklu/Türkçe klasörde ve Redis oturumunda giriş, kuyrukta kilitlenme, kayıtta e-posta doğrulaması, parola değişince düşen API anahtarları, hizmet engellemeye dayanıklı IP kilidi
1.3.02026-10-06Kapsamlı güvenlik incelemesi: kurulum sihirbazı ele geçirme, açık yönlendirme, kaba kuvvet kilidi, oturum sürümü; REST API anahtarları, birim ve duman testleri, GitHub Actions
1.2.12026-09-05Takma ad (vitrin) adresinden servis edilen kurulumda 404 ve yönlendirme döngüsü düzeltildi
1.2.02026-09-0412 ekran görüntüsü ve Canlı Demo bölümü
1.1.02026-08-30Mobil düzen baştan elden geçirildi, sürüm numarası tek kaynağa indi
1.0.02026-08-18İlk kararlı sürüm

Her sürümün ayrıntısı:
CHANGELOG.md.

Güncelleme (1.6.1 → 1.6.2)

  1. Kodu çekin, php cy migrate çalıştırın (SSH yoksa panelde "Şimdi çalıştır").

Bir migration: parola bağlantılarının türü (parola_sifirlama.tur).
Değerlerinize dokunmaz.

  1. .htaccess değişti (JS sıkıştırma, sürümlü dosyalara uzun önbellek).

Kendi .htaccess'inizi düzenlediyseniz "4) İstemci önbelleği" ve
"5) Sıkıştırma" bölümlerini aktarın.

  1. Duyurudan çıkma bağlantısı artık önce onay sayfası açar; tercih

"Duyuruları kapat" düğmesiyle (POST) değişir.

Güncelleme (1.6.0 → 1.6.1)

  1. Kodu çekin, php cy migrate çalıştırın (SSH yoksa panelde "Şimdi çalıştır").

İki migration: ayar açıklamaları ve bildirimler ("Yeni Üye Bildirimi"
ayarı, kullanicilar.bildirim_tercihleri sütunu). Değerlerinize dokunmaz.

  1. Geliştirme modunda (APP_DEBUG=true) giriş ekranı artık demo parolalarını

listelemez; hızlı giriş yalnızca APP_DEMO=true iken görünür.

  1. "Örnek veriyi kaldır" artık örnek marka ayarlarını da (slogan, sosyal

hesaplar…) nötre döndürür; sizin değiştirdiklerinize dokunmaz.

Güncelleme (1.5.x → 1.6.0)

  1. Yedek alın (veritabanı + .env), kodu çekin.
  2. php cy migrate — SSH yoksa panelde çıkan "Şimdi çalıştır". Tek

migration: yeni ayarlar (Ana Sayfa grubu, KVKK, parola sıfırlama, hesap
silme), parola sıfırlama tablosu, API anahtarı kapsam sütunları ve
"Gizlilik ve KVKK" sayfası. Var olan ayarlarınıza dokunmaz.

  1. Ana sayfanız eskisi gibi kalır; yeni bölümleri **Panel → Ayarlar → Ana

Sayfa**'dan açın. Örnek vitrini görmek isterseniz: php cy db:seed.

  1. Var olan API anahtarları "okuma + yazma" kapsamında çalışmaya devam eder.

Güncelleme (1.5.0 → 1.5.1)

Kodu çektikten sonra php cy migrate çalıştırın (SSH yoksa panelde
çıkan "1 migration bekliyor → Şimdi çalıştır"). Yalnızca indeks
ekler, veriye dokunmaz.

Güncelleme (1.4.0 → 1.5.0)

Çekirdekte migration yok; kodu çekmeniz yeterli. Demo modu varsayılan
olarak kapalıdır. Var olan bir kurulumda Örnek Modül'ü açmanın en kolay
yolu panel: Sistem Bilgisi → Modüller bölümündeki düğme modülü açar
ve tablolarını kurar. Komut satırından açıp deneme kayıtlarıyla
doldurmak için:

php cy module --enable=Ornek
php cy migrate                          # modülün 2 migration'ı
php cy db:seed --class=OrnekIcerik      # 12 rastgele kayıt

Ornek modülü zaten açıksa yalnızca php cy migrate yeterlidir (SSH
yoksa Panel → Sistem Bilgisi'ndeki düğme).

Güncelleme (1.2.x ya da 1.3.x → 1.4.0)

  1. Yedek alın (veritabanı + .env).
  2. Kodu çekin.
  3. php cy migrate çalıştırın — SSH yoksa **Panel → Sistem Bilgisi →

Migration'ları Çalıştır**. Migration'lar çalıştırılmadan da giriş
yapılabilir; panel her sayfada uyarır. Eski kurulum migration'ları bu
adımda kendiliğinden temel partiye (0) taşınır; elle SQL gerekmez.

  1. .env dosyanızı açın ve şunları kontrol edin (eski sihirbaz bu

satırları geliştirme değerleriyle yazıyordu):

  • APP_ENV=production ve APP_DEBUG=false olmalı (satırları SİLMEYİN,

değerlerini değiştirin).

  • APP_KEY boşsa doldurun: php -r "echo bin2hex(random_bytes(32));"
  • SESSION_NAME boşsa doldurun (örn. CYS_ + 10 rastgele harf/rakam);

aynı alan adında başka kurulum varsa her biri farklı olmalı.

  • Site bir vekilin arkasındaysa TRUSTED_PROXIES yazın.
  • Eksik anahtarlar için .env.example'a bakın.
  1. php cy config:cache kullanıyorsanız yeniden çalıştırın.

Kurulum kimliği artık yalnızca APP_KEY'den türetildiği için bütün
kullanıcılar bir kez yeniden giriş yapar. 1.1.0'dan güncelliyorsanız
da aynı adımlar yeterlidir.


**Ayrıntılı mimari, tasarım kararları ve genişletme rehberi:
Sistem Kılavuzu**

Örnek kodlar: Çılgın Yazılım Kod Kütüphanesi

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. Composer paketi olarak da 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; iş mantığı olayları dinleyen modüllerde durur.

Laravel gibi bir framework yerine neden bu şablonu kullanayım?

Tam bir framework çoğu proje için doğru seçimdir. Bu şablon üç durum için yazıldı: SSH'siz paylaşımlı hosting (tarayıcıdan kurulur, migration'lar panelden çalışır), bağımlılık güncellemesiyle uğraşmamak (vendor/ klasörü yok) ve kodu baştan sona okuyabilmek (saf PHP, küçük ve açıklamalı çekirdek). Bedeli hazır paket ekosisteminin olmamasıdır; ihtiyacınızı kendiniz yazarsınız.

Kurulum için komut satırı gerekiyor mu?

Hayır. Tarayıcıda kurulum/ adresini açmanız yeterli. Sihirbaz iki ekranda veritabanını sınar, .env dosyasını yazar, tabloları kurar, migration'ları çalıştırır ve yönetici hesabınızı açar; bitiş ekranı her adımı ✓ ile raporlar. Son olarak panelden "Kurulum klasörünü sil" düğmesine basarsınız.

Kurulum sihirbazını başkası yeniden çalıştırabilir mi?

Hayır. Kurulum bitince .env ve storage/installed.lock yazılır; bu dosyalardan biri varken sihirbaz hiçbir adımı çalıştırmaz, veritabanı erişilemese bile. Yeniden kurmak için ikisini de sunucudan elle silmeniz gerekir. Canlı sunucuda sihirbaz ayrıca storage/kurulum-anahtari.txt dosyasındaki anahtarı sorar; sunucuya dosya yükleyebilen kişi siz olduğunuz için kurulumu başkası yapamaz.

Mobil uygulamamı bu şablona bağlayabilir miyim?

Evet. Uygulama POST api/v1/oturum ucuna kullanıcı adı, parola ve cihaz adını gönderir, karşılığında bir token alır; sonraki isteklerde bunu Bearer anahtarı olarak kullanır. Token 30 gün geçerlidir, giriş panel girişiyle aynı kaba kuvvet korumasından geçer. Kullanıcı açık cihazlarını Hesabım → Bağlı cihazlar ekranında görüp tek tek kapatabilir. Akış ve örnekler depodaki docs/MOBIL-API.md rehberindedir.

Composer ya da npm gerekiyor mu?

Hayır. Composer yok, framework yok, CDN yok; tüm varlıklar proje içindedir ve 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.

Örnek veriyi yüklemeli miyim, sonra nasıl kaldırırım?

Şablonu ilk kez deniyorsanız evet: "Örnek veriyle kur" 6 demo hesap, örnek sayfalar, mesajlar, e-posta kayıtları ve Örnek Modül kayıtları kurar; listeler ve roller dolu görünür. Gerçek bir projeye başlıyorsanız kapatın. Kurduysanız Panel → Sistem → "Örnek veriyi kaldır" tek tıkla temizler; size ait etkin bir yönetici yokken bu düğme bilerek çalışmaz.

SSH erişimim yok, güncellemeleri nasıl uygularım?

Yeni sürümün dosyalarını yükledikten sonra Panel → Sistem Bilgisi'ndeki düğmeyle bekleyen migration'ları çalıştırın; panel her sayfada bekleyen migration olduğunu hatırlatır. Şablonla gelen migration'lar "temel parti" olarak işaretlenir, bu yüzden geri alma komutları yalnızca sizin eklediğiniz migration'ları etkiler.

XAMPP olmadan deneyebilir miyim?

Evet. Bilgisayarınızda PHP yüklüyse proje klasöründe php cy serve yazın ve http://127.0.0.1:8000/kurulum/ adresini açın. Bu yerleşik sunucu yalnızca geliştirme içindir.

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; adresler tek merkezden üretildiği için uygulama kodunda değişiklik gerekmez.

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

Orta

uygulama-iskeleti/php-multi-language-i18n

Çoklu Dil (i18n) Sistemi

  • PHP 8
  • PDO
  • MySQL
  • Bootstrap 5
  • +2

156 inceleme 56 canlı açılış

Tüm kod örnekleri