Php dilinin gözde framework ‘ü Codeigniter ile projelerimizi nasıl daha performanslı hale getirebiliriz sorusunun cevabını bu yazımızda açıklayacağız.
Services Nedir?
CodeIgniter 4′teki Hizmetler, yeni sınıf örnekleri oluşturma ve paylaşma işlevselliği sağlar. Config\Services sınıfı olarak uygulanır.
CodeIgniter içindeki tüm çekirdek sınıflar “services” olarak sağlanır. Bu basitçe, yüklenecek bir sınıf adını sabit kodlamak yerine, çağrılacak sınıfların çok basit bir yapılandırma dosyası içinde tanımlandığı anlamına gelir. Bu dosya, gerekli sınıfın yeni örneklerini oluşturmak için bir tür fabrika görevi görür.
Servisler Neden Kullanılır?
Hızlı bir örnek muhtemelen işleri daha net hale getirecektir, bu nedenle Timer sınıfının bir örneğini çekmeniz gerektiğini hayal edin. En basit yöntem, o sınıfın yeni bir örneğini oluşturmak olacaktır:
<?php
$timer = new \CodeIgniter\Debug\Timer();
Ve bu harika çalışıyor. Onun yerine farklı bir zamanlayıcı sınıfı kullanmak istediğinize karar verene kadar. Belki bu, varsayılan zamanlayıcının sağlamadığı bazı gelişmiş raporlara sahiptir. Bunu yapmak için, şimdi uygulamanızda timer sınıfını kullandığınız tüm konumları bulmanız gerekiyor. Uygulamanızın sürekli çalışmasının bir performans günlüğünü tutmak için bunları yerinde bırakmış olabileceğiniz için, bu, bununla başa çıkmanın zaman alıcı ve hataya açık bir yolu olabilir. Servislerin işe yaradığı yer burasıdır.
Örneği kendimiz oluşturmak yerine, merkezi bir sınıfın bizim için sınıfın bir örneğini oluşturmasına izin verdik. Bu sınıf çok basit tutulur. Yalnızca hizmet olarak kullanmak istediğimiz her sınıf için bir yöntem içerir. Yöntem, tipik olarak, sahip olabileceği tüm bağımlılıkları ileterek, o sınıfın paylaşılan bir örneğini döndürür. Ardından, zamanlayıcı oluşturma kodumuzu bu yeni sınıfı çağıran kodla değiştiririz:
<?php
$timer = \Config\Services::timer();
Kullanılan uygulamayı değiştirmeniz gerektiğinde, servis yapılandırma dosyasını değiştirebilirsiniz ve değişiklik, herhangi bir şey yapmanıza gerek kalmadan uygulamanızın tamamında otomatik olarak gerçekleşir. Artık sadece herhangi bir yeni işlevden yararlanmanız gerekiyor ve hazırsınız. Çok basit ve hataya dayanıklı.
Servis Nasıl Çağırılır?
Servis olarak birçok CodeIgniter sınıfı sağlandığı için bunları aşağıdaki gibi alabilirsiniz:
<?php
$typography = \Config\Services::typography();
$typography, Typography sınıfının bir örneğidir ve \Config\Services::typography() öğesini yeniden çağırırsanız, tamamen aynı örneği alırsınız.
Hizmetler genellikle sınıfın paylaşılan bir örneğini döndürür. Aşağıdaki kod, ilk çağrıda bir CURLRequest örneği oluşturur. Ve ikinci çağrı tamamen aynı örneği döndürür.
<?php
$options1 = [
'baseURI' => 'http://example.com/api/v1/',
'timeout' => 3,
];
$client1 = \Config\Services::curlrequest($options1);
$options2 = [
'baseURI' => 'http://another.example.com/api/v2/',
'timeout' => 10,
];
$client2 = \Config\Services::curlrequest($options2);
// $options2 çalışmaz
// $client2 , $client1 instance ını döndürür.
Bu nedenle, $client2 için $options2 parametresi çalışmıyor. Sadece göz ardı edilir.
Yeni Instance Oluşturma
Tipografi sınıfının yeni bir örneğini almak istiyorsanız, $getShared argümanına false iletmeniz gerekir:
<?php
$typography = \Config\Services::typography(false);
İşinize Yarar Fonksiyonlar
Hizmet almak için iki işlev sağlanmıştır. Bu işlevler her zaman kullanılabilir.
service()
Birincisi, istenen hizmetin yeni bir örneğini döndüren service()‘dir. Gerekli olan tek parametre servis adıdır. Bu, Services dosyasındaki yöntem adıyla aynıdır, her zaman sınıfın SHARED örneğini döndürür, bu nedenle işlevi birden çok kez çağırmak her zaman aynı örneği döndürmelidir:
<?php
$logger = service('logger');
// 2 kod bloğu aynı anlama gelmektedir.
$logger = \Config\Services::logger();
Oluşturma yöntemi ek parametreler gerektiriyorsa, bunlar servis adından sonra iletilebilir:
<?php
$renderer = service('renderer', APPPATH . 'views/');
// 2 kod bloğu aynı anlama gelmektedir.
$renderer = \Config\Services::renderer(APPPATH . 'views/');
single_service()
İkinci işlev, single_service(), tıpkı service() gibi çalışır ancak sınıfın yeni bir örneğini döndürür:
<?php
$logger = single_service('logger');
// 2 kod bloğu aynı anlama gelmektedir.
$logger = \Config\Services::logger(false);
Servislerin Tanımlanması
Servislerin iyi çalışmasını sağlamak ve kullanmak için sabit bir API’ye veya arayüze sahip her sınıfa güvenebilmeniz gerekir. Hemen hemen tüm CodeIgniter sınıfları, bağlı oldukları bir arabirim sağlar. Core sınıfları genişletmek veya değiştirmek istediğinizde, yalnızca arayüzün gereksinimlerini karşıladığınızdan ve sınıfların uyumlu olduğunu bildiğinizden emin olmanız gerekir.
Örneğin, RouterCollection sınıfı, RouterCollectionInterface’i uygular. Rota oluşturmak için farklı bir yol sağlayan bir değiştirme oluşturmak istediğinizde, RouterCollectionInterface’i uygulayan yeni bir sınıf oluşturmanız yeterlidir:
<?php
namespace App\Router;
use CodeIgniter\Router\RouteCollectionInterface;
class MyRouter implements RouteCollectionInterface
{
// Implement required methods here.
}
Son olarak, CodeIgniter\Router\RouterCollection yerine yeni bir MyRouter örneği oluşturmak için app/Config/Services.php dosyasını değiştirin:
<?php
namespace Config;
use CodeIgniter\Config\BaseService;
class Services extends BaseService
{
public static function routes()
{
return new \App\Router\MyRouter();
}
// ...
}
Daha fazla bilgili için Codeigniter dökümantasyonunu ziyaret edin.