লারাভেল এলোকোয়েন্ট এবং কন্ট্রোলার

এলোকোয়েন্ট হচ্ছে অবজেক্ট রিলেশনাল ম্যাপার (ORM), যেটা ল্যারাভেলের সাথে ইঙ্কুলেডড থাকে।  ডেটাবেজের প্রতিটা টেবিলের জন্য আলাদা আলাদা মডেল থাকে, যার মাধ্যমে টেবিলের সাথে ইন্টারেক্ট করা হয়। এলোকোয়েন্ট ডেটাবেজের CURD অপারেশন সহ SQL কোয়েরি করা সহজ করে দেয়। ল্যারাভেল এবং ডেটাবেজ লেখায় দেখেছি কিভাবে মডেল তৈরি করা যায়, কিভাবে মাইগ্রেশন করা যায়, কিভাবে ডেটা সিড করা যায় ইত্যাদি। সেগুলো এই লেখায় দরকার হবে।

এলোকোয়েন্ট ব্যবহার করে ডেটা কোয়েরি

এলোকোয়েন্ট ব্যবহার করে ডেটা কোয়েরির জন্য মডেল লাগবে, ডেটাবেজে কিছু ডেটা লাগবে। যেমন আমরা Note নামে একটা মডেল তৈরি করে নিব। তার জন্য কমান্ড লাইনে গিয়ে লিখবঃ

php artisan make:model Note

এখানে Note হচ্ছে মডেলের নাম। এটি তৈরি হবে প্রজেক্টের app > Models ফোল্ডারের ভেতর। মডেল তৈরি পরের কাজ হচ্ছে এই মডেল নোটের জন্য টেবিল স্কিমা তৈরি। তার জন্য প্রথমে ডেটাবেজ মাইগ্রেশন তৈরি করে নিবঃ

php artisan make:model Note --migration 

যা project>database>migrations ফোল্ডারের ভেতর …_create_notes_table.php নামে একটা ফাইল তৈরি করে দিবে।

<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    public function up(): void
    {
        Schema::create('notes', function (Blueprint $table) {
            $table->id();
            $table->string('title');
            $table->longText('note');
            $table->timestamps();
        });
    }
    public function down(): void
    {
        Schema::dropIfExists('notes');
    }
};

ডিফল্ট কলামের সাথে আরো title এবং notes নামে দুইটা কলাম যুক্ত করেছি আমরা। এবার ডেটাবেজ মাইগ্রেট করে নিবঃ

 php artisan migrate

যা ডেটাবেজে notes টেবিল ও এর কলাম গুলো তৈরি করে দিবে। কিভাবে ফেইক ডেটা ডেটাবেজে যোগ করা যায়, তা বিস্তারিত জানা যাবে ল্যারাভেল এবং ডেটাবেজ লেখা থেকে। ম্যানুয়ালিও ডেটাবেজ এডিট করে টেবিলে ডেটা এড করা যায়। ধরে নিচ্ছি আপনি notes টেবিলে কিছু ডেটা যোগ করেছেন।

এখন আমরা চাইলে Eloquent ব্যবহার করে ডেটা কোয়েরী করতে পারি। যেমন সব গুলো ডেটা পেতে চাইলে Note::all() কল করতে পারি। যা আমাদের নোট টেবিলের সব গুলো ডেটা রিটার্ণ করবে। নিচে একেবারে ব্যাসিক একটা রুট লিখেছি app>routes>web.ph ফাইলেঃ

use App\Models\Note; // Include Note.php 

Route::get('/', function () {
    return Note::all();
});

যা আমাদের সব গুলো নোট JSON ফরমেটে রিটার্ণ করবে। ব্রাউজারে যে কোন একটা JSON Viewer এক্সটেনশন যোগ করলে ফরমেট করা অবস্থায় দেখা যাবে। চাইলে পোস্টম্যানও ব্যবহার করতে পারিঃ

welcome.bldae.php ফাইল ওপেন করি। এরপর এই নোট গুলো দেখানোর জন্য কোড লিখিঃ

@foreach ($notes as $note)
    <div style="border: 1px solid #ccc; padding: 10px; margin: 10px">
        <h2>{{ $note->title }}</h2>
        <p>{{ $note->note }}</p>

    </div>
