বাংলায় Laravel Framework Laravel Architecture Concepts পর্ব-৪: Laravel facades

Last Updated on November 19, 2022 by Masud Alam

Laravel Facades

Laravel Facades

Facade কি?

ইংরেজিতে facade শব্দের অর্থ হচ্ছে “সম্মুখভাগ ” যাকে আমরা interface ও বলতে পারি। লারাভেলে Facade এমন একটি ক্লাস যে অন্য একটি ক্লাসের static Interface হিসাবে কাজ করে। আরেকটু সহজভাবে বললে, Laravel Framework এ Facade হলো একটি class যা লারাভেল ফ্রেমওয়ার্ক এর application’s service container এর মধ্যে অবস্থিত অন্যান্য ক্লাস গুলোর non-static মেথড গুলোকে static মেথডের মত কল করার কাজে ব্যবহার করা হয়। আমরা যে web.php ফাইল এ Route::get() লেখি , এখানে Route ক্লাস টি একটি Facade ক্লাস। লারাভেলে Route facade এর মতো আরো অনেক জনপ্রিয় facade ক্লাস আছে যেমন , View, Session, Cache, Request ইত্যাদি।

Laravel facades গুলো হল Laravel এর component গুলোতে access করার একটি সুবিধাজনক উপায়। প্রতিটি facade ইতিমধ্যে service container এ রেজিস্টার্ড করা কিছু component সাথে bound বা আবদ্ধ করা আছে। Facade গুলো সাধারণত আমাদের কে একটি জটিল অন্তর্নিহিত সাবসিস্টেমের একটি সহজ ইন্টারফেস প্রদান করতে ব্যবহৃত হয়। যদিও কিছু facade “shortcut” পদ্ধতি প্রদান করে, তবে বেশিরভাগ facade একটি ক্লাসের instance এ একটি স্ট্যাটিক ইন্টারফেস দেওয়ার জন্য প্রক্সির মতো কাজ করে।

Laravel Framework এ সমস্ত default facade গুলো Illuminate\Support\Facades namespace এর অধীনে অবস্থিত এবং vendor/laravel/framework/src/Illuminate/Support/Facades ডিরেক্টরির মধ্যে অবস্থিত। প্রতিটি facade ই abstract Facade (Illuminate\Support\Facades\Facade) ক্লাস থেকে inheritend বা extended. এবং আপনার তৈরি প্রতিটি Facade এ অবশ্যই একটি getFacadeAccessor() method থাকতে হবে যা protected করার জন্য define করা হয়েছে।

Mastering Laravel with ReactJS Course

getFacadeAccessor() method এর কাজ কি?

কোনো Laravel facade এ access করলে service container থেকে কোন class বা component রান করা উচিত তা আমার getFacadeAccessor() method এ বলে দিব। আর তখন সব মেথড কল কে সেই class Instances এ redirected করা হয়। লারাভেল এই class instance টিকে facade root হিসাবে উল্লেখ করে।

কিছু Laravel facade আছে যেগুলো কিছু অতিরিক্ত static method কে define করে যা কোনো component বা class এর অংশ নাও হতে পারে। এই instance গুলিতে, static method (যেটি facade এর অন্তর্গত) সরাসরি বলা হয়। যেমন Cookie facade এর কথা বলা যায়।

Aliases এবং Importing Laravel Facade

আপনি চাইলে প্রতিটি facade ব্যবহার করার সময় এর একটি alias দিতে পারেন। ঠিক নিচের মতো :

<?php
use Some\ReallyReallyLongClassName as ShorterName;

উপরের উদাহরণে ShorterName হল ReallyReallyLongClassName এর একটি alias । Laravel স্বয়ংক্রিয়ভাবে সমস্ত facades গুলোর জন্য alias তৈরি করে, এবং সেগুলির সম্পূর্ণ তালিকা আপনি চাইলে config/app.php ফাইলের alias array তে পেতে পারেন । লারাভেল যে alias গুলি তৈরি করে তা global namespace এ রয়েছে, যার অর্থ developers রা এমন কোড লিখতে পারে যা দেখতে এইরকম:

<?php
 
namespace App\Http\Controllers;
 
use Input;
 
// Other code here.

যা আপনি পুরো namespace দিয়ে লিখতে গেলে ঠিক নিচের মতো হতো :

<?php
 
namespace App\Http\Controllers;
 
use Illuminate\Support\Facades\Input;
 
// Other code here.

Creating Custom Laravel Facades

কখনো কখনো Laravel Application development কালীন আপনার নিজের প্রয়োজনে একটা Laravel facade তৈরি করতে হতে পারে। আর তাই এখন আমরা দেখবো কিভাবে একটা Custom Laravel Facade তৈরি করা যায়।

ধরুন, আমরা আমাদের লারাভেল এপ্লিকেশনে বিভিন্ন Mathmatical calculation গুলো করার জন্য Math নামে একটি Laravel Facade লিখতে চাই। যেই Laravel Facade ব্যাবহার করে, Math::add($firstNumber, $secondNumber) ও Math::sub($firstNumber, $secondNumber) লিখলে যথাক্রমে দুইটি নাম্বারের যোগ ও বিয়োগ করা যাবে। এর জন্য আপনাকে নিচের ধাপ গুলো অনুসরণ করতে হবেঃ

১। প্রথমে একটি class লিখতে হবে যে class টি আমাদের calculation এর কাজগুলো করবে। নিম্নে আমরা App\Services ফোল্ডারের মধ্যে Calculator নামে একটা class তৈরি করব , যা অনেকটা নিম্নরূপঃ

<?php
namespace App\Services;
class Calculator {
 
    /**
     * Adds two numbers.
 
     * @param  mixed $firstNumber
     * @param  mixed $secondNumber
     * @return mixed
     */
    public function add($firstNumber, $secondNumber)
    {
        return $firstNumber + $secondNumber;
    }
    public function sub($firstNumber, $secondNumber){
        return $firstNumber - $secondNumber;
    }
    // Possibly many more methods.
 
}

২। এবার আমরা App\Facades ফোল্ডারের মধ্যে আমাদের Math.php নামে Facade ক্লাসটি লিখে ফেলিঃ

<?php
namespace App\Facades;

use Illuminate\Support\Facades\Facade;

class Math extends Facade
{
    protected static function getFacadeAccessor(){
        return 'Math';
    }
}

Mastering Laravel with ReactJS Course

৩। এইবার Providers ফোল্ডারের মধ্যে আমাদের AppServiceProvider এ `Math` স্ট্রিং-এর সাথে ক্লাসকে বাইন্ড করতে হবে।

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use App\Services\Calculator;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->bind('Math', Calculator::class);
    }

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

উপরের কোডে আমরা ‘AppServiceProvider’ কে নির্দেশ দিচ্ছি, কেউ যদি ‘Math’ string দিয়ে লারাভেলের সার্ভিস কন্টেইনারকে বলে আমাকে একটা class দাও তাহলে সে ‘Calculator’ class এর Instance কে return করবে।

৪। ব্যাস, আমাদের Math নামক ‘Facade` তৈরি করা হয়ে গেল! এখন আমরা MathController নামে একটি কন্ট্রোলার তৈরি করব এবং নিচের মত কোড লিখে আমাদের নতুন বানানো Math Facade টি কে টেস্ট করতে পারব।

<?php

namespace App\Http\Controllers;
use App\Facades\Math;
use Illuminate\Http\Request;

class MathController extends Controller
{
    public function getSum($number1,$number2){
        return Math::add($number1, $number2); 
    }

    public function getSub($number1,$number2){
        return Math::sub($number1, $number2); 
    }
}

Mastering Laravel with ReactJS Course

৫। এবার নিম্নোক্ত route দুইটি routes/web.php ফাইলে লিখে দিন এবং আপনার ব্রাউজারে চেক করুন।

use App\Http\Controllers\MathController;

Route::get('/sum/{number1}/{number2}', [MathController::class, 'getSum'])->name('sum');
Route::get('/sub/{number1}/{number2}', [MathController::class, 'getSub'])->name('sub');

Leave a Reply