Başka bir deyişle, hizmet sağlayıcılar, "sınıf" yakıtı Laravel adlı bir motorun "servis kabı" adı verilen bir tankına döktüğümüz bir huni gibidir.
config/app.php dosyasını açarsak "provider" adında bir dizi görürüz
'providers' => [
/*
* Laravel Framework Service Providers...
*/
Illuminate\Auth\AuthServiceProvider::class,
Illuminate\Broadcasting\BroadcastServiceProvider::class,
Illuminate\Bus\BusServiceProvider::class,
Illuminate\Cache\CacheServiceProvider::class,
Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class,
Illuminate\Cookie\CookieServiceProvider::class,
.
.
.
],
Bunlar, laravel ile birlikte sağlanan hizmet sağlayıcılardan, yani hizmet konteynerine yerleştirilen temel hizmetlerden bazılarıdır.
service provider
yapılırlar mı?belgelere bakarsak istek üzerine yaşam döngüsü , aşağıdaki dosyalar başlangıçta yürütülür:
public/index.php
bootstrap/app.php
app/Http/Kernel.php
ve onun Middlewares
Service Providers
: bu makalenin içeriğiKalite service provider
yüklendiler mi?
Onlar bunlar defidizideki geceler config/app.php
:
return [
// ... other configuration values
'providers' => [
/*
* Laravel Framework Service Providers...
*/
Illuminate\Auth\AuthServiceProvider::class,
Illuminate\Broadcasting\BroadcastServiceProvider::class,
// ... other framework providers from /vendor
Illuminate\Validation\ValidationServiceProvider::class,
Illuminate\View\ViewServiceProvider::class,
/*
* PUBLIC Service Providers - the ones we mentioned above
*/
App\Providers\AppServiceProvider::class,
App\Providers\AuthServiceProvider::class,
// App\Providers\BroadcastServiceProvider::class,
App\Providers\EventServiceProvider::class,
App\Providers\RouteServiceProvider::class,
],
];
Gördüğümüz gibi, bir liste var. service provider
klasörde herkese açık değil /vendor
, onlara dokunmamalı veya değiştirmemeliyiz. Bizi ilgilendirenler aşağıda, BroadcastServicerProvider
muhtemelen nadiren kullanıldığı için varsayılan olarak devre dışıdır.
Tüm bu servis sağlayıcılar, listeyi tekrarlayarak yukarıdan aşağıya doğru çalışır. iki defa:
register()
, yöntemden önce yapılandırılmış bir şeyi (sonunda) yürütmek için kullanışlıdır boot()
.boot()
tüm sağlayıcıların. Yine dizinin yukarıdan aşağıya doğru birer birer 'providers'
.I Service Providers
laravel'de bulunanlar, klasörde bulunanların tümü app/Providers
:
AppServiceProvider
AuthServiceProvider
BroadcastServiceProvider
EventServiceProvider
RouteServiceProvider
Hepsi, her biri kendi konusuyla ilgili PHP sınıflarıdır: App
, Auth
, Broadcasting
, Events
e Routes
. Ama hepsinin ortak bir noktası var: yöntem boot()
.
Bu yöntemin içine, bu bölümlerden herhangi biriyle ilgili herhangi bir kod yazabiliriz: auth
, events
, route
, vesaire. Başka bir deyişle, Hizmet Sağlayıcılar yalnızca bazı küresel işlevleri kaydetmek için kullanılan sınıflardır.
Uygulama yaşam döngüsünde çok erken çalıştıkları için "sağlayıcılar" olarak ayrıdırlar, bu nedenle, yürütme komut dosyası Modellere veya Denetleyicilere ulaşmadan önce burada genel bir şey uygundur.
İşlevselliğin çoğu RouteServiceProvider'dadır, işte kod:
class RouteServiceProvider extends ServiceProvider
{
public const HOME = '/dashboard';
public function boot()
{
$this->configureRateLimiting();
$this->routes(function () {
Route::prefix('api')
->middleware('api')
->group(base_path('routes/api.php'));
Route::middleware('web')
->group(base_path('routes/web.php'));
});
}
protected function configureRateLimiting()
{
RateLimiter::for('api', function (Request $request) {
return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
});
}
}
Bu, dosyaların yapılandırıldığı sınıftır. route
Ile, routes/web.php
e routes/api.php
varsayılan olarak dahil edilmiştirdefiNita. API için farklı yapılandırmaların da bulunduğunu unutmayın: Uç nokta öneki /api
ve ara yazılım api
hepsi için routes
.
düzenleyebiliriz service providers
, klasörde olmayanlar /vendor
. Bu dosyaları özelleştirme, birçok yolunuz olduğunda ve bunları belirli dosyalara ayırmak istediğinizde yapılır. sen yarat routes/auth.php
ve yolları oraya koyun, ardından o dosyayı yöntemde "etkinleştirin" boot()
di RouteServiceProvider
, sadece üçüncü cümleyi ekleyin:
`Route::middleware('web') // or maybe you want another middleware?
->group(base_path('routes/auth.php'));
AppServiceProvider
bu boş. Kod eklemenin tipik bir örneği AppServiceProvider
, Eloquent'te tembel yüklemeyi devre dışı bırakmakla ilgilidir. Bunu yapmak için, sadece ihtiyacınız var iki satır ekle yöntemde boot()
:
// app/Providers/AppServiceProvider.php
use Illuminate\Database\Eloquent\Model;
public function boot()
{
Model::preventLazyLoading(! $this->app->isProduction());
}
Bir ilişki modeli yüklenmemişse bu bir istisna atar.
service provider
görenekÖn dosyalara ek olarakdefitamam, kolayca yeni bir tane oluşturabiliriz Service Provider
, önceki konular dışındaki diğer konularla ilgilidefiolarak bitti auth
/event
/routes
.
Oldukça tipik bir örnek, görünüm yapılandırmasıdır Blade
. direktif oluşturabiliriz Blade
ve sonra bu kodu yönteme ekleyin boot(
) herhangi bir service provider
, varsayılan dahil AppServiceProvider
. şimdi bir tane oluşturalım ViewServiceProvider
ayrı.
Bu komutla üretebiliriz:
php artisan make:provider ViewServiceProvider
Bu, sınıfı çok önceden oluşturacakdefigece:
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class ViewServiceProvider extends ServiceProvider
{
/**
* Register services.
*
* @return void
*/
public function register()
{
//
}
/**
* Bootstrap services.
*
* @return void
*/
public function boot()
{
//
}
}
İçeride görebileceğimiz gibi iki yöntem var:
Register() yöntemi şunları yapmamızı sağlar: defiServis kapsayıcımızın bağlantılarını tamamlayın. Örneğin aşağıdaki kodda:
public function register()
{
$this->app->singleton(my_class, function($app){
return new MyClass($app);
});
}
$this->app, laravel'de tek bir sınıfın uygulama aracılığıyla erişebileceği global bir değişkendir.
Singleton bir özelliktir. Bu özelliği uygularken, uygulamaya, uygulamada parametre olarak iletilen sınıf ne olursa olsun, uygulamanın tamamında yalnızca bir örneğe sahip olması gerektiğini bildiriyoruz. Bu, MyClass'ın bir kez çözüleceği ve my_class değişkeni kullanılarak erişilebilen yalnızca bir örneğe sahip olacağı anlamına gelir.
boot() yöntemi, daha önce register yöntemi kullanılarak kaydedilen tüm hizmetlere erişmenizi sağlar. Daha sonra bu yöntemi kullanarak tüm hizmeti uygulamanıza dahil edebilirsiniz.
Önceki örneğe geri dönersek, yöntemi kaldıralım register()
ve içinde boot()
Blade direktif kodunu ekleyin:
use Illuminate\Support\Facades\Blade;
public function boot()
{
Blade::directive('datetime', function ($expression) {
return "<?php echo ($expression)->format('m/d/Y H:i'); ?>";
});
}
başka bir örnek ViewServiceProvider
İlgilendirir View Composers
, işte fragman resmi Laravel sitesinden :
use App\View\Composers\ProfileComposer;
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;
class ViewServiceProvider extends ServiceProvider
{
public function boot()
{
// Using class based composers...
View::composer('profile', ProfileComposer::class);
// Using closure based composers...
View::composer('dashboard', function ($view) {
//
});
}
}
Çalıştırmak için bu yeni sağlayıcı, sağlayıcı içi diziye eklenmeli/kaydedilmelidir config/app.php
:
return [
// ... other configuration values
'providers' => [
App\Providers\AppServiceProvider::class,
App\Providers\AuthServiceProvider::class,
// App\Providers\BroadcastServiceProvider::class,
App\Providers\EventServiceProvider::class,
App\Providers\RouteServiceProvider::class,
// Add your provider here
App\Providers\ViewServiceProvider::class,
],
];
Ercole Palmeri
Ayrıca şunlarla da ilgilenebilirsiniz:
Boyama yoluyla ince motor becerilerini geliştirmek, çocukları yazma gibi daha karmaşık becerilere hazırlar. Renklendirmek…
Denizcilik sektörü, 150 milyarlık bir pazara doğru yol alan gerçek bir küresel ekonomik güçtür...
Geçen Pazartesi Financial Times, OpenAI ile bir anlaşma yaptığını duyurdu. FT, birinci sınıf gazeteciliğine lisans veriyor…
Milyonlarca insan aylık abonelik ücreti ödeyerek akış hizmetleri için ödeme yapıyor. Yaygın kanaat şu ki…