08 June, 2015
আমরা অনেক সময়ই লারাভেল অ্যাপ্লিকেশন তৈরির সময় সার্ভিস প্রোভাইডার তৈরি করে থাকি। এই সার্ভিস প্রোভাইডারগুলি লারাভেল সার্ভিস কনটেইনারে রেজিস্টার করা থাকে। লারাভেল যখন কোন রিকোয়েস্ট গ্রহণ করে তখন এই সার্ভিস কনটেইনার ইনিশিয়ালাইজ হয়, এবং রিকোয়েস্টকে প্রসেস করতে যদি সার্ভিসের প্রয়োজন পড়ে সেটা কাজ করে রিকোয়েস্টকে প্রসেস করে রেসপন্স তৈরি করতে সাহায্য করে।
সহজ একটা উদাহরন দেখুন। ধরুন আপনি একটি টু-ডু অ্যাপের একজন রেজিস্টার ইউজার, এবং আপনি আপনার টু-ডু লিস্ট দেখতে চাইছেন। এক্ষেত্রে লারাভেলের কাছে রিকোয়েস্ট করার পর লারাভেল সার্ভিস কনটেইনারের কাছে রিকোয়েস্টটা পাঠায় এবং সেটি তখন দেখে যে আপনার রিকোয়েস্টটিকে প্রসেস করতে ইলোকোয়েন্ট সার্ভিসটির প্রয়োজন। তখন ইলোকোয়েন্ট আপনার রিকোয়েস্টটি প্রসেস করবে। এরপর ধরুন আপনাকে একটি নোটিফিকেশন দেয়া প্রয়োজন। সেক্ষেত্রে সার্ভিস কনটেইনার সেসন সার্ভিস প্রোভাইডারের সাহায্য নেবে।
এক্ষেত্রে দেখা যাচ্ছে একটা রিকোয়েস্ট প্রসেস করতে সবগুলো সার্ভিস প্রোভাইডারের দরকার নেই। হয়ত ২-৩টা প্রোভাইডারের প্রয়োজন। সেক্ষেত্রে আপনি চাইলে ডিফার্ড সার্ভিস প্রোভাইডার ব্যবহার করতে পারবেন। নাম দেখেই নিশ্চয়ই বুঝতে পারছেন, এই ডিফার্ড সার্ভিস প্রোভাইডার শুধুমাত্র যখন প্রয়োজন তখনই লোড হবে। অন্যান্য রিকোয়েস্টে এটি লোড হবে না। এটি আপনার অ্যাপ্লিকেশন পারফরমেন্স বহুগুনে বাড়িয়ে দিতে পারে।
এখন কথা হচ্ছে কিভাবে এই ডিফার্ড সার্ভিস প্রোভাইডার তৈরি করবেন? সেটিও খুব সহজ। সাধারন সার্ভিস প্রোভাইডারের মতই একটি আর্টিসান কমান্ডের মাধ্যমে আপনি এটি তৈরি করতে পারবেন। এর জন্য টার্মিনালে নিচের কমান্ডটি লিখুন-
php artisan make:provider TestServiceProvider
এর ফলে আপনার অ্যাপ্লিকেশনের app/Providers
ফোল্ডারের মধ্যে একটি নতুন ফাইল তৈরি হবে TestServiceProvider.php
নামে। এটি দেখতে হবে এরকম-
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class TestServiceProvider extends ServiceProvider {
/**
* Bootstrap the application services.
*
* @return void
*/
public function boot()
{
//
}
/**
* Register the application services.
*
* @return void
*/
public function register()
{
//
}
}
এই ক্লাসে আপনি যদি একটি প্রটেক্টেড প্রপার্টি তৈরি করেন $defer নামে এবং সেটির ভ্যালু ট্রুু করে দেন, তাহলে সেটিই ডিফার্ড সার্ভিস প্রোভাইডার হিসেবে কাজ করবে।
protected $defer = true;
এছাড়া এই সার্ভিস প্রভাইডের বাকি কোড সাধারন সার্ভিস প্রোভাইডারের মত করেই লিখতে হবে।