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
- 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?
- Projeyi ZIP olarak indirin ya da git clone https://github.com/CilginYazilim/cy-php-starter ile klonlayın
- Klasörü web sunucunuzun klasörüne koyun (XAMPP'te htdocs/); site adresi klasör adına göre oluşur
- Tarayıcıda http://siteniz/kurulum/ adresini açın; canlı sunucuda sihirbaz storage/kurulum-anahtari.txt dosyasındaki anahtarı ister
- ekranda veritabanı bilgilerini yazıp "Bağlantıyı dene"ye basın; veritabanı yoksa sihirbaz oluşturur (kullanıcının yetkisi varsa)
- ekranda site adını, yönetici hesabını ve seçenekleri (örnek veri, demo modu, açılacak modüller) girip "Kur"a basın
- Bitiş ekranından panele girin ve "Kurulum klasörünü sil" düğmesine basın
- 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 Starter | Tam framework |
|---|---|---|
| SSH'siz paylaşımlı hosting | Tarayıcıdan kurulur, migration'lar panelden çalışır | Çoğunlukla Composer ve komut satırı ister |
| Bağımlılık güncellemesi | Yok — vendor/ klasörü yok | Düzenli composer update |
| Kodu baştan sona okuyabilmek | Saf PHP, küçük ve açıklamalı çekirdek | Framework'ün kendi kavram katmanı |
| Hazır paket ekosistemi | Yok — 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ı |
| Kimlik | Giriş/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 |
| KVKK | Kayı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ö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 · kilitlenmeye dayanıklı |
| Zamanlayıcı | Tek cron satırı · üst üste binme koruması |
| E-posta | SMTP / 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 API | Standart 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 uygulama | Kullanıcı adı/parolayla giriş → token · çıkış · açık cihazlar ve tek tek kapatma · örnek dosya listesi/indirme · rehber |
| Modüller | Panelden 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 modu | Herkese 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 veri | Tek 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 |
| 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ü · 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 sayfa | Bü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 |
| SEO | Temiz adresler · canonical · Open Graph · JSON-LD (Organization, WebSite, SoftwareApplication, WebPage, BreadcrumbList) · 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 · tablolar telefonda karta döner · 44px dokunma hedefleri · yapışkan menü · iOS yakınlaştırma ve çentik payı çözülmüş |
| Konsol | php cy — 24 komut, üreteçler ve XAMPP'siz geliştirme sunucusu (php cy serve) dahil |
| Testler | 339 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.
| Rol | Kullanıcı adı | Ne görür, ne yapar |
|---|---|---|
| Yönetici | ali.yonetici | Her ekran. Demo modunda parola, kullanıcı, ayar ve e-posta işlemleri kilitli |
| Editör | elif.editor | Sayfaları yazar, mesajları yanıtlar, Örnek Modül'de onay bekleyenleri yayınlar |
| Üye | mehmet.uye | Kendi profili ve Örnek Modül'de kendi kayıtları (yazar, onaya gönderir) |
| Pasif üye | ayse.pasif | Giriş yapamaz — durum denetimini gösterir |
| Askıdaki üye | can.askida | Giriş yapamaz |
| Onay bekleyen | zeynep.onay | E-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şlem | Yönetici | Editör | Üye | Ziyaretçi |
|---|---|---|---|---|
| Kontrol paneli, Hesabım, Örnek Modül | ✅ | ✅ | ✅ | girişe yönlenir |
| Mesajlar, E-posta geçmişi, Sayfalar | ✅ | ✅ | ❌ 403 | girişe yönlenir |
| Kullanıcılar, Ayarlar, Sistem | ✅ | ❌ 403 | ❌ 403 | girişe yönlenir |
| API anahtarı üretmek | ✅ | ✅ | ❌ | — |
GET /api/v1/ben, mobil oturum | ✅ | ✅ | ✅ | 401 |
GET /api/v1/kullanicilar | ✅ | ❌ 403 | ❌ 403 | 401 |
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:rollbackvemigrate:freshyalnızca
SİZİN eklediğiniz ve modüllerden gelen migration'ları etkiler.
php cy migrate:statusbunları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ç | Koruma | Açıklama |
|---|---|---|
POST api/v1/oturum | anahtarsız (kaba kuvvet korumalı) | Mobil giriş: kullanici, parola, cihaz → token |
DELETE api/v1/oturum | anahtar | Bu cihazdan çıkış |
GET api/v1/oturumlar · DELETE api/v1/oturumlar/{id} | anahtar | Açık cihazlar; başka cihazı kapatma |
GET api/v1/ben | anahtar | Giriş 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.view | Sayfalanmış kullanıcı listesi |
GET api/v1/sayfalar | anahtarsı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/oturumGiriş, 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
503dö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ı üretirunit.php 339 testi veritabanı olmadan çalıştırır; aralarında **rolmatrisi** (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.phpsiteyi değiştirmez: kurulum kilidi, gizli dosyalar (
.env, .git/), açıkyö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 migratePanelde
/panel/stok hazır: listeleme, ekleme, silme. Modül kendirotaları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).
| Rol | Görür | Yapar |
|---|---|---|
| Yönetici | Her kaydı | Her kaydı düzenler, siler, yayınlar |
| Editör | Yayındakileri, onay bekleyenleri, kendi kayıtlarını | Onaylar ve yayınlar; yalnızca kendi kaydını düzenler |
| Üye | Yayı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:
| Kaynak | Bağ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 örnek | Canlı demo |
| Mimari ve genişletme rehberi | Sistem 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 kod | GitHub 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ü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; 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 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
Ş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 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 |
| 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ği | Diğ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" çerezi | Jeton her kullanımda KOŞULLU döndürülür; eski jeton ve parola değişiminden sonraki jeton çalışmaz |
| Kaba kuvvet | Deneme 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ı tespiti | Var 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çirme | Sihirbaz .env / kilit dosyası varken hiçbir adımı çalıştırmaz |
| Path traversal | Segment bazlı doğrulama + realpath(); görünüm adları beyaz listeden |
| Kötücül yükleme | Gerçek MIME + beyaz/kara liste + rastgele ad + GD yeniden üretimi + piksel/bellek sınırı |
| Spam rölesi | Otomatik 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 demo | Demo 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ırlama | Tek 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örsel | Sayfa içeriğindeki görsel yalnızca kendi alan adınızdan (ya da CSP_IMG_SRC) gelebilir |
| Yetki gerilemesi | Rol 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=falseve ö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/veupload/yazılabilir - [ ]
php cy mail:testbaş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..htaccessCSS, JS, JSON ve SVG'yi
sıkıştırır; sürümlü dosyalara (?v=…) bir yıllıkimmutableönbellek
verir. Bunun için sunucudamod_deflate,mod_filtervemod_headers
açık olmalıdır (mod_expiresvarsa sürümsüz görseller de önbelleğe
girer). Paylaşımlı hostinglerin çoğunda açıktır. XAMPP'ta
apache/conf/httpd.confiçindemod_deflate,mod_filterve
mod_expiressatı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'taAPP_DEBUG=truebilinç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 bittiysekurulumklasö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 KendiModulunArdı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ğinizdenumara kendiliğinden gelir; veritabanında ayrıca tutulmaz.
Sürüm geçmişi
| Sürüm | Tarih | Öne çıkanlar |
|---|---|---|
| 1.6.2 | 2026-10-07 | ZIP'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.1 | 2026-10-07 | Form 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.0 | 2026-10-07 | Parola 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.1 | 2026-10-07 | Veritabanı performansı: sık çalışan sorgular için eksik indeksler; giriş denemeleri temizliğinin kilitlenmesi giderildi |
| 1.5.0 | 2026-10-07 | Demo 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.0 | 2026-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.0 | 2026-10-06 | Kapsamlı 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.1 | 2026-09-05 | Takma ad (vitrin) adresinden servis edilen kurulumda 404 ve yönlendirme döngüsü düzeltildi |
| 1.2.0 | 2026-09-04 | 12 ekran görüntüsü ve Canlı Demo bölümü |
| 1.1.0 | 2026-08-30 | Mobil düzen baştan elden geçirildi, sürüm numarası tek kaynağa indi |
| 1.0.0 | 2026-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)
- 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.
.htaccessdeğ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.
- 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)
- 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.
- 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.
- "Ö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)
- Yedek alın (veritabanı +
.env), kodu çekin. 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.
- 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.
- 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ıtOrnek modülü zaten açıksa yalnızca
php cy migrate yeterlidir (SSHyoksa Panel → Sistem Bilgisi'ndeki düğme).
Güncelleme (1.2.x ya da 1.3.x → 1.4.0)
- Yedek alın (veritabanı +
.env). - Kodu çekin.
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.
.envdosyanızı açın ve şunları kontrol edin (eski sihirbaz bu
satırları geliştirme değerleriyle yazıyordu):
APP_ENV=productionveAPP_DEBUG=falseolmalı (satırları SİLMEYİN,
değerlerini değiştirin).
APP_KEYboşsa doldurun:php -r "echo bin2hex(random_bytes(32));"SESSION_NAMEboş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_PROXIESyazın. - Eksik anahtarlar için
.env.example'a bakın.
php cy config:cachekullanı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
İ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.
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
Orta
uygulama-iskeleti/php-scheduler-cron
Zamanlanmış Görevler (Scheduler)
- PHP 8
- PDO
- MySQL
- Bootstrap 5
- +2
189 inceleme 57 canlı açılış
Orta
uygulama-iskeleti/php-multi-language-i18n
Çoklu Dil (i18n) Sistemi
- PHP 8
- PDO
- MySQL
- Bootstrap 5
- +2
156 inceleme 56 canlı açılış
İleri
uygulama-iskeleti/php-pwa-push-notification
PWA ve Web Push Bildirim Sistemi
- PHP 8
- PDO
- MySQL
- Bootstrap 5
- +2
152 inceleme 58 canlı açılış