Atik

Founisè Sèvis nan Laravel: kisa yo ye ak kijan pou itilize Founisè Sèvis nan Laravel

Founisè sèvis Laravel yo se plas santral kote aplikasyon an kòmanse. Sa vle di, sèvis debaz Laravel ak sèvis aplikasyon, klas, ak depandans yo mete nan veso sèvis la atravè founisè yo. 

Nan lòt mo, founisè sèvis yo tankou yon antonwa kote nou vide gaz "klas" nan yon tank yo rele "resipyan sèvis" nan yon motè ki rele Laravel.

egzanp

Si nou louvri config/app.php nou pral wè yon etalaj ak non "founisè a"

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

Sa yo se kèk nan founisè sèvis yo bay ansanm ak laravel, sa vle di sèvis debaz yo mete nan veso sèvis la.

Lè mwen service provider yo fèt?

Si nou gade dokiman an sou demann lavi , dosye sa yo yo egzekite nan kòmansman an:

  • public/index.php
  • bootstrap/app.php
  • app/Http/Kernel.php ak li Middlewares
  • Service Providers: kontni atik sa a

Ki service provider yo chaje? 

Yo se sa yo definit nan etalaj la 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,
 
    ],
 
];

Kòm nou ka wè, gen yon lis service provider pa piblik nan katab la /vendor, nou pa ta dwe ni manyen ni modifye yo. Moun ki enterese nou yo anba a, avèk BroadcastServicerProvider andikape pa default, pwobableman paske li se raman itilize.

Tout founisè sèvis sa yo kouri depi anwo jouk anba, repete lis la de fwa:

  • Premye iterasyon an ap chèche pou yon metòd opsyonèl register(), itil pou (evantyèlman) egzekite yon bagay configuré anvan metòd la boot().
  • dezyèm iterasyon an egzekite metòd la boot() nan tout founisè yo. Ankò, youn pa youn, anwo jouk anba, nan etalaj la 'providers'.
  • Finalman, apre tout founisè sèvis yo te trete, Laravel deplase sou analiz chemen an (wout), kouri kontwolè a, lè l sèvi avèk modèl, elatriye.

Founisè sèvis Laravel predefiniti

I Service Providers enkli nan Laravel, se tout moun ki prezan nan katab la app/Providers:

  • AppServiceProvider
  • AuthServiceProvider
  • BroadcastServiceProvider
  • EventServiceProvider
  • RouteServiceProvider

Yo tout se klas PHP, yo chak ki gen rapò ak pwòp sijè pa yo: App, Auth, Broadcasting, Events e Routes. Men, yo tout gen yon bagay an komen: metòd boot().

Anndan metòd sa a, nou ka ekri nenpòt kòd ki gen rapò ak nenpòt nan seksyon sa yo: auth, events, route, elatriye. Nan lòt mo, Founisè Sèvis yo se jis klas pou anrejistre kèk fonksyonalite mondyal.

Yo separe kòm "founisè" paske yo kouri byen bonè nan sik lavi aplikasyon an, kidonk yon bagay global bon isit la anvan script egzekite a rive nan Modèl oswa Kontwolè.

Pifò nan fonksyonalite a se nan RouteServiceProvider la, isit la se kòd la:

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

Sa a se klas la kote dosye yo konfigirasyon route, Ak routes/web.phproutes/api.php enkli pa defaultdefinita. Remake byen ke pou API a gen tou konfigirasyon diferan: Prefiks Endpoint /api ak middleware api pou tout routes.

Nou ka edite la service providers, ki pa nan katab la /vendor. Pèsonalizasyon dosye sa yo fè lè ou gen anpil chemen epi ou vle separe yo nan dosye espesifik. Ou kreye routes/auth.php epi mete chemen yo la, Lè sa a, ou "pèmèt" fichye sa a nan metòd la boot() di RouteServiceProvider, jis ajoute twazyèm fraz la:

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

AppServiceProvider li vid. Yon egzanp tipik nan ajoute kòd AppServiceProvider, se sou enfimite loading parese nan Eloquent . Pou fè sa, ou jis bezwen ajoute de liy nan metòd la boot():

Bilten inovasyon
Pa rate nouvèl ki pi enpòtan sou inovasyon. Enskri pou resevwa yo pa imel.
// app/Providers/AppServiceProvider.php
use Illuminate\Database\Eloquent\Model;
 
public function boot()
{
    Model::preventLazyLoading(! $this->app->isProduction());
}

Sa a pral voye yon eksepsyon si yon modèl relasyon pa chaje.

Kreye pwòp ou yo service provider koutim

Anplis de dosye yo predefinwit, nou ka fasilman kreye yon nouvo Service Provider, ki gen rapò ak lòt sijè pase sa yo predefifini kòm auth/event/routes.

Yon egzanp jistis tipik se konfigirasyon an View Blade. Nou ka kreye yon direktiv Blade, epi ajoute kòd sa a nan metòd la boot() nan nenpòt ki service provider, ki gen ladan default la AppServiceProvider. Se pou kounye a kreye yon ViewServiceProvider separe.

Nou ka jenere li ak lòd sa a:

php artisan make:provider ViewServiceProvider

Ki pral jenere klas la konsa predefinwit:

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

Kòm nou ka wè andedan gen de metòd:

Metòd register() la

Metòd register() pèmèt nou defifini lyen ki mennen nan veso sèvis nou an. Pou egzanp, nan kòd sa a:

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

$this->app se yon varyab mondyal nan laravel ke yon klas singleton ka jwenn aksè atravè app a.

Singleton se yon karakteristik. Lè w ap aplike karakteristik sa a, n ap enfòme aplikasyon an ke kèlkeswa klas yo pase kòm yon paramèt nan aplikasyon an ta dwe gen sèlman yon egzanp nan aplikasyon an antye. Sa vle di ke MyClass pral rezoud yon fwa epi li pral gen yon sèl egzanp, ki ka jwenn aksè lè l sèvi avèk varyab my_class la.

Metòd bòt() la

Metòd boot() pèmèt ou jwenn aksè nan tout sèvis ki te deja anrejistre lè l sèvi avèk metòd enskri. Lè sa a, ou ka mete tout sèvis la nan aplikasyon w lan lè l sèvi avèk metòd sa a.

Tounen nan egzanp anvan an, ann retire metòd la register() ak andedan boot() ajoute kòd direktiv Blade:

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

Yon lòt egzanp ViewServiceProvider konsiderasyon View Composers, Men snippet la soti nan sit ofisyèl Laravel la :

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

Pou kouri, nouvo founisè sa a dwe ajoute/anrejistre nan etalaj founisè a 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

Ou ka enterese tou nan:

Bilten inovasyon
Pa rate nouvèl ki pi enpòtan sou inovasyon. Enskri pou resevwa yo pa imel.

Recent Articles

Piblikatè ak OpenAI siyen akò pou kontwole koule enfòmasyon ki trete pa entèlijans atifisyèl

Lendi pase a, Financial Times te anonse yon kontra ak OpenAI. FT bay lisans jounalis mondyal li...

30 Avril 2024

Peman sou Entènèt: Men Kijan Sèvis Difizyon Fè Ou Peye Pou Toutan

Dè milyon de moun peye pou sèvis difizyon, peye frè abònman chak mwa. Li se opinyon komen ke ou ...

29 Avril 2024

Veeam prezante sipò ki pi konplè pou ransomware, soti nan pwoteksyon jiska repons ak rekiperasyon

Coveware by Veeam ap kontinye bay sèvis repons pou ensidan ekstòsyon sou cyber. Coveware pral ofri medsen legal ak kapasite ratrapaj ...

23 Avril 2024

Revolisyon vèt ak dijital: Ki jan antretyen prediksyon ap transfòme endistri lwil oliv ak gaz

Antretyen prediksyon ap revolisyone sektè lwil oliv ak gaz la, ak yon apwòch inovatè ak aktif nan jesyon plant yo.…

22 Avril 2024