@endforeach

এবং web.php ফাইলে রুট থেকে ভিউতে সব গুলো নোট পাস করিঃ

Route::get('/', function () {
    $notes = Note::all();
    return view('welcome', ['notes' => $notes]);
});

আমরা দেখব ব্রাউজারে কি সুন্দর নোট সব গুলো দেখা যাচ্ছে। কিছু সিএসএস যোগ করে দিলেই সুন্দর মত সব দেখাবে।

একটা নোট পেতে পারি এভাবেঃ

Note::find(1); // Finds a note by primary key

লারাভেল ভিউ এবং রুটস লেখার ডাইনামিক রুট অংশে আমরা দেখেছি কিভাবে রুট ডাইনামিক রুট তৈরি করা যায়। যেমন কেউ যদি example.com/note/1 এ যায়, আমরা 1 আইডি এর নোট দেখাতে পারি এভাবেঃ

Route::get('/note/{id}', function ($id) {
    return Note::find($id);
});

যা আমাদের একটা সিঙ্গেল নোট রিটার্ণ করবেঃ

আমরা নোট গুলো দেখার জন্য একটা রুট লাগবে। নোট তৈরি করার জন্য একটা রুট লাগবে। সিঙ্গেল নোট দেখার জন্য একটা রুট লাগবে ইত্যাদি। আবার প্রতিটা রুটে আলাদা আলাদা করে ডেটা কোয়েরি অথবা বিভিন্ন অপারেশনের জন্য যদি কোড লিখি, তাহলে web.php ফাইলটা কেমন বিশ্রী হয়ে যাবে না? একাধিক টেবিল থাকলে তো জগাখিচুড়ি হয়ে যাবে। এর সমাধান হচ্ছে কন্ট্রোলার। প্রতিটা মডেলের জন্য আলাদা আলাদা কন্ট্রোলার তৈরি করে নিতে পারি আমরা।

ল্যারাভেল কন্ট্রোলার

কন্ট্রোলারের কাজ হচ্ছে কোন কিছু কন্ট্রোল করা। যেমন রুটের মধ্যে আমরা যে লিখেছি return view(‘welcome’, [‘notes’ => $notes]); এটিই কন্ট্রোলার। এখানে

Route::get('/', function () {
    $notes = Note::all();
    return view('welcome', ['notes' => $notes]);
});

এখানে সিম্পল কোয়েরি করে সব গুলো নোট এক সাথে দেখানো হয়েছে। রিয়েল প্রজেক্টে কমপ্লেক্স কোয়েরি করতে হবে। আর তাই আমাদের দরকার হবে আলাদা ক্লাস, যাকে আমরা কন্ট্রোলার বলব। ল্যারাভেল MVC ফ্রেমওয়ার্ক। ভিউ হচ্ছে প্রেজেন্টেশন লেয়ার। যেমন welcome.blade.php হচ্ছে ভিউ। মডেল সম্পর্কেও জেনেছি। যেমন User.php অথবা Note.php হচ্ছে মডেল, যা থাকে app>Http>model ফোল্ডারে। আরেকটা ফোল্ডার দেখব এই Http ফোল্ডারের মধ্যে। যা হচ্ছে Controllers। যেখানে controller.php নামে একটা স্যাম্পল কন্ট্রোলার তৈরি করা হয়েছে।

Note মডেলের জন্য আমরা php artisan ব্যবহার করে কন্ট্রোলার তৈরি কতে নিতে পারিঃ

php artisan make:controller NoteController --resource

যা app>Http>Controllers ফোল্ডারে NoteController.php ফাইল নামে একটা কন্ট্রোলার তৈরি করে দিবে। এখানে –resource মডিফায়ার দিয়ে বলে দিয়েছি এটা একটা রিসোর্স কন্ট্রোলার। যা আমাদের প্রয়োজনীয় কোড জেনারেট করে দিবে। এখানে অনেক গুলো ফাংশন রয়েছে। যেমন index, create, store ইত্যাদি। উদাহরণের সুবিধার্থে আমি সামান্য একটু পরিবর্তন করেছি। প্রতিটা ফাংশন থেকে ফাংশন কি কাজ করবে, তা রিটার্ণ করেছিঃ

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class NoteController extends Controller{
    public function index(){
        return "All notes";
    }
    public function create() {
        return "Create new note";
    }
    public function store(Request $request){
        return "Store a note to database"
    }

    public function show(string $id){
        return "Show single note";
    }


    public function edit(string $id)
    {
        return "Edit a note";
    }

    public function update(Request $request, string $id)
    {
        return "Update a note";
    }

    public function destroy(string $id)
    {
        return "Delete a note";
    }
}

