लेख

Laravel मा सेवा प्रदायकहरू: तिनीहरू के हुन् र कसरी Laravel मा सेवा प्रदायकहरू प्रयोग गर्ने

Laravel सेवा प्रदायकहरू केन्द्रीय स्थान हो जहाँ अनुप्रयोग सुरु गरिएको छ। त्यो हो, कोर Laravel सेवाहरू र अनुप्रयोग सेवाहरू, कक्षाहरू, र तिनीहरूको निर्भरताहरू प्रदायकहरू मार्फत सेवा कन्टेनरमा राखिन्छन्। 

अर्को शब्दमा भन्नुपर्दा, सेवा प्रदायकहरू एउटा फनेल जस्तै हुन् जसको माध्यमबाट हामीले Laravel नामक इन्जिनको "सर्भिस कन्टेनर" भनिने ट्याङ्कीमा "वर्ग" इन्धन हाल्छौं।

उदाहरणका

यदि हामीले config/app.php खोल्यौं भने हामीले "प्रदायक" नामको एरे देख्नेछौं।

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

यी केही सेवा प्रदायकहरू ल्याराभेलसँगै प्रदान गरिएका छन्, अर्थात् सेवा कन्टेनरमा राखिएका आधारभूत सेवाहरू।

जब म service provider के तिनीहरूले प्रदर्शन गरेका छन्?

यदि हामी कागजात हेर्छौं अनुरोधमा जीवनचक्र , निम्न फाइलहरू सुरुमा कार्यान्वयन गरिन्छ:

  • public/index.php
  • bootstrap/app.php
  • app/Http/Kernel.php र उनको Middlewares
  • Service Providers: यस लेखको सामग्री

क्वाली service provider के तिनीहरू लोड छन्? 

तिनीहरू ती हुन् defiarray मा nites 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,
 
    ],
 
];

हामी देख्न सक्छौं, त्यहाँ को एक सूची छ service provider फोल्डरमा सार्वजनिक छैन /vendor, हामीले तिनीहरूलाई छुनु वा परिमार्जन गर्नु हुँदैन। हामीलाई रुचि राख्नेहरू तल छन्, साथ BroadcastServicerProvider पूर्वनिर्धारित रूपमा असक्षम गरिएको, हुनसक्छ किनभने यो विरलै प्रयोग गरिन्छ।

यी सबै सेवा प्रदायकहरू माथिदेखि तलसम्म, सूची दोहोर्याउँछन् दुई पटक:

  • पहिलो पुनरावृत्ति वैकल्पिक विधि खोज्दैछ register(), विधि अघि कन्फिगर गरिएको केहि कार्यान्वयन गर्न (अन्ततः) को लागी उपयोगी boot().
  • दोस्रो पुनरावृत्ति विधि कार्यान्वयन गर्दछ boot() सबै प्रदायकहरूको। फेरि, एक एक गरेर, माथि देखि तल, array को 'providers'.
  • अन्तमा, सबै सेवा प्रदायकहरू प्रशोधन गरिसकेपछि, Laravel ले पथ (रूट) पार्सिङ गर्न, नियन्त्रक चलाउने, टेम्प्लेटहरू प्रयोग गर्ने, इत्यादिमा अघि बढ्छ।

सेवा प्रदायकहरू Laravel प्रिdefiनीती

I Service Providers Laravel मा समावेश, फोल्डरमा उपस्थित ती सबै हुन् app/Providers:

  • AppServiceProvider
  • AuthServiceProvider
  • BroadcastServiceProvider
  • EventServiceProvider
  • RouteServiceProvider

तिनीहरू सबै PHP कक्षाहरू हुन्, प्रत्येक यसको आफ्नै विषयसँग सम्बन्धित छ: App, Auth, Broadcasting, Events e Routes। तर तिनीहरू सबैमा एउटा कुरा समान छ: विधि boot().

त्यो विधि भित्र, हामी ती खण्डहरू मध्ये कुनै पनि सम्बन्धित कोड लेख्न सक्छौं: auth, events, route, आदि अर्को शब्दमा, सेवा प्रदायकहरू केही विश्वव्यापी कार्यक्षमता दर्ता गर्नका लागि मात्र कक्षाहरू हुन्।

तिनीहरू "प्रदायकहरू" को रूपमा अलग छन् किनभने तिनीहरू अनुप्रयोग जीवनचक्रमा धेरै प्रारम्भमा चल्छन्, त्यसैले कार्यान्वयन लिपि मोडेलहरू वा नियन्त्रकहरूमा पुग्नु अघि यहाँ केहि विश्वव्यापी सुविधाजनक छ।

धेरै जसो कार्यक्षमता RouteServiceProvider मा छ, यहाँ कोड छ:

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

यो वर्ग हो जहाँ फाइलहरू कन्फिगर गरिएको छ routeसंग routes/web.phproutes/api.php पूर्वनिर्धारित रूपमा समावेशdefiनीता नोट गर्नुहोस् कि API को लागि त्यहाँ विभिन्न कन्फिगरेसनहरू पनि छन्: अन्तिम बिन्दु उपसर्ग /api र मिडलवेयर api सबैको लागि routes.

हामी सम्पादन गर्न सक्छौं service providers, जो फोल्डरमा छैनन् /vendor। यी फाइलहरूलाई अनुकूलन गर्ने कार्य तब गरिन्छ जब तपाईंसँग धेरै मार्गहरू छन् र तिनीहरूलाई विशिष्ट फाइलहरूमा अलग गर्न चाहनुहुन्छ। तपाईंले सिर्जना गर्नुहोस् routes/auth.php र त्यहाँ पथहरू राख्नुहोस्, त्यसपछि तपाइँ विधिमा त्यो फाइल "सक्षम" गर्नुहोस् boot() di RouteServiceProvider, केवल तेस्रो वाक्य थप्नुहोस्:

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

AppServiceProvider यो खाली छ। कोड थप्ने एक विशिष्ट उदाहरण AppServiceProvider, Eloquent मा अल्छी लोडिङ असक्षम गर्ने बारे हो। यो गर्न को लागी, तपाईलाई मात्र आवश्यक छ दुई लाइन थप्नुहोस् विधि मा boot():

नवाचार न्यूजलेटर
नवीनता मा सबैभन्दा महत्त्वपूर्ण समाचार नछुटाउनुहोस्। तिनीहरूलाई ईमेल द्वारा प्राप्त गर्न साइन अप गर्नुहोस्।
// app/Providers/AppServiceProvider.php
use Illuminate\Database\Eloquent\Model;
 
public function boot()
{
    Model::preventLazyLoading(! $this->app->isProduction());
}

यदि सम्बन्ध मोडेल लोड गरिएको छैन भने यसले अपवाद फ्याँक्नेछ।

आफ्नै बनाउनुहोस् service provider अनुकूलित

पूर्व फाइलहरु को अतिरिक्तdefiनाइट्स, हामी सजिलै नयाँ सिर्जना गर्न सक्छौं Service Provider, ती पूर्व भन्दा अन्य विषयहरूसँग सम्बन्धितdefiरूपमा समाप्त भयो auth/event/routes.

एकदम सामान्य उदाहरण दृश्य कन्फिगरेसन हो Blade। हामी निर्देशन बनाउन सक्छौं Blade, र त्यसपछि विधिमा त्यो कोड थप्नुहोस् boot(कुनै पनि को service provider, पूर्वनिर्धारित सहित AppServiceProvider। अब एक सिर्जना गरौं ViewServiceProvider अलग।

हामी यसलाई यो आदेशको साथ उत्पन्न गर्न सक्छौं:

php artisan make:provider ViewServiceProvider

जसले कक्षालाई पहिले नै उत्पन्न गर्नेछdefiरात:

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

हामी भित्र देख्न सक्छौं त्यहाँ दुई तरिकाहरू छन्:

दर्ता () विधि

दर्ता () विधिले हामीलाई अनुमति दिन्छ defiहाम्रो सेवा कन्टेनरमा nish लिङ्कहरू। उदाहरण को लागी, निम्न कोड मा:

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

$this->app laravel मा एक वैश्विक चर हो जुन एक सिंगलटन वर्गले एप मार्फत पहुँच गर्न सक्छ।

सिंगलटन एक विशेषता हो। यो सुविधा लागू गर्दा, हामी एपमा मापदण्डको रूपमा जुनसुकै कक्षा उत्तीर्ण गरिएको छ त्यसको सम्पूर्ण अनुप्रयोगमा एउटा मात्र उदाहरण हुनुपर्छ भनेर अनुप्रयोगलाई सूचित गर्दैछौं। यसको मतलब MyClass एक पटक समाधान हुनेछ र केवल एक उदाहरण हुनेछ, जुन my_class चर प्रयोग गरेर पहुँच गर्न सकिन्छ।

boot() विधि

boot() विधिले तपाइँलाई दर्ता विधि प्रयोग गरेर पहिले दर्ता गरिएका सबै सेवाहरू पहुँच गर्न अनुमति दिन्छ। त्यसपछि तपाइँ यो विधि प्रयोग गरेर तपाइँको अनुप्रयोगमा सम्पूर्ण सेवा समावेश गर्न सक्नुहुन्छ।

अघिल्लो उदाहरणमा फर्केर, विधि हटाउनुहोस् register() र भित्र boot() ब्लेड निर्देशन कोड थप्नुहोस्:

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

को अर्को उदाहरण ViewServiceProvider सम्मान View Composers, यहाँ स्निपेट छ आधिकारिक Laravel साइटबाट :

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

चलाउनको लागि, यो नयाँ प्रदायकलाई प्रदायक एरेमा थप्न/दर्ता गरिनुपर्छ 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

तपाईलाई पनि रुचि हुन सक्छ:

नवाचार न्यूजलेटर
नवीनता मा सबैभन्दा महत्त्वपूर्ण समाचार नछुटाउनुहोस्। तिनीहरूलाई ईमेल द्वारा प्राप्त गर्न साइन अप गर्नुहोस्।

भर्खरका लेखहरू

प्रकाशकहरू र ओपनएआईले आर्टिफिसियल इन्टेलिजेन्सद्वारा प्रशोधित सूचनाको प्रवाहलाई विनियमित गर्न सम्झौतामा हस्ताक्षर गर्छन्

गत सोमबार, फाइनान्सियल टाइम्सले OpenAI सँग सम्झौताको घोषणा गर्‍यो। FT ले आफ्नो विश्व स्तरीय पत्रकारिता लाई लाइसेन्स...

30 अप्रिल 2024

अनलाइन भुक्तानीहरू: यहाँ कसरी स्ट्रिमिङ सेवाहरूले तपाईंलाई सधैंभरि भुक्तान गर्छ

लाखौं मानिसहरूले स्ट्रिमिङ सेवाहरूको लागि भुक्तानी गर्छन्, मासिक सदस्यता शुल्क तिर्छन्। यो आम धारणा छ कि तपाईं…

29 अप्रिल 2024

Veeam ले ransomware को लागि सुरक्षा देखि प्रतिक्रिया र रिकभरी को लागी सबै भन्दा व्यापक समर्थन को सुविधा दिन्छ

Veeam द्वारा Coveware ले साइबर जबरजस्ती घटना प्रतिक्रिया सेवाहरू प्रदान गर्न जारी राख्नेछ। Coveware ले फोरेन्सिक र उपचार क्षमताहरू प्रदान गर्दछ ...

23 अप्रिल 2024

हरियो र डिजिटल क्रान्ति: कसरी पूर्वानुमानात्मक रखरखावले तेल र ग्यास उद्योगलाई रूपान्तरण गर्दैछ

अनुमानित मर्मतसम्भारले तेल र ग्यास क्षेत्रमा क्रान्तिकारी परिवर्तन गर्दैछ, बिरुवा व्यवस्थापनको लागि एक नवीन र सक्रिय दृष्टिकोणको साथ।…

22 अप्रिल 2024

आफ्नो भाषामा नवीनता पढ्नुहोस्

नवाचार न्यूजलेटर
नवीनता मा सबैभन्दा महत्त्वपूर्ण समाचार नछुटाउनुहोस्। तिनीहरूलाई ईमेल द्वारा प्राप्त गर्न साइन अप गर्नुहोस्।

हामीलाई पछ्याउनुहोस्