artikels

Tsjinstferlieners yn Laravel: wat se binne en hoe't jo tsjinstferlieners yn Laravel brûke

Laravel-tsjinstferlieners binne it sintrale plak wêr't de applikaasje is begon. Dat is, core Laravel tsjinsten en applikaasje tsjinsten, klassen, en harren ôfhinklikens wurde pleatst yn de tsjinst container fia providers. 

Mei oare wurden, tsjinstferlieners binne as in trechter wêrmei't wy "klasse" brânstof yn in tank skine dy't de "tsjinstkontener" hjit fan in motor mei de namme Laravel.

foarbyld

As wy config/app.php iepenje, sille wy in array sjen mei de namme "provider"

'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,
        .
        .
        .
],

Dit binne guon fan 'e tsjinstferlieners dy't tegearre mei laravel oanbean wurde, dus basistsjinsten dy't yn' e tsjinstkontener pleatst wurde.

As ik service provider wurde se útfierd?

As wy sjogge nei de dokumintaasje op oanfraach lifecycle , wurde de folgjende bestannen oan it begjin útfierd:

  • public/index.php
  • bootstrap/app.php
  • app/Http/Kernel.php en sines Middlewares
  • Service Providers: ynhâld fan dit artikel

Hokker service provider binne se laden? 

It binne dy definites yn 'e array 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,
 
    ],
 
];

Sa't wy sjen kinne, der is in list fan service provider net iepenbier yn 'e map /vendor, wy moatte se net oanreitsje of feroarje. Dejingen dy't ynteressearje ús binne hjirûnder, mei BroadcastServicerProvider standert útskeakele, wierskynlik om't it selden brûkt wurdt.

Al dizze tsjinstferlieners rinne fan boppen nei ûnderen, en werhelje de list twaris:

  • De earste iteraasje is op syk nei in opsjonele metoade register(), nuttich foar (úteinlik) it útfieren fan wat konfigureare foar de metoade boot().
  • de twadde iteraasje útfiert de metoade boot() fan alle oanbieders. Nochris, ien foar ien, fan boppe nei ûnderen, fan 'e array 'providers'.
  • Uteinlik, nei't alle tsjinstferlieners binne ferwurke, giet Laravel troch nei it parsearjen fan it paad (rûte), it útfieren fan de controller, it brûken fan sjabloanen, ensfh.

Service Providers Laravel predefiek net

I Service Providers opnommen yn Laravel, binne al dy oanwêzich yn de map app/Providers:

  • AppServiceProvider
  • AuthServiceProvider
  • BroadcastServiceProvider
  • EventServiceProvider
  • RouteServiceProvider

Se binne allegear PHP-klassen, elk relatearre oan syn eigen ûnderwerp: App, Auth, Broadcasting, Events e Routes. Mar se hawwe allegear ien ding mienskiplik: metoade boot().

Binnen dy metoade kinne wy ​​elke koade skriuwe relatearre oan ien fan dy seksjes: auth, events, route, ensfh. Mei oare wurden, tsjinstferlieners binne gewoan klassen om wat globale funksjonaliteit te registrearjen.

Se binne apart as "oanbieders" om't se heul betiid rinne yn 'e libbenssyklus fan' e applikaasje, dus wat globaal is hjir handich foardat it útfierende skript nei Modellen of Controllers komt.

De measte funksjonaliteit is yn 'e RouteServiceProvider, hjir is de koade:

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());
        });
    }
}

Dit is de klasse dêr't de triemmen binne konfigurearre route, mei routes/web.phproutes/api.php standert opnommendefinita. Tink derom dat d'r foar de API ek ferskate konfiguraasjes binne: Einpuntprefix /api en middleware api foar alle routes.

Wy kinne bewurkje de service providers, dy't net yn 'e map steane /vendor. It oanpassen fan dizze bestannen wurdt dien as jo in protte paden hawwe en se wolle skiede yn spesifike bestannen. Jo meitsje routes/auth.php en set de paden dêr, dan "ynskeakelje" jo dat bestân yn 'e metoade boot() di RouteServiceProvider, foegje gewoan de tredde sin ta:

`Route::middleware('web') // or maybe you want another middleware?
    ->group(base_path('routes/auth.php'));

AppServiceProvider it is leech. In typysk foarbyld fan it tafoegjen fan koade AppServiceProvider, giet oer it útskeakeljen fan loai laden yn Eloquent . Om dit te dwaan, moatte jo gewoan add twa rigels yn 'e metoade boot():

Ynnovaasje nijsbrief
Mis it wichtichste nijs oer ynnovaasje net. Meld jo oan om se fia e-post te ûntfangen.
// app/Providers/AppServiceProvider.php
use Illuminate\Database\Eloquent\Model;
 
public function boot()
{
    Model::preventLazyLoading(! $this->app->isProduction());
}

Dit sil in útsûndering smyt as in relaasjemodel net laden is.

Meitsje jo eigen service provider maatwurk

Neist de pre triemmendefinites, kinne wy ​​maklik meitsje in nij Service Provider, yn ferbân mei oare ûnderwerpen as dy predefiklear as auth/event/routes.

In frij typysk foarbyld is de werjeftekonfiguraasje Blade. Wy kinne in rjochtline meitsje Blade, en foegje dan dizze koade ta yn 'e metoade boot() fan elk service provider, ynklusyf de standert AppServiceProvider. Lit ús no meitsje in ViewServiceProvider skiede.

Wy kinne it generearje mei dit kommando:

php artisan make:provider ViewServiceProvider

Hokker sil generearje de klasse sa predefinacht:

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()
    {
        //
    }
}

Sa't wy binnen kinne sjen, binne d'r twa metoaden:

De register() metoade

De metoade register() lit ús definish keppelings nei ús tsjinst container. Bygelyks, yn 'e folgjende koade:

public function register()
{
    $this->app->singleton(my_class, function($app){
        return new MyClass($app);
    });
}

$this->app is in globale fariabele yn laravel dy't in singleton-klasse tagong kin fia de app.

Singleton is in funksje. By it tapassen fan dizze funksje ynformearje wy de applikaasje dat hokker klasse dan ek as parameter yn 'e app trochjûn wurdt, mar ien eksimplaar moat hawwe yn 'e heule applikaasje. Dit betsjut dat MyClass ien kear oplost wurdt en mar ien eksimplaar sil hawwe, dy't tagonklik wurde kin mei de my_class fariabele.

De boot() metoade

De boot() metoade lit jo tagong krije ta alle tsjinsten dy't earder registrearre binne mei de registermetoade. Jo kinne dan de hiele tsjinst opnimme yn jo applikaasje mei dizze metoade.

Gean werom nei it foarige foarbyld, litte wy de metoade fuortsmite register() en binnen boot() foegje de Blade-rjochtlinekoade ta:

use Illuminate\Support\Facades\Blade;
 
public function boot()
{
    Blade::directive('datetime', function ($expression) {
        return "<?php echo ($expression)->format('m/d/Y H:i'); ?>";
    });
}

In oar foarbyld fan ViewServiceProvider oansjen View Composers, hjir is it snippet fan 'e offisjele Laravel-side :

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) {
            //
        });
    }
}

Om te rinnen, moat dizze nije provider wurde tafoege / registrearre oan 'e in provider array 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

Jo kinne ek ynteressearje yn:

Ynnovaasje nijsbrief
Mis it wichtichste nijs oer ynnovaasje net. Meld jo oan om se fia e-post te ûntfangen.

Recent articles

De takomst is hjir: hoe't de skipfeartsektor de wrâldekonomy revolúsjonearret

De marinesektor is in wiere wrâldwide ekonomyske macht, dy't navigearre is nei in merk fan 150 miljard ...

1 mei 2024

Utjouwers en OpenAI tekenje oerienkomsten om de stream fan ynformaasje te regeljen ferwurke troch Artificial Intelligence

Ofrûne moandei kundige de Financial Times in deal oan mei OpenAI. FT lisinsje har sjoernalistyk fan wrâldklasse ...

30 april 2024

Online betellingen: Hjir is hoe streamingtsjinsten jo foar altyd betelje

Miljoenen minsken betelje foar streamingtsjinsten, beteljen moanlikse abonnemintskosten. It is gewoane miening dat jo ...

29 april 2024

Veeam hat de meast wiidweidige stipe foar ransomware, fan beskerming oant antwurd en herstel

Coveware troch Veeam sil trochgean mei it leverjen fan antwurdtsjinsten foar cyberafpersing ynsidint. Coveware sil forensyske en sanearjen mooglikheden oanbiede ...

23 april 2024