বাংলায় Laravel Framework Laravel Architecture Concepts পর্ব-৩: Laravel Service Providers

Last Updated on November 19, 2022 by Masud Alam

Laravel Service Provider কি?

Laravel Service Provider

Laravel Service Provider

প্রথমে জেনে নেওয়া যাক , Laravel Service provider সম্পর্কে লারাভেল নিজে কি বলে?

Service providers are the central place of all Laravel application bootstrapping. Your own application, as well as all of Laravel’s core services, are bootstrapped via service providers.
By Laravel

উপরের সংজ্ঞার বাংলায় অনুবাদ দাঁড়ায় নিম্নরূপ :

Laravel Framework এ Service provider হচ্ছে সব লারাভেল অ্যাপ্লিকেশন গুলোর bootstrapping করার কেন্দ্রীয় স্থান। আমাদের নিজের application, সেইসাথে লারাভেলের সব core service গুলোকে service provider এর মাধ্যমে bootstrapped করা হয়৷

কিন্তু, “bootstrapped” বলতে আমরা কী বুঝি? সাধারণভাবে, আমরা লারাভেলের service container binding গুলো , event listener গুলো, middleware এবং এমনকি route গুলো রেজিস্টার সহ লারাভেলের অন্য যেকোনো কিছুকে রেজিস্টার করাকে বোঝায়। Service provider হলো আপনার অ্যাপ্লিকেশন কনফিগার করার কেন্দ্রীয় স্থান।

আপনি যদি আপনার Laravel প্রজেক্টের config/app.php ফাইলটি খুলেন , আপনি একটি providers array দেখতে পাবেন। এবং এখানে সমস্ত service provider class যা আপনার application এর জন্য লোড করা হবে। ডিফল্টরূপে, Laravel core service provider দের একটি সেট এই array তে তালিকাভুক্ত করা হয়। এই provider গুলো core Laravel component গুলিকে বুটস্ট্র্যাপ করে, যেমন mailer, queue, cache এবং অন্যান্য গুলো। এই provider গুলোর মধ্যে অনেকগুলি “deferred বা বিলম্বিত” provider , যার অর্থ তাদের প্রতিটি অনুরোধে লোড করা হবে না, তবে শুধুমাত্র তখনই যখন তারা যে service গুলি প্রদান করে তা প্রকৃতপক্ষে প্রয়োজন হয়৷

আজকে, আমরা শিখব কীভাবে আমাদের নিজের জন্য service provider লিখতে হয় এবং নিজের লারাভেল অ্যাপ্লিকেশনের সাথে তাদের register করতে হয়।

Mastering Laravel with ReactJS Course

Create service provider

সমস্ত service provider গুলো Illuminate\Support\ServiceProvider ক্লাস থেকে extend করা হয়েছে। বেশিরভাগ service provider গুলোতে একটি register Method এবং একটি boot method থাকে। register method এর মধ্যে, আপনি শুধুমাত্র service container জিনিস bind করা উচিত. আপনার কখনই register Method এর মধ্যে কোনও event listeners, routes, বা অন্য কোনও functionality এর অংশ register করার চেষ্টা করা উচিত নয়।

আপনি Artisan CLI এর make:provider কমান্ডের মাধ্যমে একটি নতুন provider তৈরি করতে পারেন:

php artisan make:provider SiteServiceProvider

