# Tek başına da çalışan, birlikte de çalışan PHP paketleri

> Framework'e bağlanmadan çalışan modüler PHP kütüphaneleri; 39 paketlik InitPHP ekosistemine ve Framework3'e dönüştü.

- Şu an ne yapıyor: 39 paketlik bir PHP kütüphane ailesi: Router, Database, Cache, Mailer, Socket ve diğerleri hem tek başına hem birlikte çalışıyor, hepsi Composer/Packagist üzerinden MIT lisansıyla dağıtılıyor. Framework'e bağlanmadan parça kullanmak isteyen PHP geliştiricisi bugün kurabilir.
- Tür: Açık kaynak
- Durum: Ürün oldu
- Odak: Geliştirici araçları & CI
- Başlangıç: 2021-01-01
- Labs’tan çıkış: 2022-08-12
- Teknolojiler: PHP, Composer, PHPUnit
- Etiketler: #php, #kutuphane, #acik-kaynak
- Kaynak kodu: https://github.com/InitPHP
- Web sitesi: https://initphp.org
- Bu iş ürüne dönüştü: InitPHP (https://www.muhammetsafak.com.tr/portfolyo/initphp/)
- Kaynak: https://www.muhammetsafak.com.tr/labs/initphp-lab/
- Dil: tr-TR
- Yazar: Muhammet Şafak

---
Bir PHP paketi ya bir çatının parçasıdır ya da tek başına duran bir araç. İkisini
birden isteyince ortak bir çekirdek paket yazmak ilk akla gelen çözüm — ve yanlış
olan da o.

## Tek başına mı, aile mi

Denenen şey şuydu: Router, Database, Cache, Mailer, Socket gibi parçalar hem
tek başına kurulduğunda anlamlı çalışsın, hem aynı ailedeki diğer paketlerle
birleştiğinde bir çatı oluştursun. Parçalar ayrı ayrı yazıldı ve her biri
kendi başına bir soruya cevap verdi.

## 39 paket ve üstündeki çatı

39 bağımsız paket ve bunların üzerine oturan minimalist bir MVC çatısı
(Framework3). Ortak zemin tip güvenliği ve PHPUnit testleri; dağıtım
Composer/Packagist üzerinden, lisans MIT.

## Ortak çekirdek yerine PSR

"Hem tek başına hem birlikte" isteği tek bir noktada çatışıyor: paketler
birbirini tanımak zorundaysa aralarında bir bağımlılık var demektir ve o
bağımlılık tek başına kurulumu bozar.

İlk akla gelen çözüm ortak bir çekirdek paket yazmaktı — `initphp/core` gibi
bir şey, arayüzleri ve ortak yardımcıları taşısın. O yol iki şeyi birden
getirirdi: her paket bir bağımlılık daha kazanırdı ve ailenin dışındaki hiçbir
kütüphane bu çekirdeği tanımayacağı için aile kendi içine kapanırdı.

Seçilen zemin PHP-FIG standartları oldu. Logger PSR-3, Container PSR-11
uyguluyor; paketler birbirini değil, ortak bir arayüz sözleşmesini tanıyor.
Bunun karşılığı şu: InitPHP Container'ı InitPHP Logger'ı kabul ediyor ama
Monolog'u da kabul ediyor ve InitPHP Logger başka birinin PSR-11 container'ına
da takılıyor. Çelişkiyi çözen şey ailenin kendi çekirdeği değil, ailenin
dışında zaten var olan bir sözleşmeydi.

## Tek kütüphane yerine otuz dokuz paket

Ailenin ikinci kararı paketlemede. Otuz dokuz ayrı depo, otuz dokuz sürüm
hattı ve otuz dokuz Packagist kaydı yerine tek bir `initphp/initphp` paketi
yazmak bakımı belirgin biçimde ucuzlatırdı.

Bedeli kullanıcıya yazılırdı. Yalnız bir Router isteyen proje, Socket sunucusunu,
Mailer'ı ve Queue'yu da kurmak zorunda kalırdı; her sürüm yükseltmesi
kullanmadığı on paketin değişikliğini de taşırdı. Ayrılmanın karşılığı şu:
`composer require initphp/router` yalnız Router'ı getiriyor, Socket
kütüphanesinin TCP/TLS/UDP/SSL yüzeyini hiç görmüyorsunuz.

Sürdürülebilirliği ayakta tutan şey de bu yüzden ortak kod değil, ortak
disiplin: her pakette aynı tip güvenliği seviyesi, aynı PHPUnit alışkanlığı ve
aynı PSR uyumu. Aile bir arada duruyor; aynı bağımlılığı paylaştığı için değil, aynı
kurallarla yazıldığı için.

## Ekosisteme giden yol

Koleksiyon dağınık paketler olmaktan çıkıp bakımı süren bir açık kaynak
ekosistemine döndü. Ayrıntısı portfolyoda.