এবার রুট ফাইল web.php তে একটা রুট যোগ করি /notes নামে। যেখান যার কন্টেন্ট হবে NoteController এর index ফাংশনঃ

<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\NoteController;

Route::get('/notes', [NoteController::class,'index']);

আমরা যদি এখন ব্রাউজারে গিয়ে example.com/notes ব্রাউজ করি, থালে দেখব All notes লেখাটি রিটার্ণ করেছে। এবার এই স্ট্রিং এর পরিবর্তে ডেটাবেজ থেকে সব গুলো নোট দেখাবো। NoteController এর index মেথড পরিবর্তন করে নিচের কোড লিখিঃ

 public function index()
    {
        return Note::all();
    }

ব্রাউজারে example.com/notes ভিজিট করলে সব গুলো নোট এর JSON ফরমেট দেখাবে। যেহেতু আমরা Note মডেল ব্যবহার করব এই কন্ট্রোলারে, তাই Note.php ইনক্লুড করে নিতে হবে use App\Models\Note; এর মাধ্যমে। আবার এই index() মেথড থেকে আমরা চাইলে ভিউও রিটার্ন করতে পারিঃ

    public function index()
    {
        $notes = Note::all();
        return view('welcome', ['notes' => $notes]);
    }

সাধারণত show(string $id) ফাংশন দিয়ে একটা সিঙ্গেল নোট দেখানোর জন্য কোড লেখা হয়। ডেটাবেজ থেকে আইডি ব্যবহার করে সিঙ্গেল এন্ট্রি কিভাবে পাওয়া যায় আমরা তা জেনেছি। যেমনঃ

    public function show(string $id)
    {
       return Note::find($id);
    }

এই সিঙ্গেল এন্ট্রি পাওয়ার জন্য আমাদের রুট এড করতে হবে। আর তার জন্য web.php ফাইলে নিচের রুট যোগ করিঃ

Route::get('/notes/{id}', [NoteController::class,'show']);

ব্রাউজারে গিয়ে যদি example.com/notes/1 ভিজিট করি, তাহলে আমাদের ডেটাবেজের প্রথম নোটের JSON ফরমেট রিটার্ণ করবে।

এভাবে আমরা create, update, delete এসবের জন্য আলাদা আলাদা রুট তৈরি করতে পারি। কিন্তু লারাভেলে খুব সহজেই রিসোর্স কন্ট্রোলার থেকে এক লাইনের মাধ্যমেই সব গুলো এন্ডপয়েন্টের জন্য রুট তৈরি করা যায়ঃ

Route::resource('notes', NoteController::class);

এতই সিম্পল! ব্রাউজারে আপনি চাইলে এখন example.com/notes, /edit, /update, /delete সহ অন্যান্য এন্ডপয়েন্ট গুলো ভিজিট করে দেখতে পারেন। দেখবেন NoteController এর মেথড গুলো থেকে রেসপন্স করছে। ইন্টারেস্টিং না? এ জন্য web.php ফাইলের শুরুতে use App\Http\Controllers\NoteController; ইনক্লুড করে নিতে হবে। সম্পূর্ণ web.php রুট ফাইলঃ

<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\NoteController;

Route::resource('notes', NoteController::class);

এই পর্যন্ত আমরা যা শিখেছি, তা দিয়ে আমরা চাইলে একটা ব্যাসিক অ্যাপ তৈরি করে ফেলতে পারি। যেখানে ডেটাবেজের সব গুলো অপারেশন (CRUD – ক্রিয়েট, রিড, আপডেট, ডীলেট) চালানো যাবে।

Leave a Reply