Bootstrap

Bootstrap, ortamı başlatan, bir bağımlılık enjeksiyonu (DI) konteyneri oluşturan ve uygulamayı başlatan önyükleme kodudur. Tartışacağız:

  • NEON dosyalarını kullanarak uygulamanızı nasıl yapılandırırsınız
  • üretim ve geliştirme modlarının nasıl ele alınacağı
  • DI konteyneri nasıl oluşturulur

İster web tabanlı ister komut satırı komut dosyaları olsun, uygulamalar bir tür ortam başlatma ile başlar. Eski zamanlarda, bundan sorumlu olan ve başlangıç dosyasına dahil edilen eg include.inc.php adlı bir dosya olabilirdi. Modern Nette uygulamalarında bunun yerini, uygulamanın bir parçası olarak app/Bootstrap.php adresinde bulunabilen Bootstrap sınıfı almıştır. Örneğin aşağıdaki gibi görünebilir:

use Nette\Bootstrap\Configurator;

class Bootstrap
{
	public static function boot(): Configurator
	{
		$appDir = dirname(__DIR__);
		$configurator = new Configurator;
		//$configurator->setDebugMode('secret@23.75.345.200');
		$configurator->enableTracy($appDir . '/log');
		$configurator->setTempDirectory($appDir . '/temp');
		$configurator->createRobotLoader()
			->addDirectory(__DIR__)
			->register();
		$configurator->addConfig($appDir . '/config/common.neon');
		return $configurator;
	}
}

index.php

Web uygulamaları söz konusu olduğunda, başlangıç dosyası index.php olup www/ genel dizininde bulunur. Ortamı başlatmak için Bootstrap sınıfına izin verir ve DI konteynerini oluşturan $configurator sınıfını döndürür. Daha sonra web uygulamasını çalıştıran Application hizmetini elde eder:

// ortamı başlat + Configurator nesnesini al
$configurator = App\Bootstrap::boot();
// bir DI konteyneri oluşturun
$container = $configurator->createContainer();
// DI container bir Nette\Application\Application nesnesi oluşturur
$application = $container->getByType(Nette\Application\Application::class);
// Nette uygulamasını başlat
$application->run();

Gördüğünüz gibi, şimdi daha ayrıntılı olarak tanıtacağımız Nette\Bootstrap\Configurator sınıfı, ortamın ayarlanmasına ve bir bağımlılık enjeksiyonu (DI) konteyneri oluşturulmasına yardımcı olur.

Geliştirme ve Üretim Modu

Nette, bir talebin yürütüldüğü iki temel mod arasında ayrım yapar: geliştirme ve üretim. Geliştirme modu programcının maksimum konforuna odaklanır, Tracy görüntülenir, şablonlar veya DI konteyner yapılandırması değiştirilirken önbellek otomatik olarak güncellenir, vb. Üretim modu performansa odaklanır, Tracy yalnızca hataları günlüğe kaydeder ve şablonların ve diğer dosyaların değişiklikleri kontrol edilmez.

Mod seçimi otomatik algılama ile yapılır, bu nedenle genellikle herhangi bir şeyi manuel olarak yapılandırmaya veya değiştirmeye gerek yoktur. Uygulama localhost üzerinde çalışıyorsa (yani IP adresi 127.0.0.1 veya ::1) ve proxy yoksa (yani HTTP başlığı) mod geliştirmedir. Aksi takdirde, üretim modunda çalışır.

Geliştirme modunu diğer durumlarda, örneğin belirli bir IP adresinden erişen programcılar için etkinleştirmek istiyorsanız, setDebugMode() adresini kullanabilirsiniz:

$configurator->setDebugMode('23.75.345.200'); // bir veya daha fazla IP adresi

Bir IP adresini bir çerezle birleştirmenizi kesinlikle öneririz. nette-debug çerezine gizli bir belirteç depolayacağız, örneğin secret1234 ve geliştirme modu, bu IP ve çerez kombinasyonuna sahip programcılar için etkinleştirilecektir.

$configurator->setDebugMode('secret1234@23.75.345.200');

Ayrıca localhost için bile geliştirici modunu tamamen kapatabiliriz:

$configurator->setDebugMode(false);

true değerinin, bir üretim sunucusunda asla gerçekleşmemesi gereken geliştirici modunu zorlayarak açtığını unutmayın.

Hata Ayıklama Aracı Tracy

Kolay hata ayıklama için harika araç Tracy'yi açacağız. Geliştirici modunda hataları görselleştirir ve üretim modunda hataları belirtilen dizine kaydeder:

$configurator->enableTracy($appDir . '/log');

Geçici Dosyalar

Nette, DI konteyneri, RobotLoader, şablonlar vb. için önbelleği kullanır. Bu nedenle, önbelleğin depolanacağı dizinin yolunu ayarlamak gerekir:

$configurator->setTempDirectory($appDir . '/temp');

Linux veya macOS üzerinde, log/ ve temp/ dizinleri için yazma izinlerini ayarlayın.

RobotLoader

Genellikle, RobotLoader'ı kullanarak sınıfları otomatik olarak yüklemek isteyeceğiz, bu yüzden onu başlatmalı ve Bootstrap.php 'un bulunduğu dizinden (yani __DIR__) ve tüm alt dizinlerinden sınıfları yüklemesine izin vermeliyiz:

$configurator->createRobotLoader()
	->addDirectory(__DIR__)
	->register();

Alternatif bir yol da sadece Composer PSR-4 otomatik yüklemeyi kullanmaktır.

Zaman Dilimi

Yapılandırıcı, uygulamanız için bir saat dilimi belirlemenize olanak tanır.

$configurator->setTimeZone('Europe/Prague');

DI Konteyner Yapılandırması

Önyükleme sürecinin bir parçası, tüm uygulamanın kalbi olan bir DI konteynerinin, yani nesneler için bir fabrikanın oluşturulmasıdır. Bu aslında Nette tarafından oluşturulan ve bir önbellek dizininde saklanan bir PHP sınıfıdır. Fabrika, temel uygulama nesnelerini üretir ve yapılandırma dosyaları, bunların nasıl oluşturulacağı ve yapılandırılacağı konusunda talimat verir ve böylece tüm uygulamanın davranışını etkileriz.

Konfigürasyon dosyaları genellikle NEON formatında yazılır. Nelerin yapılandırılabileceğini buradan okuy abilirsiniz.

Geliştirme modunda, kodu veya yapılandırma dosyalarını her değiştirdiğinizde kapsayıcı otomatik olarak güncellenir. Üretim modunda, yalnızca bir kez oluşturulur ve performansı en üst düzeye çıkarmak için dosya değişiklikleri kontrol edilmez.

Yapılandırma dosyaları addConfig() kullanılarak yüklenir:

$configurator->addConfig($appDir . '/config/common.neon');

Birden fazla dosya eklemek için addConfig() yöntemi birden fazla kez çağrılabilir.

$configurator->addConfig($appDir . '/config/common.neon');
$configurator->addConfig($appDir . '/config/services.neon');
if (PHP_SAPI === 'cli') {
	$configurator->addConfig($appDir . '/config/cli.php');
}

cli.php adı bir yazım hatası değildir, yapılandırma bir dizi olarak döndüren bir PHP dosyasına da yazılabilir.

Alternatif olarak, daha fazla yapılandırma dosyası yüklemek için includes bölümünü kullanabiliriz.

Aynı anahtarlara sahip öğeler yapılandırma dosyalarında görünürse, diziler söz konusu olduğunda bunların üzerine yazılır veya birleştirilir. Daha sonra dahil edilen dosyanın bir öncekinden daha yüksek önceliği vardır. includes bölümünün listelendiği dosya, içine dahil edilen dosyalardan daha yüksek önceliğe sahiptir.

Statik Parametreler

Yapılandırma dosyalarında kullanılan parametreler parameters bölümünde tanımlanabilir ve ayrıca addStaticParameters() yöntemi ( addParameters() takma adı vardır) tarafından geçirilebilir (veya üzerine yazılabilir). Farklı parametre değerlerinin ek DI konteynerlerinin, yani ek sınıfların oluşturulmasına neden olması önemlidir.

$configurator->addStaticParameters([
	'projectId' => 23,
]);

Yapılandırma dosyalarında, projectId adlı parametreye erişmek için %projectId% normal notasyonunu yazabiliriz.

Dinamik Parametreler

Konteynere dinamik parametreler de ekleyebiliriz, statik parametrelerin aksine farklı değerleri yeni DI konteynerlerinin oluşturulmasına neden olmaz.

$configurator->addDynamicParameters([
	'remoteIp' => $_SERVER['REMOTE_ADDR'],
]);

Ortam değişkenleri dinamik parametreler kullanılarak kolayca kullanılabilir hale getirilebilir. Bunlara yapılandırma dosyalarındaki %env.variable% adresinden erişebiliriz.

$configurator->addDynamicParameters([
	'env' => getenv(),
]);

Varsayılan Parametreler

Yapılandırma dosyalarında aşağıdaki statik parametreleri kullanabilirsiniz:

  • %appDir%, Bootstrap.php dosyasının dizinine giden mutlak yoldur
  • %wwwDir%, index.php giriş dosyasını içeren dizinin mutlak yoludur
  • %tempDir% geçici dosyalar için dizinin mutlak yoludur
  • %vendorDir% Composer'ın kütüphaneleri yüklediği dizinin mutlak yoludur
  • %debugMode% uygulamanın hata ayıklama modunda olup olmadığını gösterir
  • %consoleMode% isteğin komut satırı üzerinden gelip gelmediğini gösterir

İthal Hizmetler

Şimdi daha derine iniyoruz. Bir DI konteynerinin amacı nesneler oluşturmak olsa da, istisnai olarak mevcut bir nesneyi konteynere ekleme ihtiyacı olabilir. Bunu, servisi imported: true niteliği ile tanımlayarak yaparız.

services:
	myservice:
		type: App\Model\MyCustomService
		imported: true

Yeni bir örnek oluşturun ve bootstrap'e ekleyin:

$configurator->addServices([
	'myservice' => new App\Model\MyCustomService('foobar'),
]);

Farklı Ortamlar

Bootstrap sınıfını ihtiyaçlarınıza göre özelleştirmekten çekinmeyin. Web projelerini farklılaştırmak için boot() yöntemine parametreler ekleyebilir veya birim testleri için ortamı başlatan bootForTests(), komut satırından çağrılan komut dosyaları için bootForCli() gibi başka yöntemler ekleyebilirsiniz.

public static function bootForTests(): Configurator
{
	$configurator = self::boot();
	Tester\Environment::setup(); // Nette Tester initialization
	return $configurator;
}
versiyon: 4.0