Makaleler

Laravel'de Servis Sağlayıcılar: ne oldukları ve Laravel'de Servis Sağlayıcıların nasıl kullanılacağı

Laravel servis sağlayıcıları uygulamanın başlatıldığı merkezi yerdir. Yani, temel Laravel hizmetleri ve uygulama hizmetleri, sınıfları ve bunların bağımlılıkları, sağlayıcılar aracılığıyla hizmet kapsayıcısına yerleştirilir. 

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.

örnek

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.

Ne zaman ben 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ği

Kalite 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:

  • İlk yineleme, isteğe bağlı bir yöntem arıyor register(), yöntemden önce yapılandırılmış bir şeyi (sonunda) yürütmek için kullanışlıdır boot().
  • ikinci yineleme yöntemi yürütür boot() tüm sağlayıcıların. Yine dizinin yukarıdan aşağıya doğru birer birer 'providers'.
  • Son olarak, tüm servis sağlayıcılar işlendikten sonra, Laravel yolu (rota) ayrıştırmaya, denetleyiciyi çalıştırmaya, şablonları kullanmaya vb. geçer.

Servis Sağlayıcılar Laravel predefiniti

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. routeIle, routes/web.phproutes/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():

İnovasyon bülteni
İnovasyonla ilgili en önemli haberleri kaçırmayın. Onları e-posta ile almak için kaydolun.
// 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.

Kendininkini yarat 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 Bladeve 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

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

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:

İnovasyon bülteni
İnovasyonla ilgili en önemli haberleri kaçırmayın. Onları e-posta ile almak için kaydolun.

Son Makaleler

Çocuklar İçin Boyama Sayfalarının Faydaları - her yaş için sihirli bir dünya

Boyama yoluyla ince motor becerilerini geliştirmek, çocukları yazma gibi daha karmaşık becerilere hazırlar. Renklendirmek…

2 Mayıs 2024

Gelecek Burada: Denizcilik Sektörü Küresel Ekonomide Nasıl Devrim Yaratıyor?

Denizcilik sektörü, 150 milyarlık bir pazara doğru yol alan gerçek bir küresel ekonomik güçtür...

1 Mayıs 2024

Yayıncılar ve OpenAI, Yapay Zeka tarafından işlenen bilgi akışını düzenlemek için anlaşmalar imzaladı

Geçen Pazartesi Financial Times, OpenAI ile bir anlaşma yaptığını duyurdu. FT, birinci sınıf gazeteciliğine lisans veriyor…

Nisan 30 2024

Çevrimiçi Ödemeler: Yayın Hizmetlerinin Sonsuza Kadar Ödemenizi Sağlaması

Milyonlarca insan aylık abonelik ücreti ödeyerek akış hizmetleri için ödeme yapıyor. Yaygın kanaat şu ki…

Nisan 29 2024