Servis sağlayıcılar, tüm Laravel uygulama önyüklemelerinin merkezi yeridir. Kendi uygulamanız ve Laravel'in tüm temel hizmetleri, servis sağlayıcılar aracılığıyla önyüklemelidir. Peki, "önyüklemeli" derken neyi kastediyoruz? Genel olarak, servis konteyner bağlamalarını, olay dinleyicilerini, ara yazılımları ve hatta rotaları kaydetme dahil olmak üzere şeyleri kaydetmeyi kastediyoruz. Servis sağlayıcılar, uygulamanızı yapılandırmak için merkezi yerdir. Laravel, postacı, kuyruk, önbellek ve diğerleri gibi temel hizmetlerini önyüklemek için dahili olarak düzinelerce servis sağlayıcı kullanır. Bu sağlayıcıların çoğu "ertelenmiş" sağlayıcılardır, yani her istekte yüklenmeyecekler, ancak yalnızca sağladıkları hizmetlere gerçekten ihtiyaç duyulduğunda yükleneceklerdir. Tüm kullanıcı tanımlı servis sağlayıcılar
bootstrap/providers.php dosyasına kaydedilir. Aşağıdaki anlatımlarda, kendi servis sağlayıcılarınızı nasıl yazacağınızı ve bunları Laravel uygulamanıza nasıl kaydedeceğinizi öğreneceksiniz.
Servis sağlayıcılar için `register` yöntemi
Daha önce belirtildiği gibi, kayıt yöntemi içinde, yalnızca servis konteynerine bir şeyler bağlamalısınız. Kayıt yöntemi içinde hiçbir olay dinleyicisini, rotayı veya başka bir işlevsellik parçasını kaydetmeye asla çalışmamalısınız. Aksi takdirde, henüz yüklenmemiş bir servis sağlayıcısı tarafından sağlanan bir servisi yanlışlıkla kullanabilirsiniz. Temel bir servis sağlayıcısına bir göz atalım. Servis sağlayıcı yöntemlerinizden herhangi birinde, servis konteynerine erişim sağlayan
$app özelliğine her zaman erişiminiz vardır:
<?php
namespace App\Providers;
use App\Services\Rokito\Connection;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Support\ServiceProvider;
class RokitoServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*/
public function register(): void
{
$this->app->singleton(Connection::class, function (Application $app) {
return new Connection(config('rokito'));
});
}
}Bu servis sağlayıcı yalnızca bir kayıt yöntemi tanımlar ve bu yöntemi servis konteynerinde
AppServicesRokitoConnection'ın bir uygulamasını tanımlamak için kullanır.
Laravel'in servis konteynerine henüz aşina değilseniz, belgelerine göz atın.
Bağlamalar (Bindings) ve Tekillerin (Singletons) Özellikleri
Hizmet sağlayıcınız birçok basit bağlama kaydediyorsa, her kapsayıcı bağlamayı elle kaydetmek yerine bağlamalar ve tekil öğelerin özelliklerini kullanmak isteyebilirsiniz. Hizmet sağlayıcı çerçeve tarafından yüklendiğinde, bu özellikleri otomatik olarak kontrol edecek ve bağlamalarını kaydedecektir:
<?php
namespace App\Providers;
use App\Contracts\DowntimeNotifier;
use App\Contracts\ServerProvider;
use App\Services\DigitalOceanServerProvider;
use App\Services\PingdomDowntimeNotifier;
use App\Services\ServerToolsProvider;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* All of the container bindings that should be registered.
*
* @var array
*/
public $bindings = [
ServerProvider::class => DigitalOceanServerProvider::class,
];
/**
* All of the container singletons that should be registered.
*
* @var array
*/
public $singletons = [
DowntimeNotifier::class => PingdomDowntimeNotifier::class,
ServerProvider::class => ServerToolsProvider::class,
];
}Servis sağlayıcılar için `boot` yöntemi
Peki, servis sağlayıcımız içinde bir görünüm bestecisi kaydetmemiz gerekirse ne olur? Bu, önyükleme yöntemi içinde yapılmalıdır. Bu yöntem, diğer tüm servis sağlayıcıları kaydedildikten sonra çağrılır, yani çerçeve tarafından kaydedilen diğer tüm servislere erişiminiz olur:
<?php
namespace App\Providers;
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;
class ComposerServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*/
public function boot(): void
{
View::composer('rokito', function () {
// ...
});
}
}Önyükleme Yöntemi Bağımlılık Enjeksiyonu
Servis sağlayıcınızın önyükleme yöntemi için bağımlılıkları tür ipucu olarak ekleyebilirsiniz. Servis konteyneri, ihtiyaç duyduğunuz tüm bağımlılıkları otomatik olarak enjekte edecektir:
use Illuminate\Contracts\Routing\ResponseFactory;
/**
* Bootstrap any application services.
*/
public function boot(ResponseFactory $response): void
{
$response->macro('serialized', function (mixed $value) {
// ...
});
}Sağlayıcıları Kaydetme
Tüm servis sağlayıcılar
bootstrap/providers.php yapılandırma dosyasında kayıtlıdır. Bu dosya, uygulamanızın servis sağlayıcılarının sınıf adlarını içeren bir dizi döndürür:
<?php
return [
App\Providers\AppServiceProvider::class,
];make
rovider Artisan komutunu çağırdığınızda, Laravel otomatik olarak oluşturulan sağlayıcıyı
bootstrap/providers.php dosyasına ekleyecektir. Ancak, sağlayıcı sınıfını elle oluşturduysanız, sağlayıcı sınıfını diziye elle eklemelisiniz:
<?php
return [
App\Providers\AppServiceProvider::class,
App\Providers\ComposerServiceProvider::class,
];Ertelenmiş Sağlayıcılar
Sağlayıcınız yalnızca servis konteynerindeki bağlamaları kaydediyorsa, kayıtlı bağlamalardan biri gerçekten ihtiyaç duyulana kadar kaydını ertelemeyi seçebilirsiniz. Böyle bir sağlayıcının yüklenmesini ertelemek, her istekte dosya sisteminden yüklenmediği için uygulamanızın performansını artıracaktır.
Laravel, ertelenmiş servis sağlayıcıları tarafından sağlanan tüm servislerin bir listesini, servis sağlayıcı sınıfının adıyla birlikte derler ve depolar. Daha sonra, yalnızca bu servislerden birini çözmeye çalıştığınızda Laravel servis sağlayıcısını yükler.
Bir sağlayıcının yüklenmesini ertelemek için,
IlluminateContractsSupportDeferrableProvider arayüzünü uygulayın ve bir
provides yöntemi tanımlayın.
provides yöntemi, sağlayıcı tarafından kaydedilen servis konteyneri bağlamalarını döndürmelidir:
<?php
namespace App\Providers;
use App\Services\Rokito\Connection;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Contracts\Support\DeferrableProvider;
use Illuminate\Support\ServiceProvider;
class RokitoServiceProvider extends ServiceProvider implements DeferrableProvider
{
/**
* Register any application services.
*/
public function register(): void
{
$this->app->singleton(Connection::class, function (Application $app) {
return new Connection($app['config']['rokito']);
});
}
/**
* Get the services provided by the provider.
*
* @return array<int, string>
*/
public function provides(): array
{
return [Connection::class];
}
}