এটি app/Providers/SiteServiceProvider.php ফাইলে নতুন provider ক্লাস তৈরি করবে।

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class SiteServiceProvider extends ServiceProvider
{
    /**
     * Register services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }
}

Service Provider তো তৈরি হয়ে গেলো , এবার চলুন SiteServiceProvider এর মধ্যে অবস্থিত register() Method এবং boot() Method সেই সাথে bindingssingletons properties নিয়ে আলোচনা করা যাক।

The register() Method

register() method এর মধ্যে, আমরা কেবলমাত্র service container কে bind করতে পারব। অর্থাৎ , register method এ কোনও event listeners, routes, বা অন্য কোনও কিছু আমরা রেজিস্টার করতে পারবোনা ।

The boot() Method

আমরা register() Method এ registered সমস্ত service এ অ্যাক্সেস করার জন্য boot() Method ব্যবহার করব। অর্থাৎ, যদি আমাদের service provider মধ্যে একটি view composer নিবন্ধন করতে হয়, তখন এটি আমরা boot method এর মাধ্যমে সম্পন্ন করব।

The bindings And singletons Properties

Laravel Service Provider এ পুনঃব্যবহারযোগ্য class বা object সমূহের জন্য আমরা bind ব্যবহার করব- আর এই অবস্থায় প্রতিবার কল করার সময় নতুন object টি তৈরি করা হয়। আমাদের যখন একটি class এর একাধিক instance এর প্রয়োজন হয় তখন আমরা bind ব্যবহার করব।

যখন আমাদের পুরো অ্যাপ্লিকেশন জুড়ে অ্যাক্সেসের জন্য একটি ক্লাস বা অবজেক্টের প্রয়োজন হবে, এবং অবজেক্টটি শুধুমাত্র একবার তৈরি করা হবে এবং তাই অ্যাপ্লিকেশন জুড়ে class বা object টি কার্যকর থাকবে , তখন আমরা singleton ব্যবহার করব । যদি আমাদের শুধুমাত্র একটি class , এবং সবার সাথে শেয়ার থাকবে অথবা class টির শুধু মাত্র একটি instance এর প্রয়োজন হয়, এই পরিস্থিতিতে আমরা singleton ব্যবহার করব।

Mastering Laravel with ReactJS Course

Register service provider

যেহেতু আমাদের নতুন তৈরি provider class আছে, কিন্তু application টি এটি সম্পর্কে জানে না। তাই আমাদের নতুন provider সম্পর্কে application কে জানাতে হবে। আপনি যদি config/app.php ফাইলটি দেখতে পান, আপনি সমস্ত provider class এর একটি তালিকা সহ $providers অ্যারে দেখতে পাবেন। আমাদের এই অ্যারেতে নতুন provider class টি কে যোগ করতে হবে।

Laravel Custom Service Provider Register

Laravel Custom Service Provider Register

Laravel Service Provider এর ব্যবহার

প্রথমে আমরা SiteRepo ক্লাস register করার আগে , সেটিকে একটি আমরা App\Repositories\ ফোল্ডারে SiteRepo নামে একটি service container হিসেবে তৈরি করে ফেলি। তারপর আমরা এটিকে register করব এবং ক্লাসটি ব্যবহার করব। class টি তে details নামে একটা মেথড থাকবে যা ওয়েবসাইটের সার্ভারের বিবরণ প্রদান করবে।

<?php

namespace App\Repositories;

use App\Repositories\SiteRepo;

class SiteRepo
{
    /**
     * return site details
     *
     * @return void
     */
    public function details()
    {
        return [
            'server' => 'Digital Ocean',
            'type' => 'VPS',
            'disk' => '10000Mb',
        ];
    }
}

Repository Class SiteRepo তো হয়ে গেলো। এবার এটিকে register করার পালা। আপনি হয়তো উপরে লক্ষ্য করে থাকবেন SiteServiceProvider ক্লাসে সাধারণত দুটি Method রয়েছে, এর একটি register method এবং অন্যটি হচ্ছে boot method. register method এ , আমরা App\Repositories\SiteRepo service container ব্যবহার করতে পারি। আর register method এ , আমাদের কাছে কাছে সর্বদা $app property অ্যাক্সেস থাকবে যা service container এ অ্যাক্সেস প্রদান করে।

এখন আপনার তৈরি Service Provider টি নিচের মতো হবে:

<?php

namespace App\Providers;
use App\Repositories\SiteRepo;
use Illuminate\Support\ServiceProvider;

class SiteServiceProvider extends ServiceProvider
{
    /**
     * Register services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->bind('SiteRepo', function($app) {
            return new SiteRepo();
        });
    }

    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }
}

এবার আমরা আমাদের controller class এ SiteRepo class টি ব্যবহার করতে পারি। ঠিক নিচের মতো :

<?php

namespace App\Http\Controllers;
  
use App\Repositories\SiteRepo;
use App\Http\Controllers\Controller;

class ServerController extends Controller
{
    public function index(SiteRepo $siterepo)
    {
        $server_details = $siterepo->details();

        dd($server_details);
    }
}

Mastering Laravel with ReactJS Course

এখন যদি আপনি আপনার সার্ভার ডিটেলস পেতে চান তাহলে নিচের মতো করে routes/web.php ফাইলে route দেখিয়ে দিন।

use App\Http\Controllers\ServerController;

Route::get('server-details', [ServerController::class, 'index'])->name('index');

এখন আপনি নিচের মতো করে আউটপুট দেখতে পাবেন।

Laravel Custom Service Provider Result

Laravel Custom Service Provider Result

Leave a Reply