লারাভেল: বেসিক এলোকুয়েন্ট মডেল এবং এমভিসি — কন্ট্রোলার -> মডেল -> ভিউ | Laravel: Basic Eloquent Model and MVC: Controller -> Model -> View | — Part 9.2

Abu Sayed
5 min readFeb 19, 2024

--

লারাভেলের মডেল, ভিউ এবং কন্ট্রোলার পদ্ধতি কি এবং কীভাবে তা কাজ করে? এই লেখায় আপনি এলোকুয়েন্ট মডেল এবং এমভিসি প্যাটার্নের বেসিক ব্যবহার শিখবেন। কোড উদাহরণসহ একটি সহজ বাংলা ব্যাখ্যা। ( Laravel: Basic Eloquent Model and MVC: Controller -> Model -> View )

হ্যালো বন্ধুরা, আজকে আমরা আলোচনা করবো লারাভেলের বেশ গুরুত্বপূর্ণ একটি বিষয়ের ওপর — এলোকুয়েন্ট মডেল এবং এমভিসি (MVC) প্যাটার্ন। এগুলো হচ্ছে লারাভেলের মূল ভিত্তি যা তোমাদের কোডিং অভিজ্ঞতাকে অনেক সহজ এবং আরও কার্যকর করে তুলবে। আসুন জেনে নেই এদের সম্পর্কে।

এলোকুয়েন্ট মডেল কী?

এলোকুয়েন্ট মডেল হচ্ছে লারাভেলের এমটি মডেল যা তোমাদের অ্যাপ্লিকেশনের ডেটা মডেলিং এবং ম্যানেজ করতে সাহায্য করে। এটি হচ্ছে একটা ক্লাস যা ডাটাবেজের টেবিলের সাথে মেপড এবং তোমাদের কে এই টেবিলের সাথে ইন্টারঅ্যাক্ট করতে দেয়। উদাহরণস্বরূপ, যদি তোমার একটা ‘users’ টেবিল থাকে, তাহলে তুমি ‘User’ নামে একটা মডেল ক্লাস তৈরি করতে পারো।

<?php
namespace App\Models;use Illuminate\Database\Eloquent\Model;class User extends Model
{
// Model properties and methods
}

এই User মডেল ক্লাসটি তোমাকে users টেবিলের সাথে কাজ করতে দেবে। তুমি এখান থেকে নতুন ইউজার তৈরি করতে পারবে, বিদ্যমান ইউজারদের আপডেট করতে পারবে, ডিলিট করতে পারবে এবং আরও অনেক কিছু।

এমভিসি প্যাটার্ন কী?

এমভিসি (Model-View-Controller) হচ্ছে একটা সফটওয়্যার ডিজাইন প্যাটার্ন যা অ্যাপ্লিকেশনের লজিক এবং ইউজার ইন্টারফেসকে আলাদা রাখে। এই প্যাটার্ন তিনটি মেইন কম্পোনেন্টে ভাগ করে:

  1. মডেল (Model): ডেটা স্ট্রাকচার এবং বিজনেস লজিক রাখার জায়গা। উপরের উদাহরণে দেখা User মডেল হচ্ছে একটা উদাহরণ।
  2. ভিউ (View): ইউজার ইন্টারফেস দেখানোর জায়গা। এই অংশ গ্রাহকদের কাছে যা দেখানো হবে তা নিয়ে কাজ করে।
  3. কন্ট্রোলার (Controller): মডেল এবং ভিউয়ের মাঝখানে থাকে এবং অ্যাপ্লিকেশন লজিক ম্যানেজ করে। ব্রাউজার থেকে রিকুয়েস্ট এসে এখানেই আসে আগে।

এই তিনটি অংশ পরস্পরের সাথে যোগাযোগ করে এবং একে অপরের কাজ করে। কন্ট্রোলারটি রিকুয়েস্ট হ্যান্ডেল করে, মডেলের সাহায্য নেয় যদি কোন ডেটা প্রসেসিং লাগে, এবং শেষে ভিউকে রেন্ডার করে।

লারাভেলে এমভিসি কাজ করে কীভাবে?

লারাভেলে এমভিসি প্যাটার্ন সুন্দর এবং আরও সুবিন্যস্ত ভাবে কাজ করে। একটু দেখি কীভাবে:

  1. রাউট (Route): প্রথমে, রাউটটি ব্রাউজার থেকে রিকুয়েস্টটি গ্রহণ করে এবং সেটাকে সংশ্লিষ্ট কন্ট্রোলারে পাঠায়।
  2. কন্ট্রোলার (Controller): কন্ট্রোলারটি রিকুয়েস্টটি প্রসেস করে। যদি কোন ডেটা লাগে, সে মডেলের সাহায্য নেয়। কন্ট্রোলারটি মডেল থেকে ডেটা নিয়ে ভিউয়ের জন্য প্রস্তুত করে।
  3. ভিউ (View): কন্ট্রোলারটি প্রস্তুতকৃত ডেটা ভিউকে পাঠায়। ভিউটি এই ডেটা ব্যবহার করে এবং ব্রাউজারে দেখানোর জন্য HTML রেন্ডার করে।

এটা একটু জটিল মনে হতে পারে। কিন্তু চল একটা উদাহরণ দেখি।

একটি উদাহরণ

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

  1. রাউট: প্রথমে তুমি একটা রাউট ডিক্লেয়ার করবে যা /posts/{id} URL এ মাপ করবে। এটা PostController@show মেথডে পাঠাবে।
Route::get('/posts/{id}', 'PostController@show');
  1. কন্ট্রোলার: PostController@show মেথডটি কাজ শুরু করবে। এটা id প্যারামিটার থেকে পোস্টের আইডি নেবে এবং Post মডেলকে একটা কোয়েরি করবে এই আইডি দিয়ে।
public function show($id)
{
$post = Post::findOrFail($id);
return view('post.show', compact('post'));
}
  1. মডেল: Post মডেলটি ডাটাবেজ থেকে সংশ্লিষ্ট পোস্টটি নিয়ে আসবে এবং কন্ট্রোলারকে ফেরত দেবে।
  2. ভিউ: কন্ট্রোলার post.show নামের একটা ভিউকে রেন্ডার করবে এবং পোস্টের ডেটা পাঠাবে। ভিউটি এই ডেটা ব্যবহার করে HTML জেনারেট করবে এবং ব্রাউজারে দেখাবে।
<!-- post.show.blade.php -->
<h1>{{ $post->title }}</h1>
<p>{{ $post->body }}</p>

দেখো, এইভাবে লারাভেলের মডেল, ভিউ এবং কন্ট্রোলার একসাথে কাজ করে। মডেলটি ডেটা ম্যানেজ করে, কন্ট্রোলারটি লজিক হ্যান্ডেল করে আর ভিউটি প্রেজেন্টেশন ভাগটা দেখে।

সার্ভিসের মাধ্যমে ডেটা অ্যাক্সেস করা

আরেকটু কম্প্লেক্স উদাহরণ দেখি। ধরি তুমি চাইছো একটা সার্ভিসের মাধ্যমে ডেটা অ্যাক্সেস করতে। যেমন তুমি একটা PostService তৈরি করতে চাও যা Post মডেলের সাথে কাজ করবে।

<?php
namespace App\Services;use App\Models\Post;class PostService
{
public function getPostById($id)
{
return Post::findOrFail($id);
}
public function createPost($data)
{
return Post::create($data);
}
// আরও মেথড যোগ করো
}

এখন তুমি PostController-এ এই PostService ইনজেক্ট করতে পারো।

<?php
namespace App\Http\Controllers;use App\Services\PostService;class PostController extends Controller
{
protected $postService;
public function __construct(PostService $postService)
{
$this->postService = $postService;
}
public function show($id)
{
$post = $this->postService->getPostById($id);
return view('post.show', compact('post'));
}
public function create()
{
// পোস্ট তৈরি করার ফর্ম দেখানো
return view('post.create');
}
public function store(Request $request)
{
$post = $this->postService->createPost($request->all());
// নতুন পোস্টটি দেখানো বা রিডায়রেক্ট করা
}
}

এইভাবে তুমি তোমার লজিক সার্ভিসে রাখতে পারো এবং কন্ট্রোলার থেকে সেগুলোকে কল করতে পারো। এটা তোমার কোডকে আরও পরিষ্কার এবং মেইনটেনেবল করে তুলবে।

সারা কথা

বুঝতে পারছো তো? এলোকুয়েন্ট মডেল এবং এমভিসি প্যাটার্ন লারাভেলের অন্যতম শক্তিশালী ফিচার। এরা তোমার অ্যাপ্লিকেশনকে আরও সুবিন্যস্ত এবং সহজেই মেইনটেনেবল করে তুলবে। আশা করি এই লেখাটি তোমাদের এদের মূল ধারণাটা বুঝতে সাহায্য করেছে। যদি কোন প্রশ্ন থাকে, কমেন্টে জানাও। ভালো থেকো, হ্যাপি কোডিং!

একটি ছোট প্রোগ্রাম

চল এবার একটা ছোট প্রোগ্রাম দেখি যা এলোকুয়েন্ট মডেল এবং এমভিসি প্যাটার্ন ব্যবহার করে।

<?php
namespace App\Http\Controllers;use App\Models\Post;
use Illuminate\Http\Request;
class PostController extends Controller
{
public function index()
{
$posts = Post::all();
return view('posts.index', compact('posts'));
}
public function show($id)
{
$post = Post::findOrFail($id);
return view('posts.show', compact('post'));
}
public function create()
{
return view('posts.create');
}
public function store(Request $request)
{
$post = Post::create($request->all());
return redirect()->route('posts.show', $post->id);
}
}

কীভাবে কাজ করছে

এই প্রোগ্রামটি একটি সাধারণ ব্লগ অ্যাপ্লিকেশনের জন্য মডেল, ভিউ এবং কন্ট্রোলার দেখাচ্ছে। আসুন একটু বিস্তারিত দেখি কীভাবে এটা কাজ করছে:

মডেল (Post): App\Models\Post ক্লাসটি হচ্ছে আমাদের এলোকুয়েন্ট মডেল যা posts টেবিলের সাথে মেপড। এই মডেল থেকে আমরা সকল পোস্ট (Post::all()), নির্দিষ্ট আইডি দিয়ে একটি পোস্ট (Post::findOrFail($id)), এবং নতুন পোস্ট তৈরি করতে পারবো (Post::create($data))।

কন্ট্রোলার (PostController): এই কন্ট্রোলারটি পাঁচটি মেথড রাখছে:

  • index(): সকল পোস্ট নিয়ে আসবে এবং posts.index ভিউটি রেন্ডার করবে।
  • show($id): নির্দিষ্ট আইডি দিয়ে পোস্টটি খুঁজে বের করে posts.show ভিউটি রেন্ডার করবে।
  • create(): নতুন পোস্ট তৈরি করার ফর্ম দেখানোর জন্য posts.create ভিউটি রেন্ডার করবে।
  • store(Request $request): নতুন পোস্টের ডেটা নিয়ে মডেলের মাধ্যমে তা তৈরি করবে এবং শো পেজে রিডাইরেক্ট করবে।

ভিউ (.blade.php ফাইল): কন্ট্রোলার থেকে পাঠানো ডেটা নিয়ে ভিউগুলো HTML রেন্ডার করবে। posts.index সকল পোস্টের লিস্ট দেখাবে, posts.show একটি নির্দিষ্ট পোস্টের ডিটেলস দেখাবে, আর posts.create ফর্মটি দেখাবে নতুন পোস্ট তৈরি করার জন্য।

সহজ একটা উদাহরণ হলেও এটি দেখাচ্ছে কীভাবে এলোকুয়েন্ট এবং এমভিসি প্যাটার্ন একসাথে কাজ করে। মডেলটি ডেটা আনে/পাঠায়, কন্ট্রোলারটি লজিক হ্যান্ডেল করে এবং ভিউটি প্রেজেন্টেশনের ভাগটা দেখে।

দিক নিয়ে আরও বিস্তারিত

এখন পর্যন্ত আমরা মূলত মডেল এবং কন্ট্রোলারের উপর দিক নিয়ে আলোচনা করেছি। এবার আসা যাক ভিউ সম্পর্কে আরও কিছু বিস্তারিত জানতে।

লারাভেলের ভিউ ফাইলগুলি .blade.php এক্সটেনশনে থাকে। এগুলো হচ্ছে সাধারণ PHP ফাইল যেখানে ব্লেড টেম্পলেটিং এঞ্জিন ব্যবহার করা যায়। ব্লেড এঞ্জিনটি PHP কোডের সাথে হটML মিশিয়ে দেয় এবং অনেক গুরুত্বপূর্ণ ফিচার যোগ করে দেয়। উদাহরণস্বরূপ:

<!-- posts/show.blade.php -->
@extends('layouts.app')@section('content')
<h1>{{ $post->title }}</h1>
<p>{{ $post->body }}</p>
@if($post->comments->count())
<h3>Comments:</h3>
<ul>
@foreach($post->comments as $comment)
<li>{{ $comment->body }} ({{ $comment->author->name }})</li>
@endforeach
</ul>
@endif
@endsection

এখানে কিছু লারাভেল-স্পেসিফিক ব্লেড সিনট্যাক্স দেখতে পাচ্ছো। @extends দিয়ে লেআউট ফাইল এক্সটেন্ড করা হচ্ছে, @section দিয়ে এক বিশেষ অংশ নির্ধারণ করা হচ্ছে। {{ }} দিয়ে ভেরিয়েবল আউটপুট করা হচ্ছে। আর @if, @foreach ইত্যাদি দিয়ে প্রোগ্রামিং লজিক লেখা হচ্ছে।

এই সিনট্যাক্সগুলো হচ্ছে ব্লেডের টেম্পলেটিং সুবিধাগুলি। এগুলো ব্যবহার করে আপনি পরিষ্কার, সংগঠিত এবং রিইউসেবল কোড লিখতে পারবেন। লারাভেল দেফল্টভাবে একটা resources/views ফোল্ডার দেয় এই ভিউ ফাইলগুলো রাখার জন্য।

এছাড়াও লারাভেলে ভিউ কম্পোজার এবং ভিউ পার্টশন দেওয়া আছে। এগুলোর মাধ্যমে আপনি ডেটা শেয়ার করতে এবং ভিউগুলোকে ছোট অংশে ভাগ করে রিইউজ করতে পারবেন। একটু বিশদে জানবো এসব ফিচার সম্পর্কে আগামী কোন পর্বে।

--

--

Abu Sayed

Bangladeshi Full Stack Web Dev, Sys Admin & DevOps Engineer. Skills: Data analysis, SQL, Kubernetes. Python, PHP & Laravel. Me on: bd.linkedin.com/in/imabusayed