Bu günlüğün ilk yazısı olacak sanırım. Bu nedenle biraz heyecanlıyım. Yeni günlüğümün ilk yazısı ne olsun diye düşündüm ve ilerleyen yazılarda çokça adından bahsedeceğim Composer ile ilgili bir yazı yazmak çok mantıklı geldi.
PHP ile bir proje üzerinde çalışırken geliştiriciler üçüncü parti bir çok kütüphaneden faydalanır. Fakat proje ne kadar karmaşık veya büyük olursa bu üçüncü parti uygulamaları yüklemek, güncellemek veya takip etmekte o kadar karmaşık bir hal alabiliyor. Bu durumu idare edebilmek ve vakitten tasarruf etmek için Composer kullanıyoruz. Unutmayın vakit nakit demektir.
Lafı fazla dolandırmadan Composer ve Autoload nedir ve nasıl kullanılır açıklamaya çalışayım.
Composer Nedir?
Composer için şu tanım yapılabilir; PHP’de bağımlılık yöneticisi. Aslında dependency manager fakat doğrudan Türkçeye çevirdiğimizde bağımlılık yöneticisi ortaya çıkıyor. Bense PHP projelerinizdeki üçüncü parti kütüphane yöneticisi demeyi tercih ediyorum. En güzel ifade edilişi de bu bence.
Kütüphane Yönetiminde Yaşanan Sıkıntılar
PHP projelerde çalışırken Composer kullanmıyorsanız üçüncü parti kütüphaneleri idare ederken bir çok problemle karşılaşma durumunuz var.
İlk olarak, harici kütüphaneleri kullanmak için onları indirip, PHP projenizde bir dizine taşımanız gerekmektedir. Fakat karmaşık bir sistemde bu işlem karmaşık olabilir veya daha sonra neyi nereye taşıdığınızı unutabilirsiniz.
Bunun dışında, bir çok kütüphane başka kütüphanelere bağlı olarak geliştirilmiştir. Bu kütüphaneleri güncellemek içinde zaman ve efor harcamanız gerekecektir çünkü orijinal kütüphaneyi bulmak için arayış içine giriyorsunuz. Örneğin, A kütüphanesinin çalışması için B kütüphanesini indirmeniz gerekiyor, ikisindeki güncelleştirmeleri takip etmek için her seferinde tek tek arayıp güncellemek demek ki, onlarca kütüphaneniz varken bu durum sebep olacağı zaman ve efor gerçekten sinir bozucu olabiliyor.
Şimdi, çok şükür Composer var ki yukarıda bahsettiğim durumların hiç birini yaşamıyoruz.
Composer’ın Faydaları
Composer geliştiricilere çok önemli iki ana fayda sağlamaktadır:
- Geliştiricilerin harici kütüphanelerini, bu kütüphanelerin sürümlerini ve bunların bağlı olduğu kütüphaneleri
composer.json
dosyası ile çok rahatlıkla yönetmelerine yardımcı oluyor. - PHP projeniz için gerekli olan kütüphaneleri otomatik olarak arayıp yeni sürümlerine güncelleyebiliyor.
Composer Kurulumu
Composer kurulumu için aşağıdaki adımları takip edin:
PHP kurulumunu kontrol edin
İlk olarak PHP’nin kurulu olması gerekiyor. PHP kurulumunu kontrol etmek için terminal
ekranında aşağıdaki komutu yazın:
php -v
Windows’da Composer Kurulumu
Windows’da Composer kurulumu çok basit ve hızlıdır. Tek yapmanız gereken Composer-Setup.exe dosyasını indirmek ve sonra çalıştırmaktadır.
Composer, PATH
ayarlarınızı kurulumu yaparken otomatik olarak yapacaktır. Bu sayede terminal ekranlarından composer
komutunu rahatlıkla kullanabileceksiniz. Fakat, composer
komutunu kullandığınızda hata alıyorsanız C:\ProgramData\ComposerSetup\bin
değerini PATH
olarak elle eklemeniz gerekecektir.
Not: Açık terminalleriniz varsa onları kapatın, kurulum tamamlandıktan sonra tekrar açın. PATH
değerleri terminal ilk başlatıldığı anda alınır.
Çevre değişkenleri ile ilgili daha detaylı bilgi için Wikipedia makalesini okuyabilirsiniz veya Google’da araştırma yapabilirsiniz.
CentOS/RHEL/Ubuntu’da Composer Kurulumu
Composer’ı kurmak için terminali
açın ve aşağıdaki komutu yazın:
sudo curl -sS https://getcomposer.org/installer | php
Hala terminal
açıkken aşağıdaki komutu yazın, bu sayede composer
komutunu her yerde kullanabileceksiniz:
mv composer.phar /usr/local/bin/composer
Genel Komutlar
Composer ile çalışırken aşağıdaki komutlara ihtiyaç duyacaksınız:
- Composer’ın mevcut versiyonunu kontrol et:
composer -v
- Composer’ı son sürüme güncelle:
composer -selfupdate
- Composer ön belleğini temizle (Composer’ı kütüphaneleri yeniden ön belleğe almaya zorlar)
composer -selfupdate
- Kütüphane paketlerini arama:
composer search kutuphane_adi
PHP Projelerinizde Composer Kullanımı
Yeni PHP Projenizde Composer Kurulumu
İlk olarak yapmanız gereken şey composer.json
dosyasını oluşturmanızdır. Bu dosya projenizle ilgili Composer’ın bilmesi gerekenleri saklar. Bu dosyayı terminal
ekranından da oluşturabilirsiniz. Tek yapmanız gereken proje dizininde aşağıdaki komutu çalıştırmak:
composer init
Daha sonra composer.json dosyasını aşağıdaki gibi deklare etmeniz gerekmektedir:
Package name (/) [admin/my_project]: oralunal/ilkprojem (/*Bu kütüphane adınız*/) Description []: PHP'de Composer Kullanımı Author [elightup , n to skip]: oralunal Minimum Stability []: dev Package Type (e.g. library, project, metapackage, composer-plugin) []: License []: Define your dependencies. Would you like to define your dependencies (require) interactively [yes]? no Would you like to define your dev dependencies (require-dev) interactively [yes]? No Do you confirm generation [yes]? Y
Tamam! composer.json
dosyamız aşağıdaki içerikle beraber oluşturuldu:
{ "name": "oralunal/ilkprojem", "description": "PHP'de Composer Kullanımı", "authors": [ { "name": "oralunal", "email": "oralunal@gmail.com" } ], "minimum-stability": "dev", "require": { } }
Artık Composer ayarlarımız (kütüphane ayarlarımız dahil) composer.json
dosyasında saklı tutulacak.
PHP Projelerine Composer ile Kütüphaneleri Entegre Etme
İlk olarak burada arayarak PHP projenizin ihtiyaç duyduğu kütüphaneleri bulmanız gerekiyor. PHP projenizde kullanım ihtiyacı duyduğunuz kütüphaneleri bulduktan sonra bunları iki farklı yöntemle PHP projenize entegre edebilirsiniz:
Yöntem 1: terminal
Aracılığıyla
Bir nedenle, phpro/grumphp
kütüphanesinin son sürümünü kullanmak istiyorum (kod kalitesini kontrol etmek amacıyla kullanılan bir kütüphanedir). Bu nedenle, terminal
ekranına aşağıdaki komutu yazıyorum:
composer require phpro/grumphp
Bu komut ile Composer’a phpro/grumphp
kütüphanesini kurmasını söylüyoruz. Bu kütüphane PHP projemizde yeni oluşturulmuş olan vendor
dizinine kuruldu.
Ayrıca, vendor/autoload.php
dosyası otomatik olarak oluşturuldu. Bu dosya kurduğumuz kütüphaneleri otomatik olarak projemize yüklemimizi sağlayacaktır.
composer.json
dosyamıza geri gidip bakalım, aşağıdaki kodun eklendiğini fark edeceksiniz:
"require": { "phpro/grumphp": "^1.12.0" }
Sürüm belirtmeden kurduğumuz için sizde daha yüksek sürüm yazabilir.
Yukarıda gördüğünüz yeni JSON verisinin açıklaması:
phpro/grumphp
PHP projemiz için kullandığımız kütüphanedir.1.12.0
kütüphanenin güncel sürümüdür.
Artık PHP projenizi paylaşmak için veya taşımak için komple vendor
dizinini kopyalamak yerine sadece composer.json
dosyasını kopyalayabilirsiniz. Hedef sunucuya, bilgisayara vs. composer.json
dosyasını taşıdığınız vendor
klasörü otomatik olarak gelecektir.
Yöntem 2: composer.json
Dosyasına Komut Ekleyerek
Yöntem 1’de anlattığım terminal
ekranında komut girmek yerine, composer.js
on dosyasında require
bölümüne aşağıdaki gibi içerik ekleyerek de harici kütüphaneleri ekleyebilirsiniz:
"kutuphane-adi":"^versiyonu"
Örneğin, phpro/grumphp
kütüphanesinin 1.0.0 versiyonunu projeme entegre etmek istiyorum. require
kısmını aşağıdaki gibi güncelliyorum:
"require": { "phpro/grumphp": "^1.0.0" }
Bu güncelleştirmeyi/eklemeyi yaptıktan sonra terminalden composer update
komutunu çalıştırmak yeterlidir. Bu komut ile vendor klasörümüz composer.json dosyamızdaki sürümlerle uygun olacak şekilde oluşturulur veya güncellenir.
Bu yöntemin sağladığı en büyük avantaj çok fazla kütüphaneyi tek komutla indirmenizi/güncelleştirmenizi sağlar.
Bu indirdiğiniz üçüncü parti kütüphaneleri PHP projenizin index.php
sayfasına include "vendor/autoload.php";
kodu ile rahatlıkla ekleyebilirsiniz.
PHP Projenizden Bir Kütüphaneyi Kaldırma
Daha önce composer kullanarak indirmiş olduğumuz kütüphaneleri (vendor dizinin içinde) kaldırmak için aşağıdaki yöntemleri uygulayabilirsiniz:
Yöntem 1: composer
Komutunu Kullanarak
terminal ekranında aşağıdaki komutu girin:
composer remove vendor/package
Bu komutta vendor/package
sizin kaldırmak istediğiniz kütüphanenin adıdır. Örneğin ben phpro/grumphp
kütüphanesini kaldırmak istiyorum, bunun için aşağıdaki komutu kullanıyorum:
composer remove phpro/grumphp
Yöntem 2: composer.json
Dosyasını Güncelleyerek
composer.json
dosyasını tekrar açın ve kaldırmak istediğiniz kütüphanenin adını require
kısmından kaldırın. Ardından composer update
komutunu çalıştırarak işlemi sonlandırın.
Composer Kullanarak Kütüphanelerin Versiyonlarını Belirleme
Bazı sebeplerden dolayı herhangi bir kütüphanenin son sürümünü kullanmamanız gerekebilir. Bu gibi durumlarda Composer üzerinde versiyonları aşağıdaki 6 farklı şekilde tanımlayabiliriz.
Versiyon Aralığı
Bu yöntem >
, <
, >=
, <=
, !=
, AND
, OR
gibi karşılaştırma operatörlerini kullanarak versiyonu tanımlar. AND
operatörü yerine boşluk veya virgül kullanılabilir. Ayrıca OR
operatörü de iki dikey çizgi (||
) ile ifade edilebilir.
Örnek vermek gerekirse phpro/grumphp
kütüphanesi için 1.0.0 sürümünden yüksek sürümlere izin veriyoruz fakat 1.1.0 sürümüne izin vermiyoruz. Bu senaryo için şu şekilde bir komut kullanıyoruz:
composer require phpro/grumphp ">1.0.0,!=1.1.0"
Açıklaması:
phpro/grumphp
: kütüphanemizin adı>1.0.0
: Composer sadece 1.0.0 sürümünden yüksek sürümleri kurmaya yetkili!=1.1.0
: Composer 1.1.0 sürümü hariç bütün sürümleri kurmaya yetkili,
:AND
operatörü
Wilcard Versiyonlar
Bu yöntem ile Composer sadece x.x.*
aralığındaki versiyonları kurabilir.
Örneğin, composer require phpro/grumphp "0.18.*"
komutunu kullanırsam, Composer phpro/grumphp
kütüphanesinin 0.18.0 sürümünden yüksek fakat 0.19.0 sürümünden düşük sürümleri kurabilecek. 0.18.1, 0.18.2 gibi.. Versiyon aralığı yöntemiyle de şu şekilde tanımlayabilirdik: ">=0.18.0,<0.19"
Tire Aralığı
Bu yöntem aralığı belirlemek için -
operatörünü kullanır. Daha iyi anlamak için aşağıdaki örneği inceleyin.
Composer’ın 0.10 sürümünden sonraki versiyonları indirebilmesini ayrıca 0.19 sürümünün de altında kalmasını istiyorum. Komutumuz da şu şekilde: composer require phpro/grumphp "0.1 - 0.18"
. Versiyon aralığı yöntemi ile de şöyle ifade edebiliriz: ">=0.10, <0.19"
.
Tilda Aralığı
Bu yöntem aralığı belirlemek için ~
operatörünü kullanır. Örneğini "~0.18"
girerseniz, Composer 0.18.0’dan büyük ama 1.0.0’dan küçük sürümlerle sınırlı kalacaktır. Bunu versiyon aralığı yönteminde şu şekilde ifade edebiliriz: ">0.18, <1.0"
.
Şapka Aralığı
Bu yöntem ^
operatörünü kullanır ve yanında yazılan versiyondan sonraki bütün versiyonları kapsar (kendisi hariç).
Örneğin, ^0.18.1
girersem Composer 0.18.1’den sonraki bütün versiyonları kurar (0.18.1
hariç).
Dev-Master
Dev-Master yöntemiyle kütüphaneleriniz her zaman en güncel halde olur. Fakat, kütüphanelerin son güncel halleri daha tam anlamıyla tamamlanmamış olabileceğinden çok da sağlık bir yöntem sayılmaz. Farkında olmadığınız açıklarla PHP projenizde istenmeyen durumların yaşanmasına sebep olabilir.
Composer’ın phpro/grumphp
kütüphanesini her zaman en güncel ve son sürümde tutmak için şu komutu kullanmanız yeterlidir: composer require phpro/grumphp "dev-master"
.
Autoload
Autoload Nedir?
Autload, sınıfların yükleme ve kullanma yöntemidir. Autoload kullanarak PHP dosyasının en üstünde bütün sınıf dosyalarını tek tek eklemek yerine tek satırda istediğimiz yerde kullanabileceğimiz sınıfları yükleyebiliriz.
Yukarıda bahsettiğim gibi Composer, kütüphane yönetimini kolay ve hızlı hale getiriyor. Ayrıca, Autoload, Composer’ın kütüphanelerin farklı kütüphanelere olan bağımlılıklarını kolayca yönetmesine yardımcı olan çok kullanışlı bir araçtır.
Autoload Nasıl Çalışıyor?
Autload çalışmasını anlamak için öncelikle PSR-4 standardı hakkında bilgi sahibi olmanız gerekmektedir. Bu kütüphaneler için önerilen kodlama standardıdır.
Aşağıda PSR-4 ile ilgili biraz açıklama bulabilirsiniz:
Klasörlerdeki kodlar, uygun şekilde düzenlenmelidir. Bunu yapmak için geliştiricilerin aşağıdaki yapıya göre sınıflar oluşturması gerekir:
\<NamespaceAdi>(\<AltNamespaceAdlari>)*\<SinifAdi>
Geliştiriciler yukarıdaki yapıya göre bir sınıf oluşturursa, sınıfa şu üç bileşen ile erişilebilir: NameSpace
, SubNameSpaces
ve SinifAdi
.
Açıklaması:
NameSpace
: Bu dağıtıcının adıdır aslında, başka dağıtıcıların ismiyle karışmayacak bir isim olmasına özen gösterilmesi gerekir.SubNameSpaces
: Buna alt dizin diyebiliriz. Kullanılacak sınıfın dizininiSubNameSpaces
olarak adlandırabiliriz. Çok kabaca açıklıyorum, kusura bakmayın fakat basit bir örnek ile ne demek istediğimi çok rahat anlayacaksınız. Hazırladığınız kütüphanenizilibs
isimli bir klasöre kaydettiniz. Ardından sınıflarınız içinden\dagitici\namespace1\namespace2\cls1
ilecls1
sınıfınızı tanımladınız. Bu şu anlama geliyor, src klasörünün içindenamespace1
klasörü var venamespace1
klasörünün içinde denamespace2
klasörü var.SinifAdi
: Bu oluşturulan sınıfın adıdır. Gereklidir. Son namespace isimli klasörün içindeSinifAdi
şeklinde dosya adına sahip olması gerekir (SinifAdı.php
).
Yukarıdaki yapıya ihtiyaç duyulduğunda bütün PHP projeleri Autoload kütüphanesi kullanmalıdır. Aynı Autoload mekanizmasını kullanan frameworkler arasında kütüphaneler paylaşılabilir. Günümüzde, bütün popüler frameworkler PSR-4’e göre Autload mekanizması kullanmaktadırlar.
Composer’da aslında bunu yapmaktadır. İndirilen PSR-4 uyumlu kütüphaneleri otomatik olarak yükler.
Örneğin Okul\Sinav
namespace ine sahip Sonuclar
isimli bir sınıf oluşturmak istiyorum. libs/Sinav/Sonuclar.php
isimli bir dosya oluşturup içeriğini aşağıdaki gibi yapıyorum:
<?php namespace Okul\Sinav; class Sonuclar { function sinavSonuclari() { // kod // kod // daha çok kod } }
Oluşturduğumuz dosya adı ve dizin isimleriyle beraber yukarıdaki kodumuz PSR-4 uyumlu oldu. Vakit, Composer’a vendor/autoload.php
ile bizim sınıfımızı da entegre etmesi gerektiğini söyleme vaktidir. composer.json
dosyasına aşağıdaki gibi bir ilave yapıyoruz:
{ "autoload": { "psr-4": { "Okul\\": "libs/" } } }
Okul
‘un da libs
klasörüne işaret ettiğini aslında burada tanımlıyoruz. Geriye bir tek terminal
ekranından aşağıdaki komutu çalıştırmak kalıyor:
composer dump-autoload
Artık, vendor/autload.php
sizin sınıfınızı da ihtiyaç duyduğunuzda yükleyecek. Aşağıdaki şekillerde Sonuclar
sınıfınızı kullanabilirsiniz:
İlk kod:
<?php $snf = new Okul\Sinav\Sonuclar();
İkinci kod:
<?php use Okul\Sinav $snf = new Sonuclar();
Yukarıdaki iki kod aynıdır, sadece syntaxleri farklıdır. Dilediğinizi kullanabilirsiniz.
PSR-4 üzerine belki farklı bir yazı da gelebilir.
Son Kelamlar
Sonuç olarak Autoload ve Compser PHP için olmazsa olmaz araç haline gelmişlerdir. Ayrıca zamandan ve harcanan iş gücünden tasarruf etmenizi sağlayacak veli nimetlerdir. Umarım bu yazı faydalı olmuştur veya olur. Sağlıcakla kalın.
Bu konuda çok fazla kaynak bulamadım, emeğinize sağlık