DEV Community

Ruhul Amin Sujon
Ruhul Amin Sujon

Posted on • Edited on

𝐏đĢ𝐨𝐒𝐨𝐟𝐭 𝐄𝐱𝐩𝐞đĢđĸ𝐞𝐧𝐜𝐞: 𝟑-𝟓 𝐘𝐞𝐚đĢ. Laravel IQ - Part-01

āĻĒā§āϰāĻļā§āύ 1: GET āĻāĻŦāĻ‚ POST āĻāϰ āĻŽāĻ§ā§āϝ⧇ āĻĒāĻžāĻ°ā§āĻĨāĻ•ā§āϝ āϕ⧀?

āωāĻ¤ā§āϤāϰ:

GET: āχāωāφāϰāĻāϞ āĻāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āĻĄā§‡āϟāĻž āĻĒāĻžāĻ āĻžāϝāĻŧ, āϏāĻžāϧāĻžāϰāĻŖāϤ āĻĄā§‡āϟāĻž āĻĒāĻĄāĻŧāĻžāϰ āϜāĻ¨ā§āϝāĨ¤
POST: body āĻāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āĻĄā§‡āϟāĻž āĻĒāĻžāĻ āĻžāϝāĻŧ, āϏāĻžāϧāĻžāϰāĻŖāϤ āύāϤ⧁āύ āĻĄā§‡āϟāĻž āϤ⧈āϰāĻŋ āĻŦāĻž āϏāĻžāĻŦāĻŽāĻŋāϟ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝāĨ¤

āĻĒā§āϰāĻļā§āύ ⧍: āφāĻĒāύāĻŋ āϕ⧀āĻ­āĻžāĻŦ⧇ Laravel-āĻ Route Model Binding āχāĻŽāĻĒā§āϞāĻŋāĻŽā§‡āĻ¨ā§āϟ āĻ•āϰāĻŦ⧇āύ? āĻāĻ•āϟāĻŋ āωāĻĻāĻžāĻšāϰāĻŖ āĻĻāĻŋāϤ⧇ āĻĒāĻžāϰ⧇āύ āĻ•āĻŋ?

āωāĻ¤ā§āϤāϰ:

Laravel-āĻ Route Model Binding āĻāĻŽāύ āĻāĻ•āϟāĻŋ āĻĢāĻŋāϚāĻžāϰ āϝāĻž āĻ…āĻŸā§‹āĻŽā§‡āϟāĻŋāĻ•āĻ­āĻžāĻŦ⧇ URI-āϤ⧇ āĻĻ⧇āĻ“ā§ŸāĻž ID āĻŦāĻž slug āĻ…āύ⧁āϝāĻžā§Ÿā§€ āϏāĻ‚āĻļā§āϞāĻŋāĻˇā§āϟ āĻŽāĻĄā§‡āϞ⧇āϰ āχāύāĻ¸ā§āĻŸā§āϝāĻžāĻ¨ā§āϏ āϖ⧁āρāĻœā§‡ āĻāύ⧇ āĻ•āĻ¨ā§āĻŸā§āϰ⧋āϞāĻžāϰ⧇ āĻĒāĻžāϏ āĻ•āϰ⧇ āĻĻā§‡ā§ŸāĨ¤ āĻāϤ⧇ āĻ•āϰ⧇ āφāϞāĻžāĻĻāĻž āĻ•āϰ⧇ find() āĻŦāĻž where() āĻŽā§‡āĻĨāĻĄ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻšā§Ÿ āύāĻžāĨ¤

Laravel-āĻ āĻĻ⧁āχ āϧāϰāύ⧇āϰ Route Model Binding āφāϛ⧇:

  1. Implicit Binding (āĻ¸ā§āĻŦ⧟āĻ‚āĻ•ā§āϰāĻŋ⧟)
  2. Explicit Binding (āĻ¸ā§āĻĒāĻˇā§āϟāĻ­āĻžāĻŦ⧇)

✅ āωāĻĻāĻžāĻšāϰāĻŖ: Implicit Route Model Binding

āϧāϰāĻž āϝāĻžāĻ•, āφāĻŽāĻžāĻĻ⧇āϰ āĻāĻ•āϟāĻŋ Post āĻŽāĻĄā§‡āϞ āφāϛ⧇āĨ¤

🔸 Route:

use App\Models\Post;

Route::get('/posts/{post}', [PostController::class, 'show']);
Enter fullscreen mode Exit fullscreen mode

āĻāĻ–āĻžāύ⧇ {post} āĻšāϞ route parameter āĻāĻŦāĻ‚ Laravel āĻŦ⧁āĻā§‡ āύāĻŋāĻŦ⧇ āϝ⧇ āĻāϟāĻŋ App\Models\Post āĻŽāĻĄā§‡āϞ āĻāϰ instanceāĨ¤

🔸 Controller:

public function show(Post $post)
{
    return view('posts.show', compact('post'));
}
Enter fullscreen mode Exit fullscreen mode

āĻāĻ–āĻžāύ⧇ $post āĻ…āĻŸā§‹āĻŽā§‡āϟāĻŋāĻ•āĻ­āĻžāĻŦ⧇ āĻ“āχ ID āĻ…āύ⧁āϝāĻžā§Ÿā§€ āĻĄāĻžāϟāĻžāĻŦ⧇āϜ āĻĨ⧇āϕ⧇ āϖ⧁āρāĻœā§‡ āφāύāĻž āĻšāĻŦ⧇āĨ¤ āϝāĻĻāĻŋ ID āĻŽā§‡āϞ⧇ āύāĻž, āϤāĻžāĻšāϞ⧇ 404 error āĻĻ⧇āĻ“ā§ŸāĻž āĻšāĻŦ⧇āĨ¤

✅ āωāĻĻāĻžāĻšāϰāĻŖ: Explicit Route Model Binding

āĻāϟāĻŋ āϤāĻ–āύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻšā§Ÿ āϝāĻ–āύ āφāĻĒāύāĻŋ default key (ID) āĻ›āĻžā§œāĻž āĻ…āĻ¨ā§āϝ āĻ•āĻŋāϛ⧁ āĻĻāĻŋā§Ÿā§‡ āϖ⧁āρāϜāϤ⧇ āϚāĻžāύ, āϝ⧇āĻŽāύ slugāĨ¤

🔸 RouteServiceProvider:

use App\Models\Post;
use Illuminate\Support\Facades\Route;

public function boot()
{
    Route::bind('post', function ($value) {
        return Post::where('slug', $value)->firstOrFail();
    });
}
Enter fullscreen mode Exit fullscreen mode

🔸 Route:

Route::get('/posts/{post}', [PostController::class, 'show']);
Enter fullscreen mode Exit fullscreen mode

🔸 Controller:

public function show(Post $post)
{
    return view('posts.show', compact('post'));
}
Enter fullscreen mode Exit fullscreen mode

āĻāĻ–āĻžāύ⧇ route āĻāϰ {post} āĻ…āĻ‚āĻļāϟāĻž āĻĻāĻŋā§Ÿā§‡ slug āĻ…āύ⧁āϏāĻžāϰ⧇ post āĻĒāĻžāĻ“ā§ŸāĻž āϝāĻžāĻŦ⧇āĨ¤

🔚 āωāĻĒāϏāĻ‚āĻšāĻžāϰ:

Route Model Binding Laravel-āĻ āϕ⧋āĻĄāϕ⧇ āĻĒāϰāĻŋāĻˇā§āĻ•āĻžāϰ āĻ“ āϛ⧋āϟ āϰāĻžāϖ⧇ āĻāĻŦāĻ‚ āĻŦ⧇āϟāĻžāϰ āĻĒāĻžāϰāĻĢāĻ°ā§āĻŽā§‡āĻ¨ā§āϏ āύāĻŋāĻļā§āϚāĻŋāϤ āĻ•āϰ⧇āĨ¤ Implicit binding āϏāĻšāϜ āĻāĻŦāĻ‚ āĻĻā§āϰ⧁āϤ, āφāϰ explicit binding āĻ•āĻžāĻ¸ā§āϟāĻŽ āĻĢāĻŋāĻ˛ā§āĻĄā§‡āϰ āϜāĻ¨ā§āϝ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻšā§ŸāĨ¤

āĻĒā§āϰāĻļā§āύ ā§Š: Laravel-āĻāϰ Eloquent ORM-āĻ Eager Loading āϕ⧀? āĻāϟāĻŋ Lazy Loading āĻĨ⧇āϕ⧇ āϕ⧀āĻ­āĻžāĻŦ⧇ āφāϞāĻžāĻĻāĻž? N+1 āϏāĻŽāĻ¸ā§āϝāĻž āϕ⧀, āĻāϟāĻŋ āϕ⧇āύ āĻšā§Ÿ āĻāĻŦāĻ‚ āĻ•āĻŋāĻ­āĻžāĻŦ⧇ āĻāϟāĻŋ āϏāĻŽāĻžāϧāĻžāύ āĻ•āϰāĻŦ⧇āύ?

āωāĻ¤ā§āϤāϰ:

✅ Eager Loading āϕ⧀?

Eager Loading āĻšāϞ Eloquent ORM-āĻāϰ āĻāĻ•āϟāĻŋ āĻŸā§‡āĻ•āύāĻŋāĻ• āϝāĻž āϏāĻŽā§āĻĒāĻ°ā§āĻ•āĻŋāϤ āĻŽāĻĄā§‡āϞ⧇āϰ āĻĄā§‡āϟāĻž āφāϗ⧇āχ (āĻāĻ•āϏāĻžāĻĨ⧇) āϞ⧋āĻĄ āĻ•āϰ⧇ āφāύ⧇, āϝāĻžāϤ⧇ āĻ…āϤāĻŋāϰāĻŋāĻ•ā§āϤ query āύāĻž āϚāϞ⧇āĨ¤

🔸 āϏāĻžāϧāĻžāϰāĻŖāĻ­āĻžāĻŦ⧇, āφāĻŽāϰāĻž with() āĻŽā§‡āĻĨāĻĄ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ eager loading āĻ•āϰāĻŋāĨ¤

đŸŸĸ āωāĻĻāĻžāĻšāϰāĻŖ:

$users = User::with('posts')->get();
Enter fullscreen mode Exit fullscreen mode

āĻāχ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇, āĻĒā§āϰāϤāĻŋāϟāĻŋ User āĻāϰ āϏāĻžāĻĨ⧇ āϏāĻŽā§āĻĒāĻ°ā§āĻ•āĻŋāϤ Post āϗ⧁āϞ⧋āĻ“ āĻāĻ•āϏāĻžāĻĨ⧇ āĻāĻ•āϟāĻŋ āφāϞāĻžāĻĻāĻž query āĻĻāĻŋā§Ÿā§‡ āφāϗ⧇āχ āϞ⧋āĻĄ āĻšā§Ÿā§‡ āϝāĻžāĻŦ⧇āĨ¤ āĻāϤ⧇ performance āĻ­āĻžāϞ⧋ āĻšā§ŸāĨ¤

✅ Lazy Loading āϕ⧀?

Lazy Loading āĻŽāĻžāύ⧇ āĻšāϞ, āϝāĻ–āύ āĻŽā§‚āϞ āĻŽāĻĄā§‡āϞ āϞ⧋āĻĄ āĻšā§Ÿ āϤāĻ–āύ āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āĻŽā§‚āϞ āĻĄā§‡āϟāĻž āϞ⧋āĻĄ āĻšā§ŸāĨ¤ āĻ•āĻŋāĻ¨ā§āϤ⧁ āϝāĻ–āύ āϏāĻŽā§āĻĒāĻ°ā§āĻ•āĻŋāϤ āĻĄā§‡āϟāĻž āĻāĻ•ā§āϏ⧇āϏ āĻ•āϰāĻž āĻšā§Ÿ, āϤāĻ–āύ āφāϞāĻžāĻĻāĻž āĻ•āϰ⧇ query āϚāϞ⧇āĨ¤

🔴 āωāĻĻāĻžāĻšāϰāĻŖ:

$users = User::all();

foreach ($users as $user) {
    echo $user->posts; // āĻĒā§āϰāϤāĻŋāĻŦāĻžāϰ āĻāĻ–āĻžāύ⧇ āφāϞāĻžāĻĻāĻž query āϚāϞāĻŦ⧇
}
Enter fullscreen mode Exit fullscreen mode

āĻāχ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇, āĻĒā§āϰāĻĨāĻŽā§‡ āϏāĻŦ User āϞ⧋āĻĄ āĻšāĻšā§āϛ⧇, āϤāĻžāϰāĻĒāϰ āĻĒā§āϰāϤāĻŋāϟāĻŋ User āĻāϰ āϜāĻ¨ā§āϝ posts āϞ⧋āĻĄ āĻ•āϰāϤ⧇ āφāϞāĻžāĻĻāĻž āφāϞāĻžāĻĻāĻž query āϚāϞāĻŦ⧇āĨ¤ āĻāϟāĻžāϕ⧇āχ āĻŦāϞ⧇ N+1 problemāĨ¤

❗ N+1 Problem āϕ⧀?

N+1 Problem āϤāĻ–āύ āĻšā§Ÿ, āϝāĻ–āύ āφāĻĒāύāĻŋ āĻāĻ•āϟāĻŋ āĻŽā§‚āϞ āĻŽāĻĄā§‡āϞ (āϝ⧇āĻŽāύ User) āϞ⧋āĻĄ āĻ•āϰ⧇āύ āĻāĻŦāĻ‚ āĻĒā§āϰāϤāĻŋāϟāĻŋ instance āĻāϰ āϜāĻ¨ā§āϝ āϏāĻŽā§āĻĒāĻ°ā§āĻ•āĻŋāϤ āĻŽāĻĄā§‡āϞ (āϝ⧇āĻŽāύ Post) āφāϞāĻžāĻĻāĻž āĻ•āϰ⧇ āϞ⧋āĻĄ āĻšā§ŸāĨ¤

🔸 āωāĻĻāĻžāĻšāϰāĻŖ:

$users = User::all(); // 1 query
foreach ($users as $user) {
    $user->posts;     // āĻĒā§āϰāϤāĻŋāϟāĻŋ user āĻāϰ āϜāĻ¨ā§āϝ 1 āĻ•āϰ⧇ query = N query
}

Enter fullscreen mode Exit fullscreen mode

āĻŽā§‹āϟ query = 1 (User) + N (Posts) = N+1

āĻāχ āϏāĻŽāĻ¸ā§āϝāĻž performance āĻ•āĻŽāĻŋā§Ÿā§‡ āĻĻā§‡ā§ŸāĨ¤

✅ āϏāĻŽāĻžāϧāĻžāύ: Eager Loading āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ

$users = User::with('posts')->get(); // 2āϟāĻŋ query-āϤ⧇āχ āĻ•āĻžāϜ āĻļ⧇āώ
Enter fullscreen mode Exit fullscreen mode
  • ā§§āϟāĻŋ query āĻĻāĻŋā§Ÿā§‡ āϏāĻŦ User āφāύāĻž āĻšā§ŸāĨ¤
  • ⧍⧟ query āĻĻāĻŋā§Ÿā§‡ āϏāĻŦ posts āφāύāĻž āĻšā§Ÿ āϝ⧇āϗ⧁āϞ⧋ āϐ āϏāĻŦ user-āĻāϰāĨ¤

🧠 Tips:

  • multiple relation eager load āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ:
Post::with(['user', 'comments'])->get();
Enter fullscreen mode Exit fullscreen mode
  • nested relation eager load āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ:
User::with('posts.comments')->get();
Enter fullscreen mode Exit fullscreen mode

🔚 āϏāĻ‚āĻ•ā§āώ⧇āĻĒ⧇ āĻĒāĻžāĻ°ā§āĻĨāĻ•ā§āϝ:

Image description

āĻĒā§āϰāĻļā§āύ 4: Laravel-āĻ Accessor āĻāĻŦāĻ‚ Mutator āϕ⧀ āĻāĻŦāĻ‚ āĻāϗ⧁āϞ⧋ āϕ⧀āĻ­āĻžāĻŦ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻšāϝāĻŧ?

āωāĻ¤ā§āϤāϰ:

  • Accessor: āĻŽāĻĄā§‡āϞ āĻĨ⧇āϕ⧇ āĻĄā§‡āϟāĻž āĻĒāĻĄāĻŧāĻžāϰ āφāϗ⧇ āĻĄā§‡āϟāĻž āĻĒā§āϰāϏ⧇āϏ āĻ•āϰ⧇āĨ¤
  • Mutator: āĻŽāĻĄā§‡āϞ⧇ āĻĄā§‡āϟāĻž āϏ⧇āĻ­ āĻ•āϰāĻžāϰ āφāϗ⧇ āĻĒā§āϰāϏ⧇āϏ āĻ•āϰ⧇āĨ¤
// Accessor
public function getFullNameAttribute()
{
    return $this->first_name . ' ' . $this->last_name;
}

// Mutator
public function setPasswordAttribute($value)
{
    $this->attributes['password'] = bcrypt($value);
}
Enter fullscreen mode Exit fullscreen mode

āĻĒā§āϰāĻļā§āύ 5: Laravel-āĻ Authentication āĻāĻŦāĻ‚ Authorization āĻĻ⧁āϟāĻŋ āĻ­āĻŋāĻ¨ā§āύ āĻ•āĻŋāĻ¨ā§āϤ⧁ āϏāĻŽā§āĻĒāĻ°ā§āĻ•āĻŋāϤ āϏāĻŋāĻ•āĻŋāωāϰāĻŋāϟāĻŋ āĻ•āύāϏ⧇āĻĒā§āϟāĨ¤ āύāĻŋāĻšā§‡ āĻŦāĻžāĻ‚āϞāĻž āĻ­āĻžāώāĻžā§Ÿ āĻŦāĻŋāĻ¸ā§āϤāĻžāϰāĻŋāϤ āĻŦā§āϝāĻžāĻ–ā§āϝāĻž āĻĻ⧇āĻ“ā§ŸāĻž āĻšāϞ⧋:

āωāĻ¤ā§āϤāϰ:

✅ Authentication (āĻĒā§āϰāĻŽāĻžāĻŖā§€āĻ•āϰāĻŖ)

Authentication āĻŽāĻžāύ⧇ āĻšāĻšā§āϛ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āĻĒāϰāĻŋāϚ⧟ āϝāĻžāϚāĻžāχ āĻ•āϰāĻž — āϏ⧇ āϕ⧇?

🔹 Laravel-āĻ Authentication āϕ⧀āĻ­āĻžāĻŦ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇:

  • āχāωāϜāĻžāϰ āϞāĻ—āχāύ āĻ•āϰ⧇ (āχāĻŽā§‡āχāϞ/āĻĒāĻžāϏāĻ“ā§ŸāĻžāĻ°ā§āĻĄ āĻĻāĻŋā§Ÿā§‡)
  • Laravel Auth āĻĢā§āϝāĻžāϏ⧇āĻĄ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āĻĒāϰāĻŋāϚ⧟ āύāĻŋāĻļā§āϚāĻŋāϤ āĻ•āϰ⧇
  • āϏāĻĢāϞ āĻšāϞ⧇ session āĻŦāĻž token āĻāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āχāωāϜāĻžāϰāϕ⧇ āϞāĻ—āχāύ āĻ…āĻŦāĻ¸ā§āĻĨāĻžā§Ÿ āϰāĻžāϖ⧇

🔧 āωāĻĻāĻžāĻšāϰāĻŖ:

if (Auth::check()) {
    // āχāωāϜāĻžāϰ āϞāĻ—āχāύ āĻ…āĻŦāĻ¸ā§āĻĨāĻžā§Ÿ āφāϛ⧇
}
Enter fullscreen mode Exit fullscreen mode

🔐 Laravel Authentication Features:

  • Login, Register, Logout
  • Password reset
  • API Token authentication (Sanctum/Passport)
  • Laravel Breeze, Jetstream, Fortify (Authentication scaffolding)

✅ Authorization (āĻ…āύ⧁āĻŽā§‹āĻĻāύ)

Authorization āĻŽāĻžāύ⧇ āĻšāĻšā§āϛ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āĻ•āĻŋ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻ•āĻžāϜ āĻ•āϰāĻžāϰ āĻ…āύ⧁āĻŽāϤāĻŋ āĻĒāĻžāĻŦ⧇?

👉 āĻĒāϰāĻŋāϚ⧟ āύāĻŋāĻļā§āϚāĻŋāϤ āĻšāĻ“ā§ŸāĻžāϰ āĻĒāϰ⧇, Laravel āĻĻ⧇āϖ⧇ āχāωāϜāĻžāϰ āϕ⧋āύ⧋ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āϰāĻŋāϏ⧋āĻ°ā§āϏ āĻ…ā§āϝāĻžāĻ•ā§āϏ⧇āϏ āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŦ⧇ āĻ•āĻŋ āύāĻžāĨ¤

🔹 Laravel-āĻ Authorization āϕ⧀āĻ­āĻžāĻŦ⧇ āĻšā§Ÿ:

  • Gate āĻāĻŦāĻ‚ Policy āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇
  • āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āϰ⧋āϞ āĻŦāĻž āĻĒāĻžāϰāĻŽāĻŋāĻļāύ āϝāĻžāϚāĻžāχ āĻ•āϰāĻž āĻšā§Ÿ

🔧 āωāĻĻāĻžāĻšāϰāĻŖ:

if (Auth::user()->can('update', $post)) {
    // āχāωāϜāĻžāϰ āĻāχ āĻĒā§‹āĻ¸ā§āϟ āφāĻĒāĻĄā§‡āϟ āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŦ⧇
}
Enter fullscreen mode Exit fullscreen mode

🔁 Authentication vs Authorization āϤ⧁āϞāύāĻž:

Image description

✅ Laravel Example Scenario

// Authentication Middleware
Route::middleware('auth')->group(function () {

    // Authorization check
    Route::get('/post/{post}/edit', function (Post $post) {
        if (Gate::allows('edit-post', $post)) {
            // Edit form
        } else {
            abort(403);
        }
    });

});
Enter fullscreen mode Exit fullscreen mode

🔚 āωāĻĒāϏāĻ‚āĻšāĻžāϰ

  • Authentication āĻŦāϞ⧇ āχāωāϜāĻžāϰ "āϕ⧇"
  • Authorization āĻŦāϞ⧇ āχāωāϜāĻžāϰ "āĻ•āĻŋ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇"

👉 Laravel-āĻ āĻāχ āĻĻ⧁āχāϟāĻŋ āĻĒāϰāĻŋāĻˇā§āĻ•āĻžāϰāĻ­āĻžāĻŦ⧇ āφāϞāĻžāĻĻāĻž āĻ•āϰāĻž āĻšā§Ÿā§‡āϛ⧇, āĻāĻŦāĻ‚ āϤāĻžāĻĻ⧇āϰ āϜāĻ¨ā§āϝ āφāϞāĻžāĻĻāĻž āĻŽā§‡āĻ•āĻžāύāĻŋāϜāĻŽ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻšā§ŸāĨ¤

āĻĒā§āϰāĻļā§āύ ā§Ŧ: Laravel-āĻ āφāĻĒāύāĻŋ āϕ⧀āĻ­āĻžāĻŦ⧇ āĻāĻ•āϟāĻŋ Custom Authentication Driver āχāĻŽāĻĒā§āϞāĻŋāĻŽā§‡āĻ¨ā§āϟ āĻ•āϰāĻŦ⧇āύ?

✅ āωāĻ¤ā§āϤāϰ:

Laravel āϏāĻžāϧāĻžāϰāĻŖāϤ session āĻāĻŦāĻ‚ token (API) āĻ­āĻŋāĻ¤ā§āϤāĻŋāĻ• authentication āϏāĻžāĻĒā§‹āĻ°ā§āϟ āĻ•āϰ⧇, āϤāĻŦ⧇ āφāĻĒāύāĻŋ āϚāĻžāχāϞ⧇ āύāĻŋāĻœā§‡āϰ āĻŽāϤ⧋ āĻ•āϰ⧇ āĻāĻ•āϟāĻŋ Custom Authentication Driver āϤ⧈āϰāĻŋ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤

Laravel-āĻ custom authentication driver āϤ⧈āϰāĻŋ āĻ•āϰāϤ⧇ āĻšāϞ⧇ āύāĻŋāĻšā§‡āϰ āϧāĻžāĻĒāϗ⧁āϞ⧋ āĻ…āύ⧁āϏāϰāĻŖ āĻ•āϰāϤ⧇ āĻšā§Ÿ:

đŸ› ī¸ āϧāĻžāĻĒ ā§§: Custom Guard Class āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ

āϧāϰ⧁āύ āφāĻĒāύāĻŋ āĻāĻ•āϟāĻŋ CustomAuthGuard āύāĻžāĻŽā§‡āϰ class āĻŦāĻžāύāĻžāĻŦ⧇āύāĨ¤

🔸 app/Auth/CustomAuthGuard.php

namespace App\Auth;

use Illuminate\Contracts\Auth\Guard;
use Illuminate\Contracts\Auth\UserProvider;
use Illuminate\Http\Request;
use Illuminate\Contracts\Auth\Authenticatable;

class CustomAuthGuard implements Guard
{
    protected $request;
    protected $provider;
    protected $user;

    public function __construct(UserProvider $provider, Request $request)
    {
        $this->provider = $provider;
        $this->request = $request;
    }

    public function check()
    {
        return !is_null($this->user());
    }

    public function user()
    {
        if (!is_null($this->user)) {
            return $this->user;
        }

        $id = $this->request->session()->get('custom_user_id');

        if ($id) {
            $this->user = $this->provider->retrieveById($id);
        }

        return $this->user;
    }

    public function id()
    {
        return $this->user()?->getAuthIdentifier();
    }

    public function validate(array $credentials = [])
    {
        $user = $this->provider->retrieveByCredentials($credentials);

        if ($user && $this->provider->validateCredentials($user, $credentials)) {
            $this->user = $user;
            return true;
        }

        return false;
    }

    public function setUser(Authenticatable $user)
    {
        $this->user = $user;
        return $this;
    }
}
Enter fullscreen mode Exit fullscreen mode

đŸ› ī¸ āϧāĻžāĻĒ ā§¨: Service Provider āĻāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ Register āĻ•āϰ⧁āύ

🔸 App\Providers\AuthServiceProvider.php

use App\Auth\CustomAuthGuard;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\ServiceProvider;

public function boot()
{
    Auth::extend('custom_guard', function ($app, $name, array $config) {
        $provider = Auth::createUserProvider($config['provider']);

        return new CustomAuthGuard($provider, $app['request']);
    });
}
Enter fullscreen mode Exit fullscreen mode

đŸ› ī¸ āϧāĻžāĻĒ ā§Š: config/auth.php āĻĢāĻžāχāϞ⧇ Guard āϝ⧁āĻ•ā§āϤ āĻ•āϰ⧁āύ

'guards' => [
    'custom' => [
        'driver' => 'custom_guard',
        'provider' => 'users',
    ],
],

Enter fullscreen mode Exit fullscreen mode

đŸ› ī¸ āϧāĻžāĻĒ ā§Ē: āĻ•āĻŋāĻ­āĻžāĻŦ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻŦ⧇āύ

if (Auth::guard('custom')->attempt(['email' => 'test@example.com', 'password' => 'secret'])) {
    // Login successful
}
Enter fullscreen mode Exit fullscreen mode

🧠 āϏāĻ‚āĻ•ā§āώ⧇āĻĒ⧇:
āϧāĻžāĻĒ āĻ•āĻžāϜ
ā§§ Custom Guard class āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ
⧍ Auth::extend() āĻāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ register āĻ•āϰ⧁āύ
ā§Š config/auth.php-āĻ custom guard āϝ⧁āĻ•ā§āϤ āĻ•āϰ⧁āύ
ā§Ē Auth::guard('custom') āĻĻāĻŋā§Ÿā§‡ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ

🔚 āωāĻĒāϏāĻ‚āĻšāĻžāϰ:

Custom authentication āϤāĻ–āύ āĻĻāϰāĻ•āĻžāϰ āĻšā§Ÿ āϝāĻ–āύ āφāĻĒāύāĻŋ Session/Token āĻ›āĻžā§œāĻžāĻ“ āĻ­āĻŋāĻ¨ā§āύ āϕ⧋āύ⧋ āĻĒā§āϰāĻ•ā§āϰāĻŋ⧟āĻžā§Ÿ user āϕ⧇ authenticate āĻ•āϰāϤ⧇ āϚāĻžāύ — āϝ⧇āĻŽāύ API Key, Third-Party Token, LDAP āχāĻ¤ā§āϝāĻžāĻĻāĻŋāĨ¤

āĻĒā§āϰāĻļā§āύ ā§­: Laravel-āĻ Queues āϕ⧀ āĻāĻŦāĻ‚ āϕ⧇āύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻšāϝāĻŧ? āĻāĻŽāύ āĻāĻ•āϟāĻŋ āĻŦāĻžāĻ¸ā§āϤāĻŦ āωāĻĻāĻžāĻšāϰāĻŖ āĻĻāĻŋāύ āϝ⧇āĻ–āĻžāύ⧇ āφāĻĒāύāĻŋ Queue āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻŦ⧇āύāĨ¤

✅ āωāĻ¤ā§āϤāϰ:

✅ Queues āϕ⧀?

Queue (āĻ•āĻŋāω) āĻšāϞ⧋ Laravel-āĻāϰ āĻāĻ•āϟāĻŋ āĻĢāĻŋāϚāĻžāϰ āϝāĻž āφāĻĒāύāĻžāϕ⧇ āĻĻā§€āĻ°ā§āϘ āϏāĻŽā§Ÿ āϞāĻžāĻ—āĻž āĻ•āĻžāϜāϗ⧁āϞ⧋āϕ⧇ āĻĒ⧇āĻ›āύ⧇ (background) āĻĒā§āϰāĻ•ā§āϰāĻŋāϝāĻŧāĻžāĻ•āϰāĻŖ āĻ•āϰāϤ⧇ āϏāĻžāĻšāĻžāĻ¯ā§āϝ āĻ•āϰ⧇, āϝ⧇āύ āχāωāϜāĻžāϰ āĻĻā§āϰ⧁āϤ response āĻĒāĻžā§ŸāĨ¤

āĻāϗ⧁āϞ⧋ jobs āφāĻ•āĻžāϰ⧇ āĻāĻ• āĻŦāĻž āĻāĻ•āĻžāϧāĻŋāĻ• worker āĻĻā§āĻŦāĻžāϰāĻž āĻĒā§āϰāϏ⧇āϏ āĻšā§ŸāĨ¤

✅ āϕ⧇āύ Queues āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻšā§Ÿ?

Queues āĻŦā§āϝāĻŦāĻšāĻžāϰ⧇āϰ āĻĒā§āϰāϧāĻžāύ āĻ•āĻžāϰāĻŖāϗ⧁āϞ⧋ āĻšāϞ⧋:

  1. ✅ āĻĒāĻžāϰāĻĢāϰāĻŽā§āϝāĻžāĻ¨ā§āϏ āĻŦ⧃āĻĻā§āϧāĻŋ: āϝ⧇āϏāĻŦ āĻ•āĻžāϜ āĻ…āύ⧇āĻ• āϏāĻŽā§Ÿ āĻ¨ā§‡ā§Ÿ, āϏ⧇āϗ⧁āϞ⧋ āĻŦā§āϝāĻžāĻ•āĻ—ā§āϰāĻžāωāĻ¨ā§āĻĄā§‡ āĻĒāĻžāĻ āĻŋā§Ÿā§‡ āĻĢ⧇āϞāĻž āϝāĻžā§ŸāĨ¤
  2. ✅ User Experience āωāĻ¨ā§āύ⧟āύ: āχāωāϜāĻžāϰ request-āĻāϰ āϏāĻžāĻĨ⧇ āϏāĻžāĻĨ⧇ response āĻĒāĻžā§Ÿ, āĻ•āĻžāϜāϟāĻŋ āĻĒāϰ⧇ āĻĒā§āϰāϏ⧇āϏ āĻšā§ŸāĨ¤
  3. ✅ Resources āĻŦāĻžāρāϚāĻžāύ⧋: Worker āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ resource āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻ•āĻžāϜ āϏāĻŽā§āĻĒāĻžāĻĻāύ āĻ•āϰ⧇āĨ¤

🧠 Queue āĻ›āĻžā§œāĻž vs Queue āϏāĻš

🔴 Queue āĻ›āĻžā§œāĻž:

public function sendEmail()
{
    Mail::to($user)->send(new WelcomeMail());
    return "Mail Sent!";
}
Enter fullscreen mode Exit fullscreen mode

āĻāĻ–āĻžāύ⧇ mail āĻĒāĻžāĻ āĻžāϤ⧇ āĻ…āύ⧇āĻ• āϏāĻŽā§Ÿ āϞāĻžāĻ—āϤ⧇ āĻĒāĻžāϰ⧇, āϝ⧇āϟāĻž user āĻāϰ āϜāĻ¨ā§āϝ āϧ⧀āϰ āĻ…āύ⧁āĻ­ā§‚āϤāĻŋ āϤ⧈āϰāĻŋ āĻ•āϰ⧇āĨ¤

đŸŸĸ Queue āϏāĻš:

public function sendEmail()
{
    dispatch(new SendWelcomeMailJob($user));
    return "Mail Queued!";
}
Enter fullscreen mode Exit fullscreen mode

āĻāĻ–āĻžāύ⧇ āĻ•āĻžāϜāϟāĻŋ queue āϤ⧇ āĻĒāĻžāĻ āĻŋā§Ÿā§‡ āĻĻ⧇āĻ“ā§ŸāĻž āĻšā§Ÿ, āφāϰ āχāωāϜāĻžāϰ āϏāĻžāĻĨ⧇ āϏāĻžāĻĨ⧇ response āĻĒāĻžā§ŸāĨ¤

✅ āĻŦāĻžāĻ¸ā§āϤāĻŦ āωāĻĻāĻžāĻšāϰāĻŖ: Email Sending

āϧāϰāĻž āϝāĻžāĻ•, āφāĻĒāύāĻŋ āĻāĻ•āϜāύ āχāωāϜāĻžāϰāϕ⧇ āϰ⧇āϜāĻŋāĻ¸ā§āĻŸā§āϰ⧇āĻļāύ⧇āϰ āĻĒāϰ Welcome Email āĻĒāĻžāĻ āĻžāϤ⧇ āϚāĻžāύāĨ¤ Email āĻĒāĻžāĻ āĻžāϤ⧇ āϏāĻŽā§Ÿ āϞāĻžāϗ⧇ — āϤāĻžāχ āĻāϟāĻŋ queue-āϤ⧇ āĻĒāĻžāĻ āĻžāύ⧋ āωāĻ¤ā§āϤāĻŽāĨ¤

ā§§. Job āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ:

php artisan make:job SendWelcomeEmail
Enter fullscreen mode Exit fullscreen mode

⧍. Job āϕ⧋āĻĄ:

public function handle()
{
    Mail::to($this->user->email)->send(new WelcomeMail($this->user));
}
Enter fullscreen mode Exit fullscreen mode

ā§Š. Dispatch āĻ•āϰ⧁āύ Controller āĻĨ⧇āϕ⧇:

dispatch(new SendWelcomeEmail($user));
Enter fullscreen mode Exit fullscreen mode

✅ Queue āϚāĻžāϞ⧁ āĻ•āϰāϤ⧇:

  1. .env āĻĢāĻžāχāϞ⧇:
QUEUE_CONNECTION=database
Enter fullscreen mode Exit fullscreen mode
  1. Queue table āϤ⧈āϰāĻŋ:
php artisan queue:table
php artisan migrate
Enter fullscreen mode Exit fullscreen mode
  1. Queue worker āϚāĻžāϞ⧁:
php artisan queue:work
Enter fullscreen mode Exit fullscreen mode

✅ Queue-āĻ āφāϰāĻ“ āϝ⧇āϏāĻŦ āĻ•āĻžāϜ āĻĒāĻžāĻ āĻžāύ⧋ āϝāĻžā§Ÿ:

  • āχāĻŽā§‡āχāϞ āĻĒāĻžāĻ āĻžāύ⧋ (Email Sending)
  • āϰāĻŋāĻĒā§‹āĻ°ā§āϟ āĻœā§‡āύāĻžāϰ⧇āϟ āĻ•āϰāĻž (PDF, Excel)
  • āĻ­āĻŋāĻĄāĻŋāĻ“ āĻĒā§āϰāϏ⧇āϏāĻŋāĻ‚
  • āύ⧋āϟāĻŋāĻĢāĻŋāϕ⧇āĻļāύ āĻĒāĻžāĻ āĻžāύ⧋
  • āĻŦāĻŋāϞāĻŽā§āĻŦāĻŋāϤ āĻ•āĻžāϜ (Delayed Jobs)

🔚 āϏāĻ‚āĻ•ā§āώ⧇āĻĒ⧇:

Image description

✅ āĻĒā§āϰāĻļā§āύ ā§Ž: Laravel-āĻ āφāĻĒāύāĻŋ āϕ⧀āĻ­āĻžāĻŦ⧇ Job āϤ⧈āϰāĻŋ āĻ“ Dispatch āĻ•āϰāĻŦ⧇āύ?

✅ āωāĻ¤ā§āϤāϰ:

🔷 Job āϕ⧀?

Job āĻšāϞ⧋ āĻāĻ•āϟāĻŋ āĻ•ā§āϞāĻžāϏ āϝāĻž Laravel Queue-āĻāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ delay āĻŦāĻž background-āĻ āĻ•āĻžāϜ āϏāĻŽā§āĻĒāĻ¨ā§āύ āĻ•āϰāϤ⧇ āĻŦā§āϝāĻŦāĻšā§ƒāϤ āĻšāϝāĻŧāĨ¤ āϝ⧇āĻŽāύ: āχāĻŽā§‡āχāϞ āĻĒāĻžāĻ āĻžāύ⧋, āϰāĻŋāĻĒā§‹āĻ°ā§āϟ āϤ⧈āϰāĻŋ, āĻ­āĻŋāĻĄāĻŋāĻ“ āĻĒā§āϰāϏ⧇āϏ āχāĻ¤ā§āϝāĻžāĻĻāĻŋāĨ¤

đŸ› ī¸ Job āϤ⧈āϰāĻŋ āĻ•āϰāĻžāϰ āϧāĻžāĻĒ:

✅ āϧāĻžāĻĒ ā§§: Job āĻ•ā§āϞāĻžāϏ āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ

php artisan make:job SendWelcomeEmail
Enter fullscreen mode Exit fullscreen mode

āĻāϤ⧇ app/Jobs/SendWelcomeEmail.php āĻĢāĻžāχāϞ⧇ āĻāĻ•āϟāĻŋ āĻ•ā§āϞāĻžāϏ āϤ⧈āϰāĻŋ āĻšāĻŦ⧇āĨ¤

✅ āϧāĻžāĻĒ ā§¨: Job-āĻ āĻ•āĻžāϜ āϞāĻŋāϖ⧁āύ

namespace App\Jobs;

use App\Mail\WelcomeMail;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Support\Facades\Mail;

class SendWelcomeEmail implements ShouldQueue
{
    use Queueable;

    protected $user;

    public function __construct($user)
    {
        $this->user = $user;
    }

    public function handle()
    {
        // āĻŽā§‡āχāϞ āĻĒāĻžāĻ āĻžāύ⧋āϰ āĻ•āĻžāϜ
        Mail::to($this->user->email)->send(new WelcomeMail($this->user));
    }
}
Enter fullscreen mode Exit fullscreen mode

āĻŦāĻŋ.āĻĻā§āϰ.: ShouldQueue āχāĻ¨ā§āϟāĻžāϰāĻĢ⧇āϏāϟāĻŋ Laravel āϕ⧇ āĻŦāϞ⧇ āĻĻā§‡ā§Ÿ āϝ⧇ āĻāϟāĻŋ queue-āϤ⧇ āĻĒā§āϰāϏ⧇āϏ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇āĨ¤

✅ āϧāĻžāĻĒ ā§Š: Job Dispatch āĻ•āϰ⧁āύ

āϧāϰāĻž āϝāĻžāĻ•, āχāωāϜāĻžāϰ āϰ⧇āϜāĻŋāĻ¸ā§āĻŸā§āϰ⧇āĻļāύ⧇āϰ āĻĒāϰ⧇ āĻāχ Job āϟāĻŋ Dispatch āĻ•āϰāĻŦ⧇āύāĨ¤

use App\Jobs\SendWelcomeEmail;

public function register(Request $request)
{
    $user = User::create([...]);

    // Dispatch Job
    dispatch(new SendWelcomeEmail($user));

    return response()->json(['message' => 'User registered and mail queued']);
}
Enter fullscreen mode Exit fullscreen mode

đŸ› ī¸ Queue āϚāĻžāϞ⧁ āĻ•āϰāĻžāϰ āϧāĻžāĻĒ (āϝāĻĻāĻŋ queue āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇āύ):

ā§§. .env āĻĢāĻžāχāϞ⧇ āϏ⧇āϟ āĻ•āϰ⧁āύ:

QUEUE_CONNECTION=database
Enter fullscreen mode Exit fullscreen mode

⧍. Queue table āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ:

php artisan queue:table
php artisan migrate
Enter fullscreen mode Exit fullscreen mode

ā§Š. Worker āϚāĻžāϞ⧁ āĻ•āϰ⧁āύ:

php artisan queue:work
Enter fullscreen mode Exit fullscreen mode

🧠 āφāϰāĻ“ āĻ•āĻŋāϛ⧁ āϤāĻĨā§āϝ:

✅ āφāĻĒāύāĻŋ Delay āϏāĻš Dispatch āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ:

dispatch(new SendWelcomeEmail($user))->delay(now()->addMinutes(5));
Enter fullscreen mode Exit fullscreen mode

✅ āĻšā§‡āχāύāĻŋāĻ‚ āĻ•āϰ⧇ āĻāĻ•āĻžāϧāĻŋāĻ• Job āϏāĻŋāϰāĻŋ⧟āĻžāϞāĻŋ āϚāϞāĻžāϤ⧇ āĻĒāĻžāϰ⧇āύ:

SendWelcomeEmail::withChain([
    new LogEmailSent($user),
    new NotifyAdmin($user),
])->dispatch();
Enter fullscreen mode Exit fullscreen mode

🔚 āϏāĻ‚āĻ•ā§āώ⧇āĻĒ⧇:

Image description

✅ āĻĒā§āϰāĻļā§āύ ⧝: Laravel-āĻ āϝ⧇āϏāĻŦ āϧāϰāύ⧇āϰ Testing āφāϛ⧇, āϏ⧇āϗ⧁āϞ⧋ āĻŦā§āϝāĻžāĻ–ā§āϝāĻž āĻ•āϰ⧁āύ āĻāĻŦāĻ‚ āĻ•āĻ–āύ āϕ⧋āύāϟāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻŦ⧇āύ āϤāĻž āωāĻ˛ā§āϞ⧇āĻ– āĻ•āϰ⧁āύāĨ¤

✅ āωāĻ¤ā§āϤāϰ:

đŸ§Ē Laravel-āĻ Testing āĻāϰ āϧāϰāύāϏāĻŽā§‚āĻš:

Laravel āĻŽā§‚āϞāϤ ā§Š āϧāϰāϪ⧇āϰ āĻŸā§‡āĻ¸ā§āϟāĻŋāĻ‚ āϏāĻžāĻĒā§‹āĻ°ā§āϟ āĻ•āϰ⧇:

  1. ✅ Feature Testing
  2. ✅ Unit Testing
  3. ✅ Browser Testing (Dusk)

🔹 1. Unit Testing

🔸 āĻāχ āĻŸā§‡āĻ¸ā§āϟ āϛ⧋āϟ āϛ⧋āϟ āĻĢāĻžāĻ‚āĻļāύ āĻŦāĻž āĻ•ā§āϞāĻžāϏāϕ⧇ isolate āĻ•āϰ⧇ āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰ⧇āĨ¤
🔸 āϏāĻžāϧāĻžāϰāĻŖāϤ Model, Service class āĻŦāĻž Helper function āχāĻ¤ā§āϝāĻžāĻĻāĻŋāϕ⧇ test āĻ•āϰāϤ⧇ āĻŦā§āϝāĻŦāĻšā§ƒāϤ āĻšāϝāĻŧāĨ¤

➤ āĻ•āĻ–āύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻŦ⧇āύ:

  • āϝāĻ–āύ āφāĻĒāύāĻŋ āϚāĻžāύ āĻāĻ•āϟāĻŋ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻŽā§‡āĻĨāĻĄ āϏāĻ āĻŋāĻ•āĻ­āĻžāĻŦ⧇ āĻ•āĻžāϜ āĻ•āϰāϛ⧇ āĻ•āĻŋāύāĻž āϤāĻž āϝāĻžāϚāĻžāχ āĻ•āϰāϤ⧇āĨ¤

➤ āωāĻĻāĻžāĻšāϰāĻŖ:

php artisan make:test MathHelperTest --unit
Enter fullscreen mode Exit fullscreen mode
public function test_add_numbers_correctly()
{
    $this->assertEquals(4, MathHelper::add(2, 2));
}
Enter fullscreen mode Exit fullscreen mode

🔹 2. Feature Testing

🔸 āĻāϟāĻŋ āĻĒ⧁āϰ⧋āĻĒ⧁āϰāĻŋ āĻāĻ•āϟāĻŋ feature (āϝ⧇āĻŽāύāσ route, controller, middleware) āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰ⧇āĨ¤
🔸 āĻāĻ–āĻžāύ⧇ HTTP request simulate āĻ•āϰ⧇ āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻĢā§āϞ⧋ āĻŸā§‡āĻ¸ā§āϟ āĻ•āϰāĻž āĻšāϝāĻŧāĨ¤

➤ āĻ•āĻ–āύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻŦ⧇āύ:

  • āϝāĻ–āύ āφāĻĒāύāĻŋ āĻšā§‡āĻ• āĻ•āϰāϤ⧇ āϚāĻžāύ, āĻāĻ•āϟāĻŋ āĻĢāĻŋāϚāĻžāϰ āĻ āĻŋāĻ•āĻ­āĻžāĻŦ⧇ āĻ•āĻžāϜ āĻ•āϰāϛ⧇ āĻ•āĻŋāύāĻž — āϝ⧇āĻŽāύ āĻĢāĻ°ā§āĻŽ āϏāĻžāĻŦāĻŽāĻŋāĻļāύ, āϞāĻ—āχāύ, āχāωāϜāĻžāϰ āϰ⧇āϜāĻŋāĻ¸ā§āĻŸā§āϰ⧇āĻļāύ āχāĻ¤ā§āϝāĻžāĻĻāĻŋāĨ¤

➤ āωāĻĻāĻžāĻšāϰāĻŖ:

php artisan make:test UserRegistrationTest
Enter fullscreen mode Exit fullscreen mode
public function test_user_can_register()
{
    $response = $this->post('/register', [
        'name' => 'Ruhul',
        'email' => 'ruhul@example.com',
        'password' => 'secret',
        'password_confirmation' => 'secret',
    ]);

    $response->assertRedirect('/home');
    $this->assertDatabaseHas('users', ['email' => 'ruhul@example.com']);
}
Enter fullscreen mode Exit fullscreen mode

🔹 3. Browser Testing (Laravel Dusk)

🔸 āĻāϟāĻŋ āĻāĻ•āϟāĻŋ End-to-End (E2E) āĻŸā§‡āĻ¸ā§āϟāĻŋāĻ‚ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āϝāĻž āφāϏāϞ browser āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ UI āĻŸā§‡āĻ¸ā§āϟ āĻ•āϰ⧇āĨ¤
🔸 āĻāχ āĻŸā§‡āĻ¸ā§āϟ āχāωāϜāĻžāϰ āχāĻ¨ā§āϟāĻžāϰāĻĢ⧇āϏ⧇ āĻ•ā§āϞāĻŋāĻ•, āϟāĻžāχāĻĒ, āϰāĻŋāĻĄāĻžāχāϰ⧇āĻ•ā§āϟ āχāĻ¤ā§āϝāĻžāĻĻāĻŋ āĻ…āύ⧁āĻ•āϰāĻŖ āĻ•āϰ⧇āĨ¤

➤ āĻ•āĻ–āύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻŦ⧇āύ:

  • āĻĢāĻ°ā§āĻŽ, UI āχāĻ¨ā§āϟāĻžāϰāĻ…ā§āϝāĻžāĻ•āĻļāύ āĻŦāĻž āϜāĻžāĻ­āĻžāĻ¸ā§āĻ•ā§āϰāĻŋāĻĒā§āϟ āĻŸā§‡āĻ¸ā§āϟ āĻ•āϰāϤ⧇ āϚāĻžāχāϞ⧇āĨ¤
  • āϞāĻ—āχāύ/āϰ⧇āϜāĻŋāĻ¸ā§āĻŸā§āϰ⧇āĻļāύ āĻĒā§āϰāĻ•ā§āϰāĻŋāϝāĻŧāĻžāϰ āĻ­āĻŋāĻœā§āϝ⧁āϝāĻŧāĻžāϞ āĻĢā§āϞ⧋ āĻĻ⧇āĻ–āϤ⧇ āϚāĻžāχāϞ⧇āĨ¤

➤ āωāĻĻāĻžāĻšāϰāĻŖ:

php artisan dusk:make LoginTest
Enter fullscreen mode Exit fullscreen mode
public function test_login()
{
    $this->browse(function ($browser) {
        $browser->visit('/login')
                ->type('email', 'test@example.com')
                ->type('password', 'password')
                ->press('Login')
                ->assertPathIs('/home');
    });
}
Enter fullscreen mode Exit fullscreen mode

🧠 āϏāĻ‚āĻ•ā§āώ⧇āĻĒ⧇ āĻĒāĻžāĻ°ā§āĻĨāĻ•ā§āϝ:

Image description

✅ Laravel-āĻ Test āϚāĻžāϞāĻžāύ⧋āϰ āĻ•āĻŽāĻžāĻ¨ā§āĻĄ:

php artisan test
Enter fullscreen mode Exit fullscreen mode

āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ test file āϚāĻžāϞāĻžāϤ⧇:

php artisan test --filter=UserRegistrationTest
Enter fullscreen mode Exit fullscreen mode

🔚 āωāĻĒāϏāĻ‚āĻšāĻžāϰ:

Laravel-āĻ testing āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻ…āύ⧇āĻ• āĻļāĻ•ā§āϤāĻŋāĻļāĻžāϞ⧀ āĻāĻŦāĻ‚ development-āĻāϰ āϏāĻŽā§Ÿ āĻĒā§āϰāϤāĻŋāϟāĻŋ āϧāϰāϪ⧇āϰ test āϏāĻ āĻŋāĻ•āĻ­āĻžāĻŦ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϞ⧇ bug-free āĻ“ āĻŦāĻŋāĻļā§āĻŦāĻžāϏāϝ⧋āĻ—ā§āϝ āĻ…ā§āϝāĻžāĻĒ āϤ⧈āϰāĻŋ āĻ•āϰāĻž āϝāĻžā§ŸāĨ¤

✅ āĻĒā§āϰāĻļā§āύ ā§§ā§Ļ: Laravel āĻŸā§‡āĻ¸ā§āĻŸā§‡ āφāĻĒāύāĻŋ āϕ⧀āĻ­āĻžāĻŦ⧇ dependency mock āĻ•āϰāĻŦ⧇āύ? āĻāĻ•āϟāĻŋ āωāĻĻāĻžāĻšāϰāĻŖ āĻĻāĻŋāύāĨ¤

✅ āωāĻ¤ā§āϤāϰ:

🧠 Mocking āĻŽāĻžāύ⧇ āϕ⧀?

Mocking āĻŽāĻžāύ⧇ āĻšāϞ⧋ āĻāĻŽāύ āϕ⧋āύ⧋ class āĻŦāĻž object-āĻāϰ āύāĻ•āϞ (fake) āĻ­āĻžāĻ°ā§āϏāύ āϤ⧈āϰāĻŋ āĻ•āϰāĻž, āϝāĻžāϤ⧇ āφāĻŽāϰāĻž āφāϏāϞ dependency-āĻāϰ behavior āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ•āϰ⧇ test āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŋāĨ¤

Laravel āĻ mocking āϏāĻžāϧāĻžāϰāĻŖāϤ service, external API, repository, notification, mail āχāĻ¤ā§āϝāĻžāĻĻāĻŋ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇ āĻ•āϰāĻž āĻšā§ŸāĨ¤

🔧 Mocking Dependency āĻ•āĻŦ⧇ āĻĻāϰāĻ•āĻžāϰ āĻšā§Ÿ?

  • āϝāĻ–āύ āφāĻĒāύāĻŋ āϕ⧋āύ⧋ external service (āϝ⧇āĻŽāύ: payment gateway, SMS API) āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϛ⧇āύāĨ¤
  • āϝāĻ–āύ āφāĻĒāύāĻŋ āĻāĻŽāύ āϕ⧋āύ⧋ āĻ•ā§āϞāĻžāϏ āĻŦāĻž āϏāĻžāĻ°ā§āĻ­āĻŋāϏ āĻŸā§‡āĻ¸ā§āϟ āĻ•āϰāϛ⧇āύ, āϝ⧇āϟāĻŋ āĻ…āĻ¨ā§āϝ āĻ•ā§āϞāĻžāϏ⧇āϰ āωāĻĒāϰ āύāĻŋāĻ°ā§āĻ­āϰ āĻ•āϰ⧇āĨ¤
  • āϝāĻžāϤ⧇ āφāĻĒāύāĻžāϰ āĻŸā§‡āĻ¸ā§āĻŸā§‡ "side effects" āύāĻž āĻšā§Ÿ (āϝ⧇āĻŽāύ āφāϏāϞ API call, database change āχāĻ¤ā§āϝāĻžāĻĻāĻŋ)āĨ¤

✅ āωāĻĻāĻžāĻšāϰāĻŖ: āĻāĻ•āϟāĻŋ Service Class āϕ⧇ Mock āĻ•āϰāĻž

āϧāϰāĻž āϝāĻžāĻ•, āφāĻĒāύāĻŋ āĻāĻ•āϟāĻŋ PaymentService āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϛ⧇āύ āϝ⧇āϟāĻž āφāϏāϞ API call āĻ•āϰ⧇āĨ¤

🔹 Step 1: āφāϏāϞ āϏāĻžāĻ°ā§āĻ­āĻŋāϏ āĻ•ā§āϞāĻžāϏ (Mock āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ)

namespace App\Services;

class PaymentService
{
    public function charge($amount)
    {
        // āφāϏāϞ API call (āϝ⧇āϟāĻž āφāĻŽāϰāĻž āĻŸā§‡āĻ¸ā§āĻŸā§‡ āĻ•āϰāϤ⧇ āϚāĻžāχ āύāĻž)
        return "Charged {$amount} taka!";
    }
}
Enter fullscreen mode Exit fullscreen mode

🔹 Step 2: Controller āϝ⧇āϟāĻŋ āĻāχ āϏāĻžāĻ°ā§āĻ­āĻŋāϏ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇

namespace App\Http\Controllers;

use App\Services\PaymentService;

class PaymentController extends Controller
{
    public function pay(PaymentService $payment)
    {
        return $payment->charge(100);
    }
}
Enter fullscreen mode Exit fullscreen mode

🔹 Step 3: āĻāĻ–āύ āĻŸā§‡āĻ¸ā§āĻŸā§‡ āĻāχ āϏāĻžāĻ°ā§āĻ­āĻŋāϏāϕ⧇ Mock āĻ•āϰāĻŦ

namespace Tests\Feature;

use Tests\TestCase;
use App\Services\PaymentService;
use Illuminate\Support\Facades\App;

class PaymentTest extends TestCase
{
    public function test_payment_service_mock()
    {
        // 1. āĻŽāĻ• āĻ…āĻŦāĻœā§‡āĻ•ā§āϟ āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ
        $mock = \Mockery::mock(PaymentService::class);

        // 2. āĻŽāĻ• āĻŽā§‡āĻĨāĻĄā§‡āϰ āĻĒā§āϰāĻ¤ā§āϝāĻžāĻļāĻŋāϤ āϰāĻŋāϟāĻžāĻ°ā§āύ āĻ­ā§āϝāĻžāϞ⧁ āϏ⧇āϟ āĻ•āϰ⧁āύ
        $mock->shouldReceive('charge')
             ->with(100)
             ->once()
             ->andReturn('Mocked Payment Success!');

        // 3. Laravel container-āĻ bind āĻ•āϰ⧁āύ
        $this->app->instance(PaymentService::class, $mock);

        // 4. āĻāĻ–āύ Controller call āĻ•āϰāϞ⧇ Mock āĻ•āĻžāϜ āĻ•āϰāĻŦ⧇
        $response = $this->get('/pay');

        $response->assertStatus(200);
        $response->assertSee('Mocked Payment Success!');
    }
}
Enter fullscreen mode Exit fullscreen mode

āĻāχ āĻŸā§‡āĻ¸ā§āĻŸā§‡ āφāϏāϞ charge() āĻŽā§‡āĻĨāĻĄ āĻ•āϞ āĻšā§Ÿ āύāĻž, āĻŦāϰāĻ‚ āφāĻŽāϰāĻž āϝ⧇āĻ­āĻžāĻŦ⧇ āϚāĻžāχ āϏ⧇āĻ­āĻžāĻŦ⧇ response āĻĒāĻžāχāĨ¤

✅ āφāϰāĻ“ āĻ•āĻŋāϛ⧁ āϜāĻŋāύāĻŋāϏ āφāĻĒāύāĻŋ Mock āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ:

Image description

✅ Example: HTTP Request Mock (Laravel HTTP client)

use Illuminate\Support\Facades\Http;

public function test_api_call_mock()
{
    Http::fake([
        'api.example.com/*' => Http::response(['success' => true], 200),
    ]);

    $response = Http::get('https://api.example.com/data');

    $this->assertTrue($response->json()['success']);
}
Enter fullscreen mode Exit fullscreen mode

🔚 āϏāĻ‚āĻ•ā§āώ⧇āĻĒ⧇:

Image description

✅ āĻĒā§āϰāĻļā§āύ ā§§ā§§: Laravel āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ⧇āϰ āĻĒāĻžāϰāĻĢāϰāĻŽā§āϝāĻžāĻ¨ā§āϏ (Performance) āωāĻ¨ā§āύāϤ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āϕ⧋āύ āϕ⧋āύ āĻ•ā§ŒāĻļāϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āϝāĻžāϝāĻŧ? āĻŦā§āϝāĻžāĻ–ā§āϝāĻž āĻ•āϰ⧁āύāĨ¤

✅ āωāĻ¤ā§āϤāϰ:

Laravel āĻ…āύ⧇āĻ• āĻĢāĻŋāϚāĻžāϰ āϏāĻŽā§ƒāĻĻā§āϧ āĻāĻ•āϟāĻŋ āĻĢā§āϰ⧇āĻŽāĻ“ā§ŸāĻžāĻ°ā§āĻ•, āĻ•āĻŋāĻ¨ā§āϤ⧁ āϭ⧁āϞāĻ­āĻžāĻŦ⧇ āϕ⧋āĻĄ āĻ•āϰāϞ⧇ āĻāϟāĻŋ āϧ⧀āϰāĻ—āϤāĻŋāϰ (slow) āĻšāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ āύāĻŋāĻšā§‡ āĻ•āĻŋāϛ⧁ āϗ⧁āϰ⧁āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖ āĻ•ā§ŒāĻļāϞ āĻĻ⧇āĻ“ā§ŸāĻž āĻšāϞ⧋ āϝāĻž āĻ…ā§āϝāĻžāĻĒāϕ⧇ āĻĻā§āϰ⧁āϤāϤāϰ āĻ•āϰāϤ⧇ āϏāĻžāĻšāĻžāĻ¯ā§āϝ āĻ•āϰāĻŦ⧇āĨ¤

🚀 1. Eager Loading āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ (N+1 āϏāĻŽāĻ¸ā§āϝāĻž āĻāĻĄāĻŧāĻžāϤ⧇)

🔸 āϏāĻŽāĻ¸ā§āϝāĻžāσ

$users = User::all(); // āĻĒā§āϰāϤāĻŋāϟāĻŋ āχāωāϜāĻžāϰ⧇āϰ āϏāĻžāĻĨ⧇ profile āĻĻāϰāĻ•āĻžāϰ
foreach ($users as $user) {
    echo $user->profile->bio;
}
Enter fullscreen mode Exit fullscreen mode

āĻāχ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇ āĻĒā§āϰāϤāĻŋāϟāĻŋ user-āĻāϰ āϜāĻ¨ā§āϝ āφāϞāĻžāĻĻāĻž query āϚāϞ⧇ — āĻāϟāĻžāϕ⧇ āĻŦāϞ⧇ N+1 problemāĨ¤

✅ āϏāĻŽāĻžāϧāĻžāύāσ

$users = User::with('profile')->get();
Enter fullscreen mode Exit fullscreen mode

🚀 2. Cache āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ

🔸 Page Cache:

Cache::put('homepage', $data, 3600); // ā§§ āϘāĻŖā§āϟāĻž āĻĒāĻ°ā§āϝāĻ¨ā§āϤ cache āĻĨāĻžāĻ•āĻŦ⧇
Enter fullscreen mode Exit fullscreen mode

🔸 Route Cache:

php artisan route:cache
Enter fullscreen mode Exit fullscreen mode

🔸 Config Cache:

php artisan config:cache
Enter fullscreen mode Exit fullscreen mode

🚀 3. Query Optimization āĻ•āϰ⧁āύ

  • āĻŦ⧜ query split āĻ•āϰ⧇ āϛ⧋āϟ āϛ⧋āϟ āĻ•āϰ⧁āύāĨ¤
  • select * āĻāĻĄāĻŧāĻŋā§Ÿā§‡ āĻĒā§āĻ°ā§Ÿā§‹āϜāĻ¨ā§€ā§Ÿ column āϗ⧁āϞ⧋ select āĻ•āϰ⧁āύ:
User::select('id', 'name')->get();
Enter fullscreen mode Exit fullscreen mode
  • Index āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ DB column-āĻ (search/filter āĻāϰ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇)āĨ¤

🚀 4. Queue āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ

Time-consuming āĻ•āĻžāϜ āϝ⧇āĻŽāύ āχāĻŽā§‡āχāϞ, āϰāĻŋāĻĒā§‹āĻ°ā§āϟ āĻœā§‡āύāĻžāϰ⧇āĻļāύ āχāĻ¤ā§āϝāĻžāĻĻāĻŋ Queue-āϤ⧇ āĻĒāĻžāĻ āĻŋā§Ÿā§‡ āĻĻāĻŋāύāĨ¤

dispatch(new SendWelcomeEmail($user));
Enter fullscreen mode Exit fullscreen mode

🚀 5. Pagination āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ

āĻ…āύ⧇āĻ• āĻĄā§‡āϟāĻž āĻāĻ•āϏāĻžāĻĨ⧇ āϞ⧋āĻĄ āύāĻž āĻ•āϰ⧇ paginate āĻ•āϰ⧁āύ:

User::paginate(20);
Enter fullscreen mode Exit fullscreen mode

🚀 6. Lazy Collections āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ

Laravel-āĻāϰ Lazy Collection āĻŦ⧜ Dataset-āĻāϰ āϜāĻ¨ā§āϝ memory-efficient:

User::cursor()->each(function ($user) {
    // Memory āĻ•āĻŽ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻšāĻŦ⧇
});
Enter fullscreen mode Exit fullscreen mode

🚀 7. View / Blade Cache (Compiled View)

Blade āĻĢāĻžāχāϞāϗ⧁āϞ⧋ Compile āĻšā§Ÿā§‡ Storage-āĻ āϏ⧇āĻ­ āĻšā§ŸāĨ¤ Faster rendering-āĻāϰ āϜāĻ¨ā§āϝ:

php artisan view:cache
Enter fullscreen mode Exit fullscreen mode

🚀 8. Database Connection & Pooling

  • .env āĻĢāĻžāχāϞ⧇ āϝāĻĨāĻžāϝāĻĨ DB config āĻĻāĻŋāύāĨ¤
  • āϝāĻĻāĻŋ high traffic āĻ…ā§āϝāĻžāĻĒ āĻšā§Ÿ, database connection pooling āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ (āϝ⧇āĻŽāύāσ Swoole, Octane)āĨ¤

🚀 9. Laravel Octane āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ (Advanced)

High performance āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ⧇āϰ āϜāĻ¨ā§āϝ Laravel Octane āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ:

  • Swoole / RoadRunner āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇āĨ¤
  • Laravel request lifecycle āĻĒ⧁āύāϰāĻžā§Ÿ load āύāĻž āĻ•āϰ⧇ āĻĻā§āϰ⧁āϤāϤāϰ āĻ•āϰ⧇ āϤ⧋āϞ⧇āĨ¤

🚀 10. Autoload Optimization

Production mode-āĻ class autoload āĻ…āĻĒā§āϟāĻŋāĻŽāĻžāχāϜ āĻ•āϰ⧁āύ:

composer install --optimize-autoloader --no-dev
Enter fullscreen mode Exit fullscreen mode

🚀 11. Redis āĻŦāĻž Memcached Cache Driver āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ

āĻĄāĻŋāĻĢāĻ˛ā§āϟ file cache-āĻāϰ āĻŦāĻĻāϞ⧇ Redis āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϞ⧇ āĻ…āύ⧇āĻ• āĻĻā§āϰ⧁āϤ performance āĻĒāĻžāĻ“ā§ŸāĻž āϝāĻžā§ŸāĨ¤

.env āĻĢāĻžāχāϞ⧇:

CACHE_DRIVER=redis
QUEUE_CONNECTION=redis
SESSION_DRIVER=redis
Enter fullscreen mode Exit fullscreen mode

🚀 12. Assets āĻ…āĻĒā§āϟāĻŋāĻŽāĻžāχāϜ āĻ•āϰ⧁āύ (JS/CSS)

  • Mix āĻŦāĻž Vite āĻĻāĻŋā§Ÿā§‡ JS/CSS minify āĻ•āϰ⧁āύ:
npm run prod
Enter fullscreen mode Exit fullscreen mode

🧠 āϏāĻ‚āĻ•ā§āώ⧇āĻĒ⧇ āĻĒāĻžāϰāĻĢāϰāĻŽā§āϝāĻžāĻ¨ā§āϏ āϟāĻŋāĻĒāϏ āĻŸā§‡āĻŦāĻŋāϞ⧇:

Image description

✨ āĻ…āϤāĻŋāϰāĻŋāĻ•ā§āϤ āĻĒāϰāĻžāĻŽāĻ°ā§āĻļ:

  • Debugbar āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ Performance bottleneck āϖ⧁āρāĻœā§‡ āĻŦ⧇āϰ āĻ•āϰ⧁āύāĨ¤
  • .env āĻĢāĻžāχāϞ⧇ APP_DEBUG=false āĻ•āϰ⧁āύ production-āĻāĨ¤

✅ āĻĒā§āϰāĻļā§āύ ⧧⧍: Laravel-āĻ āφāĻĒāύāĻŋ āϕ⧀āĻ­āĻžāĻŦ⧇ Caching āχāĻŽāĻĒā§āϞāĻŋāĻŽā§‡āĻ¨ā§āϟ āĻ•āϰāĻŦ⧇āύ? āĻāĻŦāĻ‚ āϕ⧋āύ āϕ⧋āύ āϧāϰāϪ⧇āϰ Cache āĻŽā§‡āĻ•āĻžāύāĻŋāϜāĻŽ Laravel-āĻ āĻĒāĻžāĻ“ā§ŸāĻž āϝāĻžā§Ÿ?

✅ āωāĻ¤ā§āϤāϰ:

🧠 Caching āϕ⧀?

Caching āĻšāϞ⧋ āĻāĻ•āϟāĻŋ āĻ…āĻ¸ā§āĻĨāĻžāϝāĻŧā§€ āĻĄā§‡āϟāĻž āϏāĻ‚āϰāĻ•ā§āώāϪ⧇āϰ āĻĒāĻĻā§āϧāϤāĻŋ āϝāĻžāϤ⧇ āĻŦāĻžāϰāĻŦāĻžāϰ āĻāĻ•āĻŋ āĻĄā§‡āϟāĻž āĻĒ⧁āύāϰāĻžā§Ÿ āĻĄāĻžāϟāĻžāĻŦ⧇āϜ āĻŦāĻž API āĻĨ⧇āϕ⧇ āύāĻž āφāύāϤ⧇ āĻšāϝāĻŧāĨ¤ āĻāϰ āĻĢāϞ⧇ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ⧇āϰ āĻĒāĻžāϰāĻĢāϰāĻŽā§āϝāĻžāĻ¨ā§āϏ āĻŦ⧃āĻĻā§āϧāĻŋ āĻĒāĻžā§Ÿ āĻāĻŦāĻ‚ āϞ⧋āĻĄ āĻ•āĻŽā§‡āĨ¤

đŸ› ī¸ Laravel-āĻ Cache āĻŦā§āϝāĻŦāĻšāĻžāϰ⧇āϰ āϏāĻžāϧāĻžāϰāĻŖ āύāĻŋ⧟āĻŽ

Laravel-āĻ Cache āĻŦā§āϝāĻŦāĻšāĻžāϰ⧇āϰ āϜāĻ¨ā§āϝ Cache Facade āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻšā§ŸāĨ¤

✅ 1. Cache āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰāĻž (Store Cache)

use Illuminate\Support\Facades\Cache;

Cache::put('key', 'value', $seconds = 3600); // ā§§ āϘāĻŖā§āϟāĻžāϰ āϜāĻ¨ā§āϝ āϏāĻ‚āϰāĻ•ā§āώāĻŖ
Enter fullscreen mode Exit fullscreen mode

✅ 2. Cache āĻĨ⧇āϕ⧇ āĻĄā§‡āϟāĻž āĻĒāĻžāĻ“ā§ŸāĻž (Retrieve Cache)

$value = Cache::get('key'); // value āĻĒāĻžāĻŦ⧇āύ
Enter fullscreen mode Exit fullscreen mode

✅ 3. āĻĄāĻŋāĻĢāĻ˛ā§āϟ āĻ­ā§āϝāĻžāϞ⧁ āϏāĻš Cache āĻĒāĻĄāĻŧāĻž

$value = Cache::get('key', 'default_value');
Enter fullscreen mode Exit fullscreen mode

✅ 4. Cache āĻĨāĻžāĻ•āϞ⧇ return, āύāĻž āĻĨāĻžāĻ•āϞ⧇ āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ

$value = Cache::remember('users', 3600, function () {
    return DB::table('users')->get();
});
Enter fullscreen mode Exit fullscreen mode

✅ 5. āϚāĻŋāϰāĻ¸ā§āĻĨāĻžā§Ÿā§€ Cache (forever)

Cache::forever('site_name', 'My Website');
Enter fullscreen mode Exit fullscreen mode

✅ 6. Cache āĻŽā§āϛ⧇ āĻĢ⧇āϞāĻž (Delete Cache)

Cache::forget('key');
Enter fullscreen mode Exit fullscreen mode

✅ 7. āϏāĻŦ Cache Clear āĻ•āϰāĻž

php artisan cache:clear
Enter fullscreen mode Exit fullscreen mode

🔄 Route, Config āĻ“ View Cache:

🔹 Route Cache:

php artisan route:cache
Enter fullscreen mode Exit fullscreen mode

🔹 Config Cache:

php artisan config:cache
Enter fullscreen mode Exit fullscreen mode

🔹 View Cache:

php artisan view:cache
Enter fullscreen mode Exit fullscreen mode

🚀 Laravel-āĻ āϝ⧇ Caching Mechanism/Driver āϗ⧁āϞ⧋ āĻĒāĻžāĻ“ā§ŸāĻž āϝāĻžā§Ÿ:

Laravel āĻāϰ .env āĻĢāĻžāχāϞ⧇

CACHE_DRIVER
Enter fullscreen mode Exit fullscreen mode

āĻĻāĻŋā§Ÿā§‡ āύāĻŋāĻ°ā§āϧāĻžāϰāĻŖ āĻ•āϰāĻž āĻšā§Ÿ āφāĻĒāύāĻŋ āϕ⧋āύ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϛ⧇āύāĨ¤

CACHE_DRIVER=file
Enter fullscreen mode Exit fullscreen mode

✅ ā§§. file (āĻĄāĻŋāĻĢāĻ˛ā§āϟ):

  • Storage āĻĢā§‹āĻ˛ā§āĻĄāĻžāϰ⧇ āĻĢāĻžāχāϞ āφāĻ•āĻžāϰ⧇ cache āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰ⧇āĨ¤

✅ ⧍. database:

  • Cache data āĻĄāĻžāϟāĻžāĻŦ⧇āĻœā§‡ āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰ⧇āĨ¤
php artisan cache:table
php artisan migrate
Enter fullscreen mode Exit fullscreen mode

✅ ā§Š. array:

  • āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ current request āĻāϰ āϜāĻ¨ā§āϝ RAM-āĻ cache āϰāĻžāϖ⧇ (testing purpose)āĨ¤

✅ ā§Ē. redis:

  • Very fast, scalable memory-based caching system (production recommendation)āĨ¤

✅ ā§Ģ. memcached:

  • Lightweight distributed caching system (alternative to Redis)āĨ¤

đŸŽ¯ āĻŦā§āϝāĻŦāĻšāĻžāϰ āωāĻĒāϝ⧋āĻ—āĻŋāϤāĻž āĻ…āύ⧁āϝāĻžā§Ÿā§€ Driver āύāĻŋāĻ°ā§āĻŦāĻžāϚāύ:

Image description

đŸ§Ē āωāĻĻāĻžāĻšāϰāĻŖ: Redis Cache āĻŦā§āϝāĻŦāĻšāĻžāϰ

.env āĻĢāĻžāχāϞ⧇:

CACHE_DRIVER=redis
Enter fullscreen mode Exit fullscreen mode

config/database.php-āĻ Redis āĻ•āĻžāύāĻĢāĻŋāĻ—āĻžāϰ āύāĻŋāĻļā§āϚāĻŋāϤ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇āĨ¤

🧠 āϚāĻžāĻ•āϰāĻŋāϰ āχāĻ¨ā§āϟāĻžāϰāĻ­āĻŋāω āϟāĻŋāĻĒāϏ:

"Production āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ⧇ āφāĻĒāύāĻŋ āϕ⧋āύ cache āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻŦ⧇āύ?"
āωāĻ¤ā§āϤāϰ: Redis, āĻ•āĻžāϰāĻŖ āĻāϟāĻŋ in-memory, super fast āĻāĻŦāĻ‚ scalableāĨ¤

✅ āϏāĻ‚āĻ•ā§āώ⧇āĻĒ⧇ Laravel Caching:

Image description

✅ āĻĒā§āϰāĻļā§āύ ā§§ā§Š: Laravel-āĻ RESTful API āϤ⧈āϰāĻŋ āĻ•āϰāĻžāϰ āϧāĻžāĻĒāϗ⧁āϞ⧋ āϕ⧀ āϕ⧀? āĻĒā§āϰāϏ⧇āϏ āĻŦā§āϝāĻžāĻ–ā§āϝāĻž āĻ•āϰ⧁āύāĨ¤

✅ āωāĻ¤ā§āϤāϰ:

🧠 RESTful API āϕ⧀?

REST (Representational State Transfer) āĻšāϞ⧋ āĻ“ā§Ÿā§‡āĻŦ āϏāĻžāĻ°ā§āĻ­āĻŋāϏ āĻĄāĻŋāϜāĻžāχāύ⧇āϰ āĻāĻ•āϟāĻŋ āĻ¸ā§āϟāĻžāχāϞ, āϝāĻž HTTP āĻŽā§‡āĻĨāĻĄ (GET, POST, PUT, DELETE) āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻĄā§‡āϟāĻž āϰāĻŋāϏ⧋āĻ°ā§āϏ āĻŽā§āϝāĻžāύ⧇āϜ āĻ•āϰ⧇āĨ¤
Laravel-āĻ RESTful API āϤ⧈āϰāĻŋ āĻ•āϰāĻž āϖ⧁āĻŦ āϏāĻšāϜ āĻ“ āĻļāĻ•ā§āϤāĻŋāĻļāĻžāϞ⧀āĨ¤

🚀 Laravel-āĻ RESTful API āϤ⧈āϰāĻŋ āĻ•āϰāĻžāϰ āϧāĻžāĻĒāϗ⧁āϞ⧋:

ā§§. āϰāĻžāωāϟ āϤ⧈āϰāĻŋ āĻ•āϰāĻž (Routes)

Laravel-āĻ API āϰāĻžāωāϟāϗ⧁āϞ⧋ routes/api.php āĻĢāĻžāχāϞ⧇ āϏāĻ‚āĻœā§āĻžāĻžāϝāĻŧāĻŋāϤ āĻ•āϰāĻž āĻšā§ŸāĨ¤

Route::apiResource('posts', PostController::class);
Enter fullscreen mode Exit fullscreen mode
  • apiResource āĻ¸ā§āĻŦ⧟āĻ‚āĻ•ā§āϰāĻŋ⧟āĻ­āĻžāĻŦ⧇ ā§­āϟāĻŋ RESTful āϰāĻžāωāϟ āϤ⧈āϰāĻŋ āĻ•āϰ⧇ (index, show, store, update, destroy)āĨ¤

⧍. āĻ•āĻ¨ā§āĻŸā§āϰ⧋āϞāĻžāϰ āϤ⧈āϰāĻŋ (Controller)

php artisan make:controller PostController --api
Enter fullscreen mode Exit fullscreen mode
  • --api āĻĢā§āĻ˛ā§āϝāĻžāĻ— āĻĻāĻŋā§Ÿā§‡ āĻ•āĻ¨ā§āĻŸā§āϰ⧋āϞāĻžāϰ āϤ⧈āϰāĻŋ āĻ•āϰāϞ⧇ create/edit view āĻŽā§‡āĻĨāĻĄ āĻĨāĻžāϕ⧇ āύāĻž, āĻ•āĻžāϰāĻŖ API āĻļ⧁āϧ⧁ āĻĄā§‡āϟāĻž āĻšā§āϝāĻžāĻ¨ā§āĻĄā§‡āϞ āĻ•āϰ⧇āĨ¤

ā§Š. āĻŽāĻĄā§‡āϞ āĻ“ āĻŽāĻžāχāĻ—ā§āϰ⧇āĻļāύ āϤ⧈āϰāĻŋ (Model & Migration)

php artisan make:model Post -m
Enter fullscreen mode Exit fullscreen mode
  • āĻŽāĻĄā§‡āϞ Post āĻ“ āϏāĻ‚āĻļā§āϞāĻŋāĻˇā§āϟ āĻŽāĻžāχāĻ—ā§āϰ⧇āĻļāύ āĻĢāĻžāχāϞ āϤ⧈āϰāĻŋ āĻšāĻŦ⧇āĨ¤
  • āĻŽāĻžāχāĻ—ā§āϰ⧇āĻļāύ āĻĢāĻžāχāϞ⧇ āĻŸā§‡āĻŦāĻŋāϞ āĻ•āĻžāĻ āĻžāĻŽā§‹ āĻĄāĻŋāĻĢāĻžāχāύ āĻ•āϰ⧁āύ:
Schema::create('posts', function (Blueprint $table) {
    $table->id();
    $table->string('title');
    $table->text('content');
    $table->timestamps();
});
Enter fullscreen mode Exit fullscreen mode
php artisan migrate
Enter fullscreen mode Exit fullscreen mode

ā§Ē. āĻ•āĻ¨ā§āĻŸā§āϰ⧋āϞāĻžāϰ⧇ āĻĢāĻžāĻ‚āĻļāύ āχāĻŽāĻĒā§āϞāĻŋāĻŽā§‡āĻ¨ā§āϟ āĻ•āϰāĻž

use App\Models\Post;
use Illuminate\Http\Request;

class PostController extends Controller
{
    public function index()
    {
        return Post::all();  // āϏāĻŦ āĻĒā§‹āĻ¸ā§āϟ āĻĻ⧇āĻ–āĻžāĻŦ⧇
    }

    public function store(Request $request)
    {
        $validated = $request->validate([
            'title' => 'required|string',
            'content' => 'required|string',
        ]);
        $post = Post::create($validated);

        return response()->json($post, 201);
    }

    public function show($id)
    {
        return Post::findOrFail($id);
    }

    public function update(Request $request, $id)
    {
        $post = Post::findOrFail($id);

        $validated = $request->validate([
            'title' => 'sometimes|required|string',
            'content' => 'sometimes|required|string',
        ]);

        $post->update($validated);

        return response()->json($post);
    }

    public function destroy($id)
    {
        Post::destroy($id);

        return response()->json(null, 204);
    }
}
Enter fullscreen mode Exit fullscreen mode

ā§Ģ. API Resource āĻŦāĻž Resource Collections (Optional)

āωāĻ¨ā§āύāϤ JSON response āĻāϰ āϜāĻ¨ā§āϝ Laravel Resource āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ:

php artisan make:resource PostResource
Enter fullscreen mode Exit fullscreen mode
use App\Http\Resources\PostResource;

public function show($id)
{
    $post = Post::findOrFail($id);
    return new PostResource($post);
}
Enter fullscreen mode Exit fullscreen mode

ā§Ŧ. API Authentication (Optional)

  • API āĻŸā§‹āϕ⧇āύ āĻŦāĻž Passport/ Sanctum āĻĻāĻŋā§Ÿā§‡ āύāĻŋāϰāĻžāĻĒāĻ¤ā§āϤāĻž āύāĻŋāĻļā§āϚāĻŋāϤ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤

ā§­. Test API

Postman, Insomnia āĻŦāĻž āĻ…āĻ¨ā§āϝ āϕ⧋āύ⧋ API client āĻĻāĻŋā§Ÿā§‡ āφāĻĒāύāĻžāϰ API endpoint āϗ⧁āϞ⧋ āĻŸā§‡āĻ¸ā§āϟ āĻ•āϰ⧁āύāĨ¤

đŸ”Ĩ āϏāĻ‚āĻ•ā§āώ⧇āĻĒ⧇ RESTful API āϤ⧈āϰāĻŋ āĻ•āϰāĻžāϰ āϧāĻžāĻĒ:

Image description

🔚 āωāĻĒāϏāĻ‚āĻšāĻžāϰ:

Laravel-āĻ RESTful API āĻŦāĻžāύāĻžāύ⧋ āϖ⧁āĻŦāχ āϏāĻšāϜ āĻāĻŦāĻ‚ āĻļāĻ•ā§āϤāĻŋāĻļāĻžāϞ⧀āĨ¤ Route, Controller, Model, Validation āĻ“ Response handling-āĻ Laravel āĻāϰ āĻŦāĻŋāĻ˛ā§āϟ-āχāύ āϏ⧁āĻŦāĻŋāϧāĻž API āĻĄā§‡āϭ⧇āϞāĻĒāĻŽā§‡āĻ¨ā§āϟāϕ⧇ āĻ…āύ⧇āĻ• āĻĻā§āϰ⧁āϤāϤāϰ āĻ•āϰ⧇ āĻĻā§‡ā§ŸāĨ¤

✅ āĻĒā§āϰāĻļā§āύ ā§§ā§Ē: API Resources āϕ⧀, āĻāĻŦāĻ‚ Laravel-āĻ āφāĻĒāύāĻŋ āϕ⧀āĻ­āĻžāĻŦ⧇ āĻāϗ⧁āϞ⧋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻŦ⧇āύ?

✅ āωāĻ¤ā§āϤāϰ:

🧠 API Resources āϕ⧀?

Laravel API Resources āĻšāϞ⧋ JSON āϰ⧇āϏāĻĒāĻ¨ā§āϏ āĻĢāϰāĻŽā§āϝāĻžāϟ āĻ•āϰāĻžāϰ āĻāĻ•āϟāĻŋ āϏ⧁āĻŦāĻŋāϧāĻžāϜāύāĻ• āĻĒāĻĻā§āϧāϤāĻŋāĨ¤
āĻāϗ⧁āϞ⧋ āĻĄā§‡āϟāĻžāϕ⧇ āĻ•āĻžāĻ āĻžāĻŽā§‹āĻ—āϤ, āĻĒāϰāĻŋāĻˇā§āĻ•āĻžāϰ āĻāĻŦāĻ‚ āĻ•āĻžāĻ¸ā§āϟāĻŽāĻžāχāϜāĻĄ āφāĻ•āĻžāϰ⧇ API āϰ⧇āϏāĻĒāĻ¨ā§āϏ āĻšāĻŋāϏ⧇āĻŦ⧇ āϰāĻŋāϟāĻžāĻ°ā§āύ āĻ•āϰāϤ⧇ āϏāĻžāĻšāĻžāĻ¯ā§āϝ āĻ•āϰ⧇āĨ¤

āϕ⧇āύ API Resource āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻŦ⧇āύ?

  • API āϰ⧇āϏāĻĒāĻ¨ā§āϏ⧇ āĻļ⧁āϧ⧁ āĻĒā§āĻ°ā§Ÿā§‹āϜāĻ¨ā§€ā§Ÿ āĻĄā§‡āϟāĻž āĻĻ⧇āĻ–āĻžāϤ⧇ āĻĒāĻžāϰāĻŦ⧇āύāĨ¤
  • āĻĄā§‡āϟāĻžāϰ āĻĢāϰāĻŽā§āϝāĻžāϟ āĻ•āĻ¨ā§āĻŸā§āϰ⧋āϞ āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŦ⧇āύāĨ¤
  • Response consistency āĻŦāϜāĻžā§Ÿ āĻĨāĻžāϕ⧇āĨ¤
  • Complex nested relationship āϗ⧁āϞ⧋ āϏāĻšāĻœā§‡ āĻŽā§āϝāĻžāύ⧇āϜ āĻ•āϰāĻž āϝāĻžā§ŸāĨ¤

🔧 Laravel-āĻ API Resource āϤ⧈āϰāĻŋ āĻ“ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻžāϰ āϧāĻžāĻĒ:


ā§§. Resource āĻ•ā§āϞāĻžāϏ āϤ⧈āϰāĻŋ āĻ•āϰāĻž

php artisan make:resource PostResource
Enter fullscreen mode Exit fullscreen mode

⧍. Resource āĻ•ā§āϞāĻžāϏ⧇ āĻĄā§‡āϟāĻž āĻĢāϰāĻŽā§āϝāĻžāϟ āĻ•āϰāĻž

app/Http/Resources/PostResource.php āĻĢāĻžāχāϞ⧇:

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class PostResource extends JsonResource
{
    public function toArray($request)
    {
        return [
            'id'       => $this->id,
            'title'    => $this->title,
            'content'  => $this->content,
            'created_at' => $this->created_at->format('Y-m-d H:i:s'),
        ];
    }
}
Enter fullscreen mode Exit fullscreen mode

ā§Š. Controller-āĻ Resource āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž

use App\Http\Resources\PostResource;
use App\Models\Post;

class PostController extends Controller
{
    public function show($id)
    {
        $post = Post::findOrFail($id);
        return new PostResource($post);
    }

    public function index()
    {
        $posts = Post::all();
        return PostResource::collection($posts);
    }
}
Enter fullscreen mode Exit fullscreen mode

ā§Ē. Nested Resource āĻŦā§āϝāĻŦāĻšāĻžāϰ (Optional)

public function toArray($request)
{
    return [
        'id'      => $this->id,
        'title'   => $this->title,
        'author'  => new UserResource($this->whenLoaded('author')),
    ];
}
Enter fullscreen mode Exit fullscreen mode

➕ Collection Resource

Laravel Resource Collections āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϞ⧇ āĻāĻ•āĻžāϧāĻŋāĻ• āϰāĻŋāϏ⧋āĻ°ā§āϏ⧇āϰ āϜāĻ¨ā§āϝ āĻ•āĻžāĻ¸ā§āϟāĻŽ āϞāϜāĻŋāĻ• āϝ⧋āĻ— āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŦ⧇āύāĨ¤

php artisan make:resource PostCollection
Enter fullscreen mode Exit fullscreen mode

🧠 āϏāĻ‚āĻ•ā§āώ⧇āĻĒ⧇:

Image description

✅ āĻĒā§āϰāĻļā§āύ ā§§ā§Ģ: Laravel āϕ⧀āĻ­āĻžāĻŦ⧇ Exception (āĻ¤ā§āϰ⧁āϟāĻŋ) āĻšā§āϝāĻžāĻ¨ā§āĻĄā§‡āϞ āĻ•āϰ⧇? āĻāĻŦāĻ‚ āϕ⧀āĻ­āĻžāĻŦ⧇ āφāĻĒāύāĻŋ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āύ Exception-āĻāϰ āϜāĻ¨ā§āϝ āĻ•āĻžāĻ¸ā§āϟāĻŽ āĻāϰāϰ āĻĒ⧇āϜ āĻŦāĻžāύāĻžāϤ⧇ āĻĒāĻžāϰ⧇āύ?

✅ āωāĻ¤ā§āϤāϰ:

🧠 Laravel-āĻ Exception Handling āϕ⧀āĻ­āĻžāĻŦ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇?

Laravel āĻāϰ Exception Handling āĻŽā§‡āĻ•āĻžāύāĻŋāϜāĻŽ āϖ⧁āĻŦāχ āĻļāĻ•ā§āϤāĻŋāĻļāĻžāϞ⧀ āĻāĻŦāĻ‚ āĻĢā§āϞ⧇āĻ•ā§āϏāĻŋāĻŦāϞāĨ¤
āĻāϟāĻŋ app/Exceptions/Handler.php āĻĢāĻžāχāϞ⧇ āĻŽā§‚āϞāϤ āĻšā§āϝāĻžāĻ¨ā§āĻĄā§‡āϞ āĻ•āϰāĻž āĻšā§ŸāĨ¤

đŸ› ī¸ Exception Handling āĻāϰ āĻŽā§‚āϞ āωāĻĒāĻžāĻĻāĻžāύ:

ā§§. report() method

  • Exception āϞāĻ— āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻŦā§āϝāĻŦāĻšā§ƒāϤ āĻšā§Ÿ (Laravel āĻĄāĻŋāĻĢāĻ˛ā§āϟāĻ­āĻžāĻŦ⧇ Log āĻĢāĻžāχāϞ⧇ āϞ⧇āϖ⧇)āĨ¤
  • āφāĻĒāύāĻŋ āĻāĻ–āĻžāύ⧇ āĻ•āĻžāĻ¸ā§āϟāĻŽ Exception āϞāĻ— āĻŦāĻž ā§ŠāϝāĻŧ āĻĒāĻ•ā§āώ⧇āϰ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡ āϝ⧇āĻŽāύ Sentry, Bugsnag āχāĻ¤ā§āϝāĻžāĻĻāĻŋāϤ⧇ āĻĒāĻžāĻ āĻžāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤
public function report(Throwable $exception)
{
    parent::report($exception);
}
Enter fullscreen mode Exit fullscreen mode

⧍. render() method

  • Exception āĻ•ā§āϝāĻžāĻĒāϚāĻžāϰ āĻ•āϰ⧇ HTTP Response āϤ⧈āϰāĻŋ āĻ•āϰ⧇āĨ¤
  • āĻāĻ–āĻžāύ⧇ āφāĻĒāύāĻŋ Exception āĻ…āύ⧁āϝāĻžā§Ÿā§€ āφāϞāĻžāĻĻāĻž āĻ­āĻŋāω āĻŦāĻž JSON āϰ⧇āϏāĻĒāĻ¨ā§āϏ āĻĻāĻŋāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤
public function render($request, Throwable $exception)
{
    return parent::render($request, $exception);
}
Enter fullscreen mode Exit fullscreen mode

✅ āĻ•āĻžāĻ¸ā§āϟāĻŽ Exception āĻšā§āϝāĻžāĻ¨ā§āĻĄāϞāĻŋāĻ‚ āĻāĻŦāĻ‚ āĻāϰāϰ āĻĒ⧇āϜ āĻŦāĻžāύāĻžāύ⧋:

ā§§. āĻ•āĻžāĻ¸ā§āϟāĻŽ Exception āϤ⧈āϰāĻŋ āĻ•āϰāĻž

php artisan make:exception CustomException
Enter fullscreen mode Exit fullscreen mode

app/Exceptions/CustomException.php:

namespace App\Exceptions;

use Exception;

class CustomException extends Exception
{
    public function render($request)
    {
        return response()->view('errors.custom', [], 500);
    }
}
Enter fullscreen mode Exit fullscreen mode

⧍. Handler.php-āϤ⧇ Exception āφāϞāĻžāĻĻāĻžāĻ­āĻžāĻŦ⧇ āĻšā§āϝāĻžāĻ¨ā§āĻĄāϞ āĻ•āϰāĻž

public function render($request, Throwable $exception)
{
    if ($exception instanceof \App\Exceptions\CustomException) {
        return response()->view('errors.custom', [], 500);
    }

    return parent::render($request, $exception);
}
Enter fullscreen mode Exit fullscreen mode

ā§Š. āĻ­āĻŋāĻ¨ā§āύ Exception-āϰ āϜāĻ¨ā§āϝ āφāϞāĻžāĻĻāĻž āĻĒ⧇āϜ āϤ⧈āϰāĻŋ āĻ•āϰāĻž

Laravel āĻ āĻĄāĻŋāĻĢāĻ˛ā§āϟāĻ­āĻžāĻŦ⧇ āĻ•āĻŋāϛ⧁ error view āĻĨāĻžāϕ⧇ resources/views/errors/ āĻĢā§‹āĻ˛ā§āĻĄāĻžāϰ⧇ āϝ⧇āĻŽāύ:

  • 404.blade.php (Not Found)
  • 500.blade.php (Server Error)
  • 403.blade.php (Forbidden)
  • 419.blade.php (CSRF Token Mismatch)

āφāĻĒāύāĻŋ āĻāϗ⧁āϞ⧋ āĻ•āĻžāĻ¸ā§āϟāĻŽāĻžāχāϜ āĻ•āϰ⧇ āύāĻŋāĻœā§‡āϰ āĻŽāϤ⧋ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤

ā§Ē. API Response āĻāϰ āϜāĻ¨ā§āϝ Exception āĻšā§āϝāĻžāĻ¨ā§āĻĄā§‡āϞ āĻ•āϰāĻž

public function render($request, Throwable $exception)
{
    if ($request->wantsJson()) {
        if ($exception instanceof ModelNotFoundException) {
            return response()->json(['error' => 'Resource not found'], 404);
        }
        return response()->json(['error' => 'Server Error'], 500);
    }

    return parent::render($request, $exception);
}
Enter fullscreen mode Exit fullscreen mode

đŸ”Ĩ Laravel Exception Handling Summary:

Image description

➕ āϏāĻ‚āĻ•ā§āώ⧇āĻĒ⧇:

  • Laravel exception āϗ⧁āϞ⧋ central Handler.php-āϤ⧇ āϧāϰāĻž āĻšā§ŸāĨ¤
  • āφāĻĒāύāĻŋ āύāĻŋāϜāĻ¸ā§āĻŦ Exception class āĻŦāĻžāύāĻŋā§Ÿā§‡ āφāϞāĻžāĻĻāĻž āĻšā§āϝāĻžāĻ¨ā§āĻĄāϞ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤
  • āĻ­āĻŋāĻ¨ā§āύ HTTP status code āĻŦāĻž JSON response āϤ⧈āϰāĻŋ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤
  • āĻ­āĻŋāω āĻĢāĻžāχāϞ āĻ•āĻžāĻ¸ā§āϟāĻŽāĻžāχāϜ āĻ•āϰ⧇ error page āϏ⧁āĻ¨ā§āĻĻāϰ āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŦ⧇āύāĨ¤

✅ āĻĒā§āϰāĻļā§āύ ā§§ā§Ŧ: Laravel-āĻ Logging System āϕ⧀āĻ­āĻžāĻŦ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇? āĻāĻŦāĻ‚ āϕ⧀āĻ­āĻžāĻŦ⧇ āφāĻĒāύāĻŋ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āύ Log Channel āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ āĻ•āϰāĻŦ⧇āύ?

✅ āωāĻ¤ā§āϤāϰ:

🧠 Laravel Logging System āϕ⧀?

Laravel āĻāϰ Logging āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻŽā§‚āϞāϤ Monolog āϞāĻžāχāĻŦā§āϰ⧇āϰāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇, āϝāĻž āĻāĻ•āϟāĻŋ āϜāύāĻĒā§āϰāĻŋ⧟ PHP logging āϞāĻžāχāĻŦā§āϰ⧇āϰāĻŋāĨ¤

Laravel Logging āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻĄā§‡āϭ⧇āϞāĻĒāĻžāϰāĻĻ⧇āϰ āĻĄāĻŋāĻŦāĻžāĻ—, āĻāϰāϰ āĻŸā§āĻ°ā§āϝāĻžāĻ•āĻŋāĻ‚ āĻāĻŦāĻ‚ āχāύāĻĢāϰāĻŽā§‡āĻļāύ āϞāĻ— āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āϏ⧁āĻŦāĻŋāϧāĻžāϜāύāĻ• āĻŦā§āϝāĻŦāĻ¸ā§āĻĨāĻž āĻĻā§‡ā§ŸāĨ¤

đŸ› ī¸ Laravel-āĻ Logging āĻāϰ āĻŽā§‚āϞ āĻŦ⧈āĻļāĻŋāĻˇā§āĻŸā§āϝ:

  • āϏāĻšāĻœā§‡ āϞāĻ— āϞ⧇āĻ–āĻž (info, warning, error, debug, critical āχāĻ¤ā§āϝāĻžāĻĻāĻŋ)
  • āĻāĻ•āĻžāϧāĻŋāĻ• Channel āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻžāϰ āϏ⧁āϝ⧋āĻ— (āĻāĻ•āχ āϏāĻžāĻĨ⧇ āĻĢāĻžāχāϞ, āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āϞāĻ—, Slack āχāĻ¤ā§āϝāĻžāĻĻāĻŋāϤ⧇ āĻĒāĻžāĻ āĻžāύ⧋)
  • āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āύ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ āĻ…āĻĒāĻļāύ āϏāĻšāĻœā§‡ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύāϝ⧋āĻ—ā§āϝ
  • Custom Channel āϤ⧈āϰāĻŋ āĻ•āϰāĻžāϰ āϏ⧁āĻŦāĻŋāϧāĻž

🔍 Laravel āĻ Log āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻžāϰ āĻŽā§ŒāϞāĻŋāĻ• āĻĒāĻĻā§āϧāϤāĻŋ

use Illuminate\Support\Facades\Log;

Log::info('This is an info log');
Log::warning('This is a warning log');
Log::error('This is an error log');
Enter fullscreen mode Exit fullscreen mode

âš™ī¸ Log Channel āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ

Laravel āĻāϰ āϞāĻ— āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ config/logging.php āĻĢāĻžāχāϞ⧇ āĻĨāĻžāϕ⧇āĨ¤

ā§§. Default Log Channel

.env āĻĢāĻžāχāϞ⧇ āĻĄāĻŋāĻĢāĻ˛ā§āϟ āĻšā§āϝāĻžāύ⧇āϞ āϏ⧇āϟ āĻ•āϰāĻž āĻšā§Ÿ:

LOG_CHANNEL=stack
Enter fullscreen mode Exit fullscreen mode

⧍. āĻĒā§āϰāϧāĻžāύ āĻ•āĻŋāϛ⧁ Log Channel:

Image description

ā§Š. āωāĻĻāĻžāĻšāϰāĻŖ: Stack Channel āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ

config/logging.php āĻĨ⧇āϕ⧇:

'channels' => [
    'stack' => [
        'driver' => 'stack',
        'channels' => ['daily', 'slack'],
        'ignore_exceptions' => false,
    ],
    'daily' => [
        'driver' => 'daily',
        'path' => storage_path('logs/laravel.log'),
        'level' => 'debug',
        'days' => 14,
    ],
    'slack' => [
        'driver' => 'slack',
        'url' => env('LOG_SLACK_WEBHOOK_URL'),
        'username' => 'Laravel Log',
        'emoji' => ':boom:',
        'level' => 'critical',
    ],
],
Enter fullscreen mode Exit fullscreen mode

ā§Ē. Log Level āϗ⧁āϞ⧋:

  • emergency
  • alert
  • critical
  • error
  • warning
  • notice
  • info
  • debug

ā§Ģ. Custom Channel āϤ⧈āϰāĻŋ āĻ•āϰāĻž

'channels' => [
    'custom' => [
        'driver' => 'monolog',
        'handler' => Monolog\Handler\StreamHandler::class,
        'with' => [
            'stream' => storage_path('logs/custom.log'),
        ],
        'level' => 'debug',
    ],
],
Enter fullscreen mode Exit fullscreen mode

🧠 Laravel Logging āĻŦā§āϝāĻŦāĻšāĻžāϰ āωāĻĻāĻžāĻšāϰāĻŖ:

Log::debug('Debug message');
Log::info('User logged in', ['user_id' => $user->id]);
Log::error('Something went wrong!');
Enter fullscreen mode Exit fullscreen mode

➕ āϏāĻ‚āĻ•ā§āώ⧇āĻĒ⧇:

Logging System -> Monolog āϞāĻžāχāĻŦā§āϰ⧇āϰāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ Laravel logging āĻ•āϰ⧇
Log Channel -> āϞāĻ— āϞ⧇āĻ–āĻž āϕ⧋āĻĨāĻžā§Ÿ āĻšāĻŦ⧇ āϤāĻžāϰ āύāĻŋāĻ°ā§āĻĻ⧇āĻļāύāĻž (file, slack, syslog āχāĻ¤ā§āϝāĻžāĻĻāĻŋ)
Default Channel -> .env āĻĨ⧇āϕ⧇ āύāĻŋāĻ°ā§āϧāĻžāϰāĻŖ āĻ•āϰāĻž āĻšā§Ÿ
Stack Channel -> āĻāĻ•āĻžāϧāĻŋāĻ• channel āĻāĻ•āχ āϏāĻžāĻĨ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āϝāĻžā§Ÿ
Log Levels -> error, warning, info, debug āχāĻ¤ā§āϝāĻžāĻĻāĻŋ
Custom Channel -> āύāĻŋāĻœā§‡āϰ āĻŽāϤ⧋ āĻ•āϰ⧇ āĻ•āĻžāĻ¸ā§āϟāĻŽ āϞāĻ— āĻšā§āϝāĻžāύ⧇āϞ āϤ⧈āϰāĻŋ āĻ•āϰāĻž āϝāĻžā§Ÿ

✅ āĻĒā§āϰāĻļā§āύ ā§§ā§­: Laravel āĻ…ā§āϝāĻžāĻĒāϞāĻŋāϕ⧇āĻļāύ āĻĄā§‡āĻĒā§āϞāϝāĻŧ āĻ•āϰāĻžāϰ āĻĒā§āϰāĻ•ā§āϰāĻŋāϝāĻŧāĻž āĻŦā§āϝāĻžāĻ–ā§āϝāĻž āĻ•āϰ⧁āύāĨ¤ āφāĻĒāύāĻŋ āϕ⧋āύ āϟ⧁āϞ āĻŦāĻž āĻĒāĻĻā§āϧāϤāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻŦ⧇āύ?

✅ āωāĻ¤ā§āϤāϰ:

🧠 Laravel āĻ…ā§āϝāĻžāĻĒ āĻĄā§‡āĻĒā§āϞ⧟āĻŽā§‡āĻ¨ā§āϟ āϕ⧀?

āĻĄā§‡āĻĒā§āϞāϝāĻŧāĻŽā§‡āĻ¨ā§āϟ āĻŽāĻžāύ⧇ āĻšāϞ⧋ āφāĻĒāύāĻžāϰ Laravel āĻ…ā§āϝāĻžāĻĒāϕ⧇ āϞ⧋āĻ•āĻžāϞ āĻŽā§‡āĻļāĻŋāύ āĻĨ⧇āϕ⧇ āϞāĻžāχāĻ­ āϏāĻžāĻ°ā§āĻ­āĻžāϰ/āĻĒā§āϰ⧋āĻĄāĻžāĻ•āĻļāύ āϏāĻžāĻ°ā§āĻ­āĻžāϰ⧇ āĻ¸ā§āĻĨāĻžāύāĻžāĻ¨ā§āϤāϰ āĻ•āϰāĻž, āϝāĻžāϤ⧇ āχāωāϜāĻžāϰāϰāĻž āĻ…ā§āϝāĻžāĻ•ā§āϏ⧇āϏ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤

🔧 Laravel āĻĄā§‡āĻĒā§āϞāϝāĻŧāĻŽā§‡āĻ¨ā§āĻŸā§‡āϰ āϧāĻžāĻĒāϏāĻŽā§‚āĻš (āϏāĻžāϧāĻžāϰāĻŖ āύāĻŋ⧟āĻŽ):

🔹 ā§§. āĻĒā§āϰ⧋āĻĄāĻžāĻ•āĻļāύ āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻĒā§āϰāĻ¸ā§āϤ⧁āϤ āĻ•āϰāĻž

  1. āφāĻĒāύāĻŋ āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻšāĻŋāϏ⧇āĻŦ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ:
  • Shared Hosting
  • VPS/Cloud Server (e.g., DigitalOcean, AWS, Linode)
  • Platform as a Service (PaaS) – āϝ⧇āĻŽāύ Heroku, Laravel Forge

āĻĒā§āĻ°ā§Ÿā§‹āϜāĻ¨ā§€ā§Ÿ āϏāĻĢāϟāĻ“ā§Ÿā§āϝāĻžāϰ:

  • PHP (>=8.1)
  • MySQL / MariaDB
  • Nginx āĻŦāĻž Apache
  • Composer
  • Laravel CLI

🔹 ⧍. āϕ⧋āĻĄ āφāĻĒāϞ⧋āĻĄ āĻ•āϰāĻž

⧍āϟāĻŋ āϜāύāĻĒā§āϰāĻŋ⧟ āωāĻĒāĻžā§Ÿ:

(āĻ•) Git āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ (āϰ⧇āĻ•āĻŽā§‡āĻ¨ā§āĻĄā§‡āĻĄ)

git clone https://github.com/your-repo.git
Enter fullscreen mode Exit fullscreen mode

(āĻ–) FTP/SFTP āĻŦāĻž cPanel File Manager āĻĻāĻŋā§Ÿā§‡ āϕ⧋āĻĄ āφāĻĒāϞ⧋āĻĄ āĻ•āϰāĻž

🔹 ā§Š. Environment āϏ⧇āϟāφāĻĒ (.env āĻĢāĻžāχāϞ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ)

āĻĒā§āϰ⧋āĻĄāĻžāĻ•āĻļāύ āϏāĻžāĻ°ā§āĻ­āĻžāϰ⧇āϰ āϜāĻ¨ā§āϝ .env āĻĢāĻžāχāϞ āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ:

APP_ENV=production
APP_DEBUG=false
APP_URL=https://yourdomain.com

DB_HOST=127.0.0.1
DB_DATABASE=your_db
DB_USERNAME=root
DB_PASSWORD=secret
Enter fullscreen mode Exit fullscreen mode

🔹 ā§Ē. āĻĄāĻŋāĻĒ⧇āύāĻĄā§‡āĻ¨ā§āϏāĻŋ āχāĻ¨ā§āϏāϟāϞ āĻ•āϰāĻž

composer install --optimize-autoloader --no-dev
Enter fullscreen mode Exit fullscreen mode
  • --no-dev → āĻĄā§‡āϭ⧇āϞāĻĒāĻŽā§‡āĻ¨ā§āϟ āĻĒā§āϝāĻžāϕ⧇āϜ āχāύāĻ¸ā§āϟāϞ āĻšāĻŦ⧇ āύāĻž
  • --optimize-autoloader → āĻ•ā§āϞāĻžāϏāϞ⧋āĻĄāĻžāϰ āĻ…āĻĒāϟāĻŋāĻŽāĻžāχāϜ āĻ•āϰ⧇

🔹 ā§Ģ. APP Key āĻœā§‡āύāĻžāϰ⧇āϟ āĻ•āϰāĻž

php artisan key:generate
Enter fullscreen mode Exit fullscreen mode

🔹 ā§Ŧ. Storage Permission āĻĻ⧇āĻ“ā§ŸāĻž

chmod -R 775 storage
chmod -R 775 bootstrap/cache
Enter fullscreen mode Exit fullscreen mode

🔹 ā§­. āĻŽāĻžāχāĻ—ā§āϰ⧇āĻļāύ āϚāĻžāϞāĻžāύ⧋

php artisan migrate --force
Enter fullscreen mode Exit fullscreen mode
  • --force āĻĻāĻŋā§Ÿā§‡ āύāĻŋāĻļā§āϚāĻŋāϤ āĻ•āϰ⧇ āĻĒā§āϰ⧋āĻĄāĻžāĻ•āĻļāύ āϏāĻžāĻ°ā§āĻ­āĻžāϰ⧇ āĻŽāĻžāχāĻ—ā§āϰ⧇āĻļāύ āĻšāĻŦ⧇

🔹 ā§Ž. āĻ•ā§āϝāĻžāĻļ āĻ…āĻĒāϟāĻŋāĻŽāĻžāχāϜ āĻ•āϰāĻž

php artisan config:cache
php artisan route:cache
php artisan view:cache
Enter fullscreen mode Exit fullscreen mode

🔹 ⧝. Queue Worker āϚāĻžāϞāĻžāύ⧋ (āϝāĻĻāĻŋ queue āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇āύ)

php artisan queue:work
Enter fullscreen mode Exit fullscreen mode

āĻŦāĻž Supervisor āĻĻāĻŋā§Ÿā§‡ manage āĻ•āϰ⧁āύāĨ¤

đŸ› ī¸ Laravel Deployment Tools (āĻĒāĻ›āĻ¨ā§āĻĻ āĻ…āύ⧁āϝāĻžā§Ÿā§€):

Image description

đŸ§Ē Deployment Checklist (āϏāĻ‚āĻ•ā§āώ⧇āĻĒ⧇):

āϧāĻžāĻĒ āĻ•āĻžāϜ
✅ Server Setup -> PHP, DB, Composer āχāύāĻ¸ā§āϟāϞ
✅ Code Upload -> Git clone / FTP
✅ .env Config -> Production āĻ…āύ⧁āϝāĻžā§Ÿā§€
✅ Composer Install -> Dependencies āχāύāĻ¸ā§āϟāϞ
✅ Storage Permission -> āϞ⧇āĻ–āĻžāϰ āĻĒāĻžāϰāĻŽāĻŋāĻļāύ āĻĻāĻŋāύ
✅ DB Migrate -> Artisan āĻĻāĻŋā§Ÿā§‡
✅ Optimize -> config, route, view cache
✅ Supervisor (Queue) -> worker āϚāĻžāϞ⧁ āĻ•āϰ⧁āύ (āϝāĻĻāĻŋ āĻĒā§āϰāϝ⧋āĻœā§āϝ āĻšā§Ÿ)

🏁 āωāĻĒāϏāĻ‚āĻšāĻžāϰ:

Laravel āĻ…ā§āϝāĻžāĻĒ āĻĄā§‡āĻĒā§āϞ⧟ āĻ•āϰāϤ⧇ āĻšāϞ⧇ āφāĻĒāύāĻžāϕ⧇ āĻļ⧁āϧ⧁ āϕ⧋āĻĄ āĻšā§‹āĻ¸ā§āϟ āĻ•āϰāϞ⧇āχ āĻšāĻŦ⧇ āύāĻž, āĻŦāϰāĻ‚ āϏāĻ āĻŋāĻ•āĻ­āĻžāĻŦ⧇ āϏāĻžāĻ°ā§āĻ­āĻžāϰ āϏ⧇āϟāφāĻĒ, .env āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ, āĻĒāĻžāϰāĻŽāĻŋāĻļāύ, āĻŽāĻžāχāĻ—ā§āϰ⧇āĻļāύ, āĻ•ā§āϝāĻžāĻļ āĻāĻŦāĻ‚ āĻĒāĻžāϰāĻĢāϰāĻŽā§āϝāĻžāĻ¨ā§āϏ āĻ…āĻĒāϟāĻŋāĻŽāĻžāχāϜ āĻ•āϰāĻžāĻ“ āϖ⧁āĻŦ āϗ⧁āϰ⧁āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖāĨ¤

✅ āĻĒā§āϰāĻļā§āύ ā§§ā§Ž: Laravel-āĻ environment-specific configuration āϕ⧀āĻ­āĻžāĻŦ⧇ āĻšā§āϝāĻžāĻ¨ā§āĻĄā§‡āϞ āĻ•āϰāĻž āĻšā§Ÿ?

✅ āωāĻ¤ā§āϤāϰ:

🧠 Environment-specific configuration āĻŽāĻžāύ⧇ āϕ⧀?

Laravel āĻ…ā§āϝāĻžāĻĒāϟāĻŋ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āύ āĻĒāϰāĻŋāĻŦ⧇āĻļ⧇ (environment) āĻ•āĻžāϜ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇ — āϝ⧇āĻŽāύ:

  • local (āĻĄā§‡āϭ⧇āϞāĻĒāĻŽā§‡āĻ¨ā§āϟ)
  • staging (āĻĒāϰ⧀āĻ•ā§āώāĻž)
  • production (āϞāĻžāχāĻ­)

Environment-specific configuration āĻŽāĻžāύ⧇ āĻĒā§āϰāϤāĻŋāϟāĻŋ environment āĻ…āύ⧁āϝāĻžāϝāĻŧā§€ āφāϞāĻžāĻĻāĻž āφāϞāĻžāĻĻāĻž āϏ⧇āϟāĻŋāĻ‚āϏ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻžāĨ¤

🔧 Laravel āϕ⧀āĻ­āĻžāĻŦ⧇ Environment āĻĄāĻŋāĻĢāĻžāχāύ āĻ•āϰ⧇?

Laravel APP_ENVvariable āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ environment āϚāĻŋāύ⧇āĨ¤

📁 .env āĻĢāĻžāχāϞ⧇ āφāĻĒāύāĻŋ āϏ⧇āϟ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ:

APP_ENV=local
Enter fullscreen mode Exit fullscreen mode

📁 .env āĻĢāĻžāχāϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ āĻŽā§āϝāĻžāύ⧇āϜāĻŽā§‡āĻ¨ā§āϟ

.env āĻĢāĻžāχāϞ Laravel āĻ…ā§āϝāĻžāĻĒ⧇āϰ āĻ—ā§‹āĻĒāύ āĻ“ āĻĒāϰāĻŋāĻŦ⧇āĻļ-āύāĻŋāĻ°ā§āĻ­āϰ āϤāĻĨā§āϝ āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰ⧇āĨ¤ āϝ⧇āĻŽāύ:

APP_NAME=MyApp
APP_ENV=production
APP_KEY=base64:...
APP_DEBUG=false
APP_URL=https://example.com

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=myapp
DB_USERNAME=root
DB_PASSWORD=secret
Enter fullscreen mode Exit fullscreen mode

🔄 āĻāχ .env āĻĢāĻžāχāϞ āĻĨ⧇āϕ⧇ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ āĻ•āĻŋāĻ­āĻžāĻŦ⧇ āĻĒāĻžāĻ“ā§ŸāĻž āϝāĻžā§Ÿ?

Laravel āĻāϰ āĻ•āύāĻĢāĻŋāĻ— āĻĢāĻžāχāϞāϗ⧁āϞ⧋ (āϝ⧇āĻŽāύ config/app.php, config/database.php) .env āĻĨ⧇āϕ⧇ env() āĻĢāĻžāĻ‚āĻļāύ⧇āϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āĻŽāĻžāύ āύāĻŋāϝāĻŧ⧇ āφāϏ⧇āĨ¤

āωāĻĻāĻžāĻšāϰāĻŖ:

'debug' => env('APP_DEBUG', false),
Enter fullscreen mode Exit fullscreen mode

đŸ—‚ī¸ Environment Specific Config āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻžāϰ āωāĻĒāĻžāϝāĻŧ:
✅ ā§§. āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āύ .env āĻĢāĻžāχāϞ āϤ⧈āϰāĻŋ āĻ•āϰāĻž (āĻ¸ā§āĻŸā§‡āϜ āĻ…āύ⧁āϝāĻžā§Ÿā§€)

.env         ← local environment
.env.staging ← staging server
.env.production ← live server
Enter fullscreen mode Exit fullscreen mode

✅ ⧍. Git-āĻ .env āĻĢāĻžāχāϞ āϰāĻžāĻ–āĻž āωāϚāĻŋāϤ āύāĻž

.gitignore āĻĢāĻžāχāϞ⧇ .env āϰāĻžāĻ–āĻž āĻĨāĻžāϕ⧇, āϝ⧇āύ āĻāϟāĻž version control-āĻ āύāĻž āϝāĻžā§ŸāĨ¤

đŸ› ī¸ Environment Configuration āĻŦā§āϝāĻŦāĻšāĻžāϰ⧇āϰ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻŋāĻ• āĻ•ā§āώ⧇āĻ¤ā§āϰ:

Image description

✅ āϚāĻžāχāϞ⧇ āϕ⧋āĻĄā§‡āϰ āĻ­āĻŋāϤāϰ⧇ environment āĻšā§‡āĻ• āĻ•āϰāϤ⧇āĻ“ āĻĒāĻžāϰ⧇āύ

if (app()->environment('local')) {
    // Local environment-specific logic
}
Enter fullscreen mode Exit fullscreen mode

āĻŦāĻž

if (App::environment(['staging', 'production'])) {
    // For both staging and production
}
Enter fullscreen mode Exit fullscreen mode

🔄 āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ āĻ•ā§āϝāĻžāĻļ āĻ•ā§āϞāĻŋ⧟āĻžāϰ āĻāĻŦāĻ‚ āϰāĻŋāĻĢā§āϰ⧇āĻļ āĻ•āϰāĻžāϰ āĻ•āĻŽāĻžāĻ¨ā§āĻĄ:

php artisan config:clear
php artisan config:cache
Enter fullscreen mode Exit fullscreen mode

đŸ§Ē āωāĻĒāϏāĻ‚āĻšāĻžāϰ (Summary):

Image description

✅ āĻĒā§āϰāĻļā§āύ ⧧⧝: āĻ“āϝāĻŧ⧇āĻŦ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ⧇ āϏāĻžāϧāĻžāϰāĻŖ āϏāĻŋāĻ•āĻŋāωāϰāĻŋāϟāĻŋ āĻĻ⧁āĻ°ā§āĻŦāϞāϤāĻžāϗ⧁āϞ⧋āϰ āφāϞ⧋āϚāύāĻž āĻ•āϰ⧁āύ āĻāĻŦāĻ‚ Laravel āϕ⧀āĻ­āĻžāĻŦ⧇ āĻāχ āĻā§āρāĻ•āĻŋāϗ⧁āϞ⧋ āĻĒā§āϰāϤāĻŋāϰ⧋āϧ āĻ•āϰ⧇ āϤāĻž āĻŦā§āϝāĻžāĻ–ā§āϝāĻž āĻ•āϰ⧁āύāĨ¤

✅ āωāĻ¤ā§āϤāϰ:

🔐 āϏāĻžāϧāĻžāϰāĻŖ āĻ“ā§Ÿā§‡āĻŦ āϏāĻŋāĻ•āĻŋāωāϰāĻŋāϟāĻŋ āĻ­āϞāύāĻžāϰ⧇āĻŦāĻŋāϞāĻŋāϟāĻŋ (Vulnerabilities):

āĻ“āϝāĻŧ⧇āĻŦ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ āϏāĻžāϧāĻžāϰāĻŖāϤ āύāĻŋāĻšā§‡āϰ āύāĻŋāϰāĻžāĻĒāĻ¤ā§āϤāĻž āϏāĻŽāĻ¸ā§āϝāĻžāϰ āĻŽā§āĻ–ā§‹āĻŽā§āĻ–āĻŋ āĻšāϝāĻŧ:

Image description

✅ Laravel āϕ⧀āĻ­āĻžāĻŦ⧇ āĻāϏāĻŦ āϏāĻŽāĻ¸ā§āϝāĻžāϰ āϏāĻŽāĻžāϧāĻžāύ āĻ•āϰ⧇:

🔐 ā§§. SQL Injection – āϏāĻŽāĻžāϧāĻžāύ: Eloquent āĻ“ Query Builder

Laravel āĻāϰ Eloquent ORM āĻāĻŦāĻ‚ Query Builder āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϞ⧇ āĻĄāĻŋāĻĢāĻ˛ā§āϟāĻ­āĻžāĻŦ⧇ prepared statements āϤ⧈āϰāĻŋ āĻšā§ŸāĨ¤

// āύāĻŋāϰāĻžāĻĒāĻĻ
$user = DB::table('users')->where('email', $email)->first();
Enter fullscreen mode Exit fullscreen mode

🔰 āχāύāĻĒ⧁āϟ āϏāϰāĻžāϏāϰāĻŋ SQL āϤ⧇ āĻŦāϏāĻžāϞ⧇ āχāύāĻœā§‡āĻ•āĻļāύ āĻšā§Ÿ āύāĻžāĨ¤

🔐 ⧍. XSS (Cross-site scripting) – āϏāĻŽāĻžāϧāĻžāύ: Blade Escaping

Laravel āĻāϰ Blade āĻŸā§‡āĻŽāĻĒā§āϞ⧇āϟ āχāĻžā§āϜāĻŋāύ āĻ¸ā§āĻŦāϝāĻŧāĻ‚āĻ•ā§āϰāĻŋāϝāĻŧāĻ­āĻžāĻŦ⧇ HTML encode āĻ•āϰ⧇:

{{ $userInput }} {{-- āύāĻŋāϰāĻžāĻĒāĻĻ --}}
{!! $userInput !!} {{-- āϏāĻžāĻŦāϧāĻžāύ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇ --}}
Enter fullscreen mode Exit fullscreen mode

🔰 Blade āĻ {{ }} āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϞ⧇ JavaScript āχāύāĻœā§‡āĻ•āĻļāύ āĻĒā§āϰāϤāĻŋāϰ⧋āϧ āĻšā§ŸāĨ¤

🔐 ā§Š. CSRF (Cross-site request forgery) – āϏāĻŽāĻžāϧāĻžāύ: CSRF Token

Laravel āĻ¸ā§āĻŦāϝāĻŧāĻ‚āĻ•ā§āϰāĻŋāϝāĻŧāĻ­āĻžāĻŦ⧇ āĻĢāĻ°ā§āĻŽā§‡ CSRF āĻŸā§‹āϕ⧇āύ āϝ⧁āĻ•ā§āϤ āĻ•āϰ⧇:

<form method="POST" action="/submit">
    @csrf
</form>
Enter fullscreen mode Exit fullscreen mode

🔰 Laravel āĻāϰ middleware VerifyCsrfToken āĻāχ āĻŸā§‹āϕ⧇āύ āϝāĻžāϚāĻžāχ āĻ•āϰ⧇āĨ¤

🔐 ā§Ē. Mass Assignment – āϏāĻŽāĻžāϧāĻžāύ: Fillable āĻŦāĻž Guarded

Laravel āĻ mass assignment āĻĨ⧇āϕ⧇ āϰāĻ•ā§āώāĻž āĻ•āϰāϤ⧇ fillable āĻŦāĻž guarded āĻĒā§āϰāĻĒāĻžāĻ°ā§āϟāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻšāϝāĻŧāĨ¤

// āϏāĻ āĻŋāĻ•
protected $fillable = ['name', 'email'];

// āύāĻž āϚāĻžāχāϞ⧇ āϏāĻŦ āĻŦā§āϞāĻ•
protected $guarded = ['is_admin'];
Enter fullscreen mode Exit fullscreen mode

🔰 āĻāϟāĻž prevents āĻ•āϰ⧇ āχāωāϜāĻžāϰ āχāύāĻĒ⧁āϟ āĻĨ⧇āϕ⧇ āĻ…āĻŦāĻžāĻžā§āĻ›āĻŋāϤ āĻĢāĻŋāĻ˛ā§āĻĄ āφāĻĒāĻĄā§‡āϟ āĻšāĻ“āϝāĻŧāĻžāĨ¤

🔐 ā§Ģ. Password Hashing – āϏāĻŽāĻžāϧāĻžāύ: bcrypt / Hash āĻĢā§āϝāĻžāϏāĻžāĻĄ

Laravel āĻ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āĻāύāĻ•ā§āϰāĻŋāĻĒā§āϟ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ bcrypt() āĻŦāĻž Hash āĻĢā§āϝāĻžāϏāĻžāĻĄ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻšāϝāĻŧāĨ¤

use Illuminate\Support\Facades\Hash;

$user->password = Hash::make($request->password);
Enter fullscreen mode Exit fullscreen mode

🔰 āĻĒāĻžāϏāĻ“ā§ŸāĻžāĻ°ā§āĻĄ āĻ•āĻ–āύ⧋ āĻĒā§āϞ⧇āχāύ āĻŸā§‡āĻ•ā§āϏāĻŸā§‡ āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰāĻž āωāϚāĻŋāϤ āύāĻžāĨ¤

🔐 ā§Ŧ. File Upload Protection

Laravel āĻĢāĻžāχāϞ āφāĻĒāϞ⧋āĻĄ āĻ•āϰāĻžāϰ āϏāĻŽā§Ÿ āĻŽāĻžāχāĻŽ āϟāĻžāχāĻĒ, āĻāĻ•ā§āϏāĻŸā§‡āύāĻļāύ, āĻ“ āĻĢāĻžāχāϞ āϏāĻžāχāϜ āϝāĻžāϚāĻžāχ āĻ•āϰāĻžāϰ āϏ⧁āĻŦāĻŋāϧāĻž āĻĻā§‡ā§ŸāĨ¤

$request->validate([
    'photo' => 'required|image|mimes:jpg,png,jpeg|max:2048',
]);
Enter fullscreen mode Exit fullscreen mode

🔰 āĻāχ āĻ­ā§āϝāĻžāϞāĻŋāĻĄā§‡āĻļāύ āĻŽā§āϝāĻžāϞāĻŋāϏāĻŋ⧟āĻžāϏ āĻ¸ā§āĻ•ā§āϰāĻŋāĻĒā§āϟ āĻŦāĻž exe āĻĢāĻžāχāϞ āĻŦā§āϞāĻ• āĻ•āϰ⧇āĨ¤

🔐 ā§­. Secure Redirects

Laravel āĻāϰ redirect() āĻĢāĻžāĻ‚āĻļāύ āĻļ⧁āϧ⧁ āĻ…āύ⧁āĻŽā§‹āĻĻāĻŋāϤ URL-āĻ āĻĒāĻžāĻ āĻžāϤ⧇ āϏāĻžāĻšāĻžāĻ¯ā§āϝ āĻ•āϰ⧇āĨ¤

return redirect()->intended('/dashboard');
Enter fullscreen mode Exit fullscreen mode

🔰 āφāĻĒāύāĻžāϰ āχāĻšā§āϛ⧇āĻŽāϤ⧋ āϰāĻŋāĻĄāĻŋāϰ⧇āĻ•ā§āϟ āύāĻž āĻ•āϰ⧇, āĻāϟāĻŋ āφāϗ⧇ āύāĻŋāĻ°ā§āϧāĻžāϰāĻŋāϤ route āĻ āĻĒāĻžāĻ āĻžā§ŸāĨ¤

✨ Laravel āφāϰāĻ“ āϝ⧇āϏāĻŦ āύāĻŋāϰāĻžāĻĒāĻ¤ā§āϤāĻž āϏ⧁āĻŦāĻŋāϧāĻž āĻĻā§‡ā§Ÿ:

Image description

đŸ§Ē āωāĻĒāϏāĻ‚āĻšāĻžāϰ:

Image description

Laravel āĻĄā§‡āϭ⧇āϞāĻĒāĻžāϰāĻĻ⧇āϰ āϏāĻŋāĻ•āĻŋāωāϰāĻŋāϟāĻŋ āύāĻŋāϝāĻŧ⧇ āϏāĻšā§‡āϤāύ āĻĨāĻžāĻ•āϤ⧇ āĻšā§Ÿ āĻāĻŦāĻ‚ Laravel-āĻāϰ āĻŦāĻŋāĻ˛ā§āϟ-āχāύ āϏ⧁āĻŦāĻŋāϧāĻžāϗ⧁āϞ⧋ āĻ āĻŋāĻ•āĻ­āĻžāĻŦ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϞ⧇āχ āĻ…āύ⧇āĻ• āύāĻŋāϰāĻžāĻĒāĻ¤ā§āϤāĻž āĻā§āρāĻ•āĻŋ āĻĻā§‚āϰ āĻšā§ŸāĨ¤

✅ āĻĒā§āϰāĻļā§āύ ⧍ā§Ļ: Laravel āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ⧇ SQL Injection āφāĻ•ā§āϰāĻŽāĻŖ āĻĒā§āϰāϤāĻŋāϰ⧋āϧ⧇ āφāĻĒāύāĻŋ āϕ⧀ āϕ⧀ āĻŦā§āϝāĻŦāĻ¸ā§āĻĨāĻž āύ⧇āĻŦ⧇āύ?

✅ āωāĻ¤ā§āϤāϰ:

🔍 SQL Injection āϕ⧀?

SQL Injection āĻšāϞ⧋ āĻāĻ•āϟāĻŋ āĻ­āĻžāϞāύāĻžāϰ⧇āĻŦāĻŋāϞāĻŋāϟāĻŋ, āϝ⧇āĻ–āĻžāύ⧇ āχāωāϜāĻžāϰ āχāύāĻĒ⧁āĻŸā§‡āϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āĻĄāĻžāϟāĻžāĻŦ⧇āĻœā§‡ āĻ•ā§āώāϤāĻŋāĻ•āϰ SQL āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āχāύāĻœā§‡āĻ•ā§āϟ āĻ•āϰāĻž āϝāĻžā§ŸāĨ¤ āĻāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āĻšā§āϝāĻžāĻ•āĻžāϰ:

  • āĻĄāĻžāϟāĻž āϚ⧁āϰāĻŋ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇
  • āĻĄāĻžāϟāĻž āĻŽā§āϛ⧇ āĻĢ⧇āϞāϤ⧇ āĻĒāĻžāϰ⧇
  • āĻ…āĻĨāϰāĻžāχāϜāĻĄ āύāĻž āĻšā§Ÿā§‡āĻ“ āĻĄāĻžāϟāĻžāĻŦ⧇āϜ āĻ…ā§āϝāĻžāĻ•ā§āϏ⧇āϏ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇

🔐 Laravel āϕ⧀āĻ­āĻžāĻŦ⧇ SQL Injection āĻĨ⧇āϕ⧇ āϰāĻ•ā§āώāĻž āĻ•āϰ⧇?

Laravel āĻĄāĻŋāĻĢāĻ˛ā§āϟāĻ­āĻžāĻŦ⧇ SQL Injection āĻĒā§āϰāϤāĻŋāϰ⧋āϧ āĻ•āϰ⧇ āύāĻŋāĻšā§‡āϰ āĻŸā§‡āĻ•āύāĻŋāĻ•āϗ⧁āϞ⧋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇:

✅ ā§§. Eloquent ORM āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž

Eloquent āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϞ⧇ āχāύāĻĒ⧁āϟ āĻ¸ā§āĻŦāϝāĻŧāĻ‚āĻ•ā§āϰāĻŋāϝāĻŧāĻ­āĻžāĻŦ⧇ bind āĻšā§Ÿ, āϝ⧇āĻ–āĻžāύ⧇ injection āϏāĻŽā§āĻ­āĻŦ āĻšā§Ÿ āύāĻžāĨ¤

// āύāĻŋāϰāĻžāĻĒāĻĻ
$user = User::where('email', $request->email)->first();
Enter fullscreen mode Exit fullscreen mode

🔒 āĻāĻ–āĻžāύ⧇ $request->email āĻĄāĻŋāϰ⧇āĻ•ā§āϟ SQL-āĻ āύāĻž āĻ—āĻŋā§Ÿā§‡ bind āĻšā§Ÿā§‡ āϝāĻžā§ŸāĨ¤

✅ ⧍. Query Builder āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž

Laravel āĻāϰ Query Builder where() āχāĻ¤ā§āϝāĻžāĻĻāĻŋ āĻŽā§‡āĻĨāĻĄ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϞ⧇ prepared statements āϤ⧈āϰāĻŋ āĻšā§ŸāĨ¤

$user = DB::table('users')->where('name', $request->name)->get();
Enter fullscreen mode Exit fullscreen mode

🔒 āĻāĻ–āĻžāύ⧇āĻ“ $request->name SQL string āĻšāĻŋāϏ⧇āĻŦ⧇ āχāύāĻœā§‡āĻ•ā§āϟ āĻšāϤ⧇ āĻĒāĻžāϰ⧇ āύāĻžāĨ¤

đŸšĢ ā§Š. Raw SQL āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϞ⧇ bind āĻ•āϰāϤ⧇ āĻšāĻŦ⧇

āϝāĻĻāĻŋ āφāĻĒāύāĻŋ raw SQL āϚāĻžāϞāĻžāϤ⧇ āϚāĻžāύ, āϤāĻžāĻšāϞ⧇ parameter binding āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇āĨ¤

// ❌ āĻā§āρāĻ•āĻŋāĻĒā§‚āĻ°ā§āĻŖ: āχāωāϜāĻžāϰ āχāύāĻĒ⧁āϟ āĻĄāĻŋāϰ⧇āĻ•ā§āϟ āĻŦāϏāĻžāύ⧋ āĻšā§Ÿā§‡āϛ⧇
DB::select("SELECT * FROM users WHERE name = '$name'");

// ✅ āύāĻŋāϰāĻžāĻĒāĻĻ (bindings āϏāĻš)
DB::select("SELECT * FROM users WHERE name = ?", [$name]);
Enter fullscreen mode Exit fullscreen mode

✅ ā§Ē. Mass Assignment āĻĒā§āϰāϤāĻŋāϰ⧋āϧ

Mass assignment āĻĨ⧇āϕ⧇ SQL injection āĻšāϤ⧇ āĻĒāĻžāϰ⧇ āϝāĻĻāĻŋ āφāĻĒāύāĻŋ $fillable/$guarded āύāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇āύāĨ¤

// ✅ āύāĻŋāϰāĻžāĻĒāĻĻ
protected $fillable = ['name', 'email'];
Enter fullscreen mode Exit fullscreen mode

🔒 āύāĻž āĻĻāĻŋāϞ⧇ malicious āĻĢāĻ°ā§āĻŽ āχāύāĻĒ⧁āϟ sensitive āĻĢāĻŋāĻ˛ā§āĻĄā§‡ āχāύāĻœā§‡āĻ•ā§āϟ āĻšāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤

✅ ā§Ģ. Request Validation āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž

āĻĢāĻ°ā§āĻŽ āχāύāĻĒ⧁āϟ āĻ­ā§āϝāĻžāϞāĻŋāĻĄ āύāĻž āĻšāϞ⧇ āϤāĻž SQL-āĻ āĻĒ⧌āρāĻ›āĻžāύ⧋āϰ āφāϗ⧇āχ āĻŦā§āϞāĻ• āĻšā§Ÿā§‡ āϝāĻžā§ŸāĨ¤

$request->validate([
    'email' => 'required|email',
    'name' => 'required|string|max:255',
]);
Enter fullscreen mode Exit fullscreen mode

✅ ā§Ŧ. Stored Procedure āĻ“ ORM āĻŽāĻŋāϞāĻŋā§Ÿā§‡ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž (Optional Advanced)

Laravel āĻĨ⧇āϕ⧇ āĻĄāĻžāϟāĻžāĻŦ⧇āĻœā§‡āϰ stored procedures āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āϝāĻžā§Ÿ, āϝāĻžāϤ⧇ āϏāϰāĻžāϏāϰāĻŋ āχāύāĻœā§‡āĻ•āĻļāύ āĻĒā§āϰāϤāĻŋāϰ⧋āϧ āĻšā§ŸāĨ¤

DB::statement('CALL safeProcedure(?, ?)', [$val1, $val2]);
Enter fullscreen mode Exit fullscreen mode

đŸ§Ē āϏāĻ‚āĻ•ā§āώ⧇āĻĒ⧇ āĻĒā§āϰāϤāĻŋāϰ⧋āϧāĻŽā§‚āϞāĻ• āĻŦā§āϝāĻŦāĻ¸ā§āĻĨāĻž:

Image description

🏁 āωāĻĒāϏāĻ‚āĻšāĻžāϰ:

Laravel āĻāϰ āĻĄāĻŋāĻĢāĻ˛ā§āϟ ORM āĻ“ Query Builder āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϞ⧇ āφāĻĒāύāĻŋ SQL Injection āĻĨ⧇āϕ⧇ āĻ…āύ⧇āĻ•āϟāĻžāχ āύāĻŋāϰāĻžāĻĒāĻĻāĨ¤ āϤāĻŦ⧇ āĻ•āĻ–āύ⧋ raw SQL āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϞ⧇ āĻ…āĻŦāĻļā§āϝāχ bindings āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇āĨ¤ āĻāĻŦāĻ‚ āϏāĻ°ā§āĻŦāĻĻāĻž āĻ­ā§āϝāĻžāϞāĻŋāĻĄā§‡āĻļāύ, āĻĢāĻŋāĻ˛ā§āϟāĻžāϰāĻŋāĻ‚, āĻ“ āϏāĻ āĻŋāĻ• āĻŽāĻĄā§‡āϞ āĻĢāĻŋāĻ˛ā§āĻĄ āύāĻŋ⧟āĻ¨ā§āĻ¤ā§āϰāĻŖ āĻ•āϰāĻž āωāϚāĻŋāϤāĨ¤

✅ āĻĒā§āϰāĻļā§āύ ⧍⧧: āĻāĻ•āϟāĻŋ PHP āĻĢāĻžāĻ‚āĻļāύ āϞāĻŋāϖ⧁āύ āϝāĻž āĻāĻ•āϟāĻŋ āϏāĻ‚āĻ–ā§āϝāĻžāϰ āϏ⧇āϟ āĻĨ⧇āϕ⧇ āϏāĻŦ āϏāĻŽā§āĻ­āĻžāĻŦā§āϝ āĻ•āĻŽā§āĻŦāĻŋāύ⧇āĻļāύ āϖ⧁āρāĻœā§‡ āĻŦ⧇āϰ āĻ•āϰ⧇ āϝ⧇āϗ⧁āϞ⧋āϰ āϝ⧋āĻ—āĻĢāϞ āĻāĻ•āϟāĻŋ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āϟāĻžāĻ°ā§āϗ⧇āĻŸā§‡āϰ āϏāĻŽāĻžāύ āĻšā§ŸāĨ¤ āύāĻŋāĻļā§āϚāĻŋāϤ āĻ•āϰ⧁āύ āϝ⧇ āĻāϟāĻŋ āĻŦ⧜ āχāύāĻĒ⧁āϟ āĻ…ā§āϝāĻžāϰ⧇ āĻšā§āϝāĻžāĻ¨ā§āĻĄā§‡āϞ āĻ•āϰāϤ⧇ āĻĻāĻ•ā§āώāϤāĻžāϰ āϏāĻžāĻĨ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇āĨ¤

āωāĻĻāĻžāĻšāϰāĻŖ:

āχāύāĻĒ⧁āϟ: [2, 3, 5, 7], target = 8  
āφāωāϟāĻĒ⧁āϟ: [[3, 5], [2, 3, 3]]
Enter fullscreen mode Exit fullscreen mode

✅ āωāĻ¤ā§āϤāϰ:

✅ āϏāĻŽāĻžāϧāĻžāύ (PHP āϕ⧋āĻĄ āϏāĻš):

āφāĻŽāϰāĻž āĻāĻ–āĻžāύ⧇ āĻŦā§āϝāĻžāĻ•āĻŸā§āĻ°ā§āϝāĻžāĻ•āĻŋāĻ‚ āĻ“ āĻŽā§‡āĻŽā§‹āχāĻœā§‡āĻļāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻŦ āϝāĻžāϤ⧇ āĻ•āĻŽā§āĻŦāĻŋāύ⧇āĻļāύ āϖ⧁āρāĻœā§‡ āĻŦ⧇āϰ āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŋ āĻāĻŦāĻ‚ āĻŦāĻžāϰāĻŦāĻžāϰ āĻāĻ•āχ āωāĻĒāϏāĻŽāĻ¸ā§āϝāĻž āύāĻž āĻ•āϰāĻŋāĨ¤

function combinationSum(array $candidates, int $target): array {
    sort($candidates); // Optional but helps avoid duplicate combinations
    $result = [];
    $memo = [];

    function dfs($candidates, $target, $start, $path, &$result, &$memo) {
        $key = $target . '-' . implode(',', $path);
        if (isset($memo[$key])) return;

        if ($target == 0) {
            $result[] = $path;
            return;
        }

        for ($i = $start; $i < count($candidates); $i++) {
            if ($candidates[$i] > $target) break;

            dfs($candidates, $target - $candidates[$i], $i, array_merge($path, [$candidates[$i]]), $result, $memo);
        }

        $memo[$key] = true;
    }

    dfs($candidates, $target, 0, [], $result, $memo);
    return $result;
}

// ✅ āωāĻĻāĻžāĻšāϰāĻŖ āϚāĻžāϞāĻžāύ⧋:
$candidates = [2, 3, 5, 7];
$target = 8;
print_r(combinationSum($candidates, $target));
Enter fullscreen mode Exit fullscreen mode

🧠 āϕ⧀āĻ­āĻžāĻŦ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇:

  • dfs() āĻĢāĻžāĻ‚āĻļāύāϟāĻŋ āϰāĻŋāĻ•āĻžāĻ°ā§āϏāĻŋāĻ­āϞāĻŋ āĻĒā§āϰāϤāĻŋāϟāĻŋ āϏāĻŽā§āĻ­āĻžāĻŦā§āϝ āϏāĻ‚āĻ–ā§āϝāĻžāϰ āϏāĻŽāĻ¨ā§āĻŦ⧟ āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰ⧇āĨ¤
  • āĻāĻ•āχ āϏāĻžāĻŦ-āĻĒā§āϰ⧋āĻŦā§āϞ⧇āĻŽ āφāĻŦāĻžāϰ āύāĻž āĻ•āϰāϤ⧇ memo āĻ…ā§āϝāĻžāϰ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻ›āĻŋāĨ¤
  • start āχāύāĻĄā§‡āĻ•ā§āϏ āĻĻāĻŋā§Ÿā§‡ āĻĒāϰāĻŦāĻ°ā§āϤ⧀ āϰāĻŋāĻ•āĻ°ā§āĻļāύ⧇ āĻĒ⧁āύāϰāĻžāĻŦ⧃āĻ¤ā§āϤāĻŋ āύāĻŋ⧟āĻ¨ā§āĻ¤ā§āϰāĻŖ āĻ•āϰāĻž āĻšā§Ÿ āϝāĻžāϤ⧇ āĻĄā§āĻĒā§āϞāĻŋāϕ⧇āϟ āĻ•āĻŽā§āĻŦāĻŋāύ⧇āĻļāύ āύāĻž āφāϏ⧇āĨ¤
  • āϝāĻĻāĻŋ target == 0 āĻšā§Ÿ, āϤāĻžāĻšāϞ⧇ āĻāϟāĻŋ āĻāĻ•āϟāĻŋ āĻ­ā§āϝāĻžāϞāĻŋāĻĄ āĻ•āĻŽā§āĻŦāĻŋāύ⧇āĻļāύ āĻāĻŦāĻ‚ āϤāĻž result āĻ āϝ⧋āĻ— āĻ•āϰāĻž āĻšā§ŸāĨ¤

âšĄī¸ āĻŦ⧜ āχāύāĻĒ⧁āĻŸā§‡ āĻĒāĻžāϰāĻĢāϰāĻŽā§āϝāĻžāĻ¨ā§āϏ āϟāĻŋāĻĒāϏ:

  • sort() āĻ•āϰāϞ⧇ āϞ⧁āĻĒ⧇ āφāϗ⧇āχ āĻŦ⧜ āϏāĻ‚āĻ–ā§āϝāĻžāϗ⧁āϞ⧋ āĻŦāĻžāĻĻ āĻĻā§‡ā§ŸāĻž āϝāĻžā§Ÿ (if ($candidates[$i] > $target) break;)
  • memoization āĻāϰ āĻĢāϞ⧇ āĻāĻ•āχ āĻ•āĻŽā§āĻŦāĻŋāύ⧇āĻļāύ āĻŦāĻžāϰāĻŦāĻžāϰ āĻšā§‡āĻ• āĻ•āϰāϤ⧇ āĻšā§Ÿ āύāĻžāĨ¤

📤 āωāĻĻāĻžāĻšāϰāĻŖ āφāωāϟāĻĒ⧁āϟ:

Array
(
    [0] => Array
        (
            [0] => 2
            [1] => 3
            [2] => 3
        )

    [1] => Array
        (
            [0] => 3
            [1] => 5
        )
)
Enter fullscreen mode Exit fullscreen mode

✅ āĻĒā§āϰāĻļā§āύ ⧍⧍: Laravel-āĻāϰ Eloquent ORM āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻāĻ•āϟāĻŋ āĻ•ā§ā§Ÿā§‡āϰāĻŋ āϞāĻŋāϖ⧁āύ āϝāĻž āύāĻŋāĻšā§‡āϰ āϤāĻĨā§āϝ āĻĢāĻŋāϰāĻŋā§Ÿā§‡ āĻĻā§‡ā§Ÿ:

  • āĻ—āϤ ā§Šā§Ļ āĻĻāĻŋāύ⧇āϰ āĻŽāĻ§ā§āϝ⧇ āϝ⧇āϏāĻŦ āχāωāϜāĻžāϰ $1,000+ āĻ…āĻ°ā§āĻĄāĻžāϰ āĻ•āϰ⧇āϛ⧇āύ āϤāĻžāĻĻ⧇āϰ āϤāĻžāϞāĻŋāĻ•āĻž
  • āĻĒā§āϰāĻ¤ā§āϝ⧇āĻ• āχāωāϜāĻžāϰ⧇āϰ āĻŽā§‹āϟ āĻ…āĻ°ā§āĻĄāĻžāϰ āĻ…ā§āϝāĻžāĻŽāĻžāωāĻ¨ā§āϟ āĻ“ āĻ…āĻ°ā§āĻĄāĻžāϰ āϏāĻ‚āĻ–ā§āϝāĻž
  • āϤāĻžāĻĻ⧇āϰ āĻĒā§āϰ⧋āĻĢāĻžāχāϞ āĻ“ āϏāĻ°ā§āĻŦāĻļ⧇āώ āĻ…āĻ°ā§āĻĄāĻžāϰ eager load āĻ•āϰāϤ⧇ āĻšāĻŦ⧇

✅ āωāĻ¤ā§āϤāϰ:

🧩 āϧāϰāĻž āϝāĻžāĻ• āφāĻĒāύāĻžāϰ āĻŽāĻĄā§‡āϞ āϗ⧁āϞ⧋ āĻāĻŽāύ:

  • User āĻŽāĻĄā§‡āϞ⧇āϰ āϏāĻžāĻĨ⧇ orders(), profile() āϰāĻŋāϞ⧇āĻļāύ āφāϛ⧇
  • Order āĻŽāĻĄā§‡āϞ⧇āϰ amount, created_at āĻĢāĻŋāĻ˛ā§āĻĄ āφāϛ⧇

✅ Laravel Eloquent ORM āϕ⧋āĻĄ:

use Illuminate\Support\Facades\DB;
use Carbon\Carbon;
use App\Models\User;

$users = User::whereHas('orders', function ($query) {
        $query->where('created_at', '>=', now()->subDays(30));
    })
    ->withSum(['orders' => function ($query) {
        $query->where('created_at', '>=', now()->subDays(30));
    }], 'amount')
    ->withCount(['orders' => function ($query) {
        $query->where('created_at', '>=', now()->subDays(30));
    }])
    ->with(['profile', 'orders' => function ($query) {
        $query->latest()->limit(1);
    }])
    ->get()
    ->filter(function ($user) {
        return $user->orders_sum_amount > 1000;
    });
Enter fullscreen mode Exit fullscreen mode

🧠 āϕ⧀ āĻšā§Ÿā§‡āϛ⧇ āĻāĻ–āĻžāύ⧇:

Image description

📝 āύ⧋āϟ:

  • orders_sum_amount āĻāĻŦāĻ‚ orders_count āĻ…āĻŸā§‹ āĻœā§‡āύāĻžāϰ⧇āĻŸā§‡āĻĄ āĻĢāĻŋāĻ˛ā§āĻĄ Laravel-āĻāϰ withSum() āĻ“ withCount() āĻĨ⧇āϕ⧇ āφāϏ⧇
  • āĻāĻ–āĻžāύ⧇ āφāĻŽāϰāĻž only those users āϰāĻžāĻ–āĻ›āĻŋ āϝāĻžāĻĻ⧇āϰ āĻ—āϤ ā§Šā§Ļ āĻĻāĻŋāύ⧇āϰ āĻ…āĻ°ā§āĻĄāĻžāϰ āĻŸā§‹āϟāĻžāϞ > 1000

✅ āωāĻĻāĻžāĻšāϰāĻŖ āϰāĻŋāϟāĻžāĻ°ā§āύ āĻ­ā§āϝāĻžāϞ⧁:

[
  {
    "id" => 1,
    "name" => "Ruhul Amin",
    "orders_sum_amount" => 1200,
    "orders_count" => 3,
    "profile" => [ ... ],
    "orders" => [
      [ "id" => 5, "amount" => 700, "created_at" => "..." ]
    ]
  },
  ...
]
Enter fullscreen mode Exit fullscreen mode

✅ āĻĒā§āϰāĻļā§āύ ā§¨ā§Š: Laravel-āĻ āĻāĻ•āϟāĻŋ āĻ•āĻžāĻ¸ā§āϟāĻŽ āϏāĻžāĻ°ā§āĻ­āĻŋāϏ āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ āϝāĻž āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āύ salary heads (āϝ⧇āĻŽāύ: basic pay, allowances, deductions) āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻ•āĻ°ā§āĻŽāϚāĻžāϰ⧀āĻĻ⧇āϰ āĻŽāĻžāϏāĻŋāĻ• āĻŦ⧇āϤāύ āĻ—āĻŖāύāĻž āĻ•āϰāĻŦ⧇āĨ¤

  • āϏāĻžāĻ°ā§āĻ­āĻŋāϏāϟāĻŋ āϏāĻžāĻ°ā§āĻ­āĻŋāϏ āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰ⧇ bind āĻ•āϰ⧁āύ
  • āĻāϟāĻŋ āĻāĻ•āϟāĻŋ āĻ•āĻ¨ā§āĻŸā§āϰ⧋āϞāĻžāϰ⧇ inject āĻ•āϰ⧁āύ āĻāĻŦāĻ‚ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻĻ⧇āĻ–āĻžāύ

✅ āωāĻ¤ā§āϤāϰ:

✅ āϧāĻžāĻĒ⧇ āϧāĻžāĻĒ⧇ āϏāĻŽāĻžāϧāĻžāύ


🔧 Step 1: āĻ•āĻžāĻ¸ā§āϟāĻŽ āϏāĻžāĻ°ā§āĻ­āĻŋāϏ āĻ•ā§āϞāĻžāϏ āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ

php artisan make:service SalaryCalculatorService
Enter fullscreen mode Exit fullscreen mode

đŸ”Ŋ āĻŦāĻž āύāĻŋāĻœā§‡ āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ:

📁 app/Services/SalaryCalculatorService.php

namespace App\Services;

class SalaryCalculatorService
{
    public function calculate(array $salaryData): float
    {
        $basic = $salaryData['basic'] ?? 0;
        $allowances = $salaryData['allowances'] ?? 0;
        $deductions = $salaryData['deductions'] ?? 0;

        $totalSalary = $basic + $allowances - $deductions;

        return max($totalSalary, 0); // āύ⧇āϗ⧇āϟāĻŋāĻ­ āĻšāϞ⧇ ā§Ļ āϰāĻŋāϟāĻžāĻ°ā§āύ
    }
}
Enter fullscreen mode Exit fullscreen mode

🧩 Step 2: āϏāĻžāĻ°ā§āĻ­āĻŋāϏ āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰ⧇ bind āĻ•āϰāĻž

📁 app/Providers/AppServiceProvider.php

use App\Services\SalaryCalculatorService;

public function register(): void
{
    $this->app->bind(SalaryCalculatorService::class, function ($app) {
        return new SalaryCalculatorService();
    });
}
Enter fullscreen mode Exit fullscreen mode

đŸ§Ē Step 3: āĻ•āĻ¨ā§āĻŸā§āϰ⧋āϞāĻžāϰ⧇ āχāύāĻœā§‡āĻ•ā§āϟ āĻ•āϰ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž

php artisan make:controller EmployeeController
Enter fullscreen mode Exit fullscreen mode

📁 app/Http/Controllers/EmployeeController.php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Services\SalaryCalculatorService;

class EmployeeController extends Controller
{
    protected $salaryCalculator;

    public function __construct(SalaryCalculatorService $salaryCalculator)
    {
        $this->salaryCalculator = $salaryCalculator;
    }

    public function calculateSalary(Request $request)
    {
        $salaryData = $request->only(['basic', 'allowances', 'deductions']);

        $monthlySalary = $this->salaryCalculator->calculate($salaryData);

        return response()->json([
            'monthly_salary' => $monthlySalary,
        ]);
    }
}
Enter fullscreen mode Exit fullscreen mode

🔗 Step 4: āϰāĻžāωāϟ āϝ⧁āĻ•ā§āϤ āĻ•āϰāĻž

📁 routes/web.php (āĻŦāĻž api.php)

use App\Http\Controllers\EmployeeController;

Route::post('/calculate-salary', [EmployeeController::class, 'calculateSalary']);
Enter fullscreen mode Exit fullscreen mode

✅ āωāĻĻāĻžāĻšāϰāĻŖ āχāύāĻĒ⧁āϟ (POST Request):

{
  "basic": 20000,
  "allowances": 5000,
  "deductions": 3000
}
Enter fullscreen mode Exit fullscreen mode

✅ Response:

{
  "monthly_salary": 22000
}
Enter fullscreen mode Exit fullscreen mode

🧠 āϟāĻŋāĻĒāϏ:

  • āϚāĻžāχāϞ⧇ āφāĻĒāύāĻŋ SalaryCalculatorService-āĻ calculateAnnual() āĻŦāĻž generatePayslip() āĻŽā§‡āĻĨāĻĄāĻ“ āϝ⧋āĻ— āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤
  • āϏāĻžāĻ°ā§āĻ­āĻŋāϏāϕ⧇ āχāĻ¨ā§āϟāĻžāϰāĻĢ⧇āϏ āĻĻāĻŋā§Ÿā§‡ bind āĻ•āϰāϞ⧇āĻ“ āĻ­āĻžāϞ⧋ practice āĻšā§ŸāĨ¤

✅ āĻĒā§āϰāĻļā§āύ ⧍ā§Ē: Laravel-āĻāϰ Broadcasting āĻĢāĻŋāϚāĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻāĻ•āϟāĻŋ āϰāĻŋā§Ÿā§‡āϞ-āϟāĻžāχāĻŽ Notification System āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύāĨ¤

  • āĻāĻ•āϟāĻŋ āύāϤ⧁āύ āĻŦā§āϞāĻ— āĻĒā§‹āĻ¸ā§āϟ āĻĒāĻžāĻŦāϞāĻŋāĻļ āĻšāϞ⧇ āĻāĻ•āϟāĻŋ Event āĻŸā§āϰāĻŋāĻ—āĻžāϰ āĻ•āϰ⧁āύ
  • Pusher āĻŦāĻž Laravel Echo āĻĻāĻŋā§Ÿā§‡ āϏāĻ•āϞ āĻ•āĻžāύ⧇āĻ•ā§āĻŸā§‡āĻĄ āχāωāϜāĻžāϰāϕ⧇ āϤāĻžā§ŽāĻ•ā§āώāĻŖāĻŋāĻ• āύ⧋āϟāĻŋāĻĢāĻŋāϕ⧇āĻļāύ āĻĒāĻžāĻ āĻžāύ

✅ āωāĻ¤ā§āϤāϰ:

✅ āϧāĻžāĻĒ⧇ āϧāĻžāĻĒ⧇ āϏāĻŽāĻžāϧāĻžāύ:

🔧 Step 1: Laravel Broadcast āϏāĻžāĻĒā§‹āĻ°ā§āϟ āϚāĻžāϞ⧁

📄 .env āĻĢāĻžāχāϞ⧇ āϝ⧁āĻ•ā§āϤ āĻ•āϰ⧁āύ:

BROADCAST_DRIVER=pusher
PUSHER_APP_ID=your_app_id
PUSHER_APP_KEY=your_app_key
PUSHER_APP_SECRET=your_app_secret
PUSHER_APP_CLUSTER=mt1
Enter fullscreen mode Exit fullscreen mode

📄 config/broadcasting.php:

'default' => env('BROADCAST_DRIVER', 'null'),
Enter fullscreen mode Exit fullscreen mode

đŸ“Ļ Step 2: āĻĒā§āĻ°ā§Ÿā§‹āϜāĻ¨ā§€ā§Ÿ āĻĒā§āϝāĻžāϕ⧇āϜ āχāύāĻ¸ā§āϟāϞ āĻ•āϰ⧁āύ

composer require pusher/pusher-php-server
npm install --save laravel-echo pusher-js
Enter fullscreen mode Exit fullscreen mode

âšĄī¸ Step 3: āχāϭ⧇āĻ¨ā§āϟ āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ

php artisan make:event NewBlogPostPublished
Enter fullscreen mode Exit fullscreen mode

📁 app/Events/NewBlogPostPublished.php

namespace App\Events;

use App\Models\Post;
use Illuminate\Broadcasting\Channel;
use Illuminate\Queue\SerializesModels;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;

class NewBlogPostPublished implements ShouldBroadcast
{
    use InteractsWithSockets, SerializesModels;

    public $post;

    public function __construct(Post $post)
    {
        $this->post = $post;
    }

    public function broadcastOn()
    {
        return new Channel('blog-posts');
    }

    public function broadcastAs()
    {
        return 'new-post';
    }
}
Enter fullscreen mode Exit fullscreen mode

âœī¸ Step 4: āĻĒā§‹āĻ¸ā§āϟ āĻĒāĻžāĻŦāϞāĻŋāĻļ⧇ āχāϭ⧇āĻ¨ā§āϟ āĻŸā§āϰāĻŋāĻ—āĻžāϰ āĻ•āϰ⧁āύ

📁 app/Http/Controllers/PostController.php

use App\Models\Post;
use App\Events\NewBlogPostPublished;

public function store(Request $request)
{
    $post = Post::create($request->all());

    broadcast(new NewBlogPostPublished($post))->toOthers();

    return response()->json(['message' => 'Post published!']);
}
Enter fullscreen mode Exit fullscreen mode

đŸ§Ē Step 5: āĻĢā§āϰāĻ¨ā§āϟāĻāĻ¨ā§āĻĄ (Laravel Echo + Pusher)

📄 resources/js/bootstrap.js āĻŦāĻž resources/js/app.js

import Echo from 'laravel-echo';
import Pusher from 'pusher-js';

window.Pusher = Pusher;

window.Echo = new Echo({
    broadcaster: 'pusher',
    key: import.meta.env.VITE_PUSHER_APP_KEY,
    cluster: import.meta.env.VITE_PUSHER_APP_CLUSTER,
    forceTLS: true
});
Enter fullscreen mode Exit fullscreen mode

📄 Component āĻŦāĻž Script-āĻ:

Echo.channel('blog-posts')
    .listen('.new-post', (e) => {
        console.log('🎉 āύāϤ⧁āύ āĻĒā§‹āĻ¸ā§āϟ:', e.post.title);
        alert('New Blog Post: ' + e.post.title);
    });
Enter fullscreen mode Exit fullscreen mode

📡 Step 6: Laravel WebSocket āϚāĻžāϞ⧁ (Local Test āĻāϰ āϜāĻ¨ā§āϝ)

composer require beyondcode/laravel-websockets
php artisan vendor:publish --provider="BeyondCode\LaravelWebSockets\WebSocketsServiceProvider"
php artisan migrate
php artisan websockets:serve
Enter fullscreen mode Exit fullscreen mode

✅ āωāĻĒāϏāĻ‚āĻšāĻžāϰ:

Image description

🧠 āĻ…āϤāĻŋāϰāĻŋāĻ•ā§āϤ āϟāĻŋāĻĒāϏ:

  • āϝāĻĻāĻŋ āφāĻĒāύāĻŋ āϞāĻ—āχāύ āχāωāϜāĻžāϰ⧇āϰ āϜāĻ¨ā§āϝ āĻŦā§āϝāĻ•ā§āϤāĻŋāĻ—āϤ āĻšā§āϝāĻžāύ⧇āϞ āϚāĻžāύ, āϤāĻžāĻšāϞ⧇ PrivateChannel āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύāĨ¤
  • āωāĻ¨ā§āύāϤ āĻŦā§āϝāĻŦāĻ¸ā§āĻĨāĻžāϰ āϜāĻ¨ā§āϝ Notification āĻ•ā§āϞāĻžāϏ āĻŦāĻž laravel-notification-channels āχāωāϜ āĻ•āϰāĻž āϝāĻžā§ŸāĨ¤

✅ āĻĒā§āϰāĻļā§āύ ⧍ā§Ģ: Laravel-āĻ āĻāĻ•āϟāĻŋ custom validation rule āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ āϝāĻž Social Security Number (SSN) āĻāϰ āĻĢāϰāĻŽā§āϝāĻžāϟ (āϝ⧇āĻŽāύ 123-45-6789) āϝāĻžāϚāĻžāχ āĻ•āϰāĻŦ⧇āĨ¤
āĻĒāĻžāĻļāĻžāĻĒāĻžāĻļāĻŋ, āĻāĻ•āχ āĻĢāϰāĻŽā§āϝāĻžāϟ āϝāĻžāϚāĻžāĻ‡ā§Ÿā§‡āϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ Raw PHP āĻĢāĻžāĻ‚āĻļāύ āϞāĻŋāϖ⧁āύāĨ¤

✅ āωāĻ¤ā§āϤāϰ:

đŸŸĻ ā§§) Laravel Custom Validation Rule

🔧 āϧāĻžāĻĒ ā§§: āϰ⧁āϞ āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ

php artisan make:rule ValidSSN
Enter fullscreen mode Exit fullscreen mode

📁 app/Rules/ValidSSN.php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class ValidSSN implements Rule
{
    public function passes($attribute, $value)
    {
        // Valid SSN format: 123-45-6789
        return preg_match('/^\d{3}-\d{2}-\d{4}$/', $value);
    }

    public function message()
    {
        return 'The :attribute must be a valid SSN format (e.g. 123-45-6789).';
    }
}
Enter fullscreen mode Exit fullscreen mode

đŸ“Ĩ āϧāĻžāĻĒ ā§¨: āϰ⧁āϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ āĻĢāĻ°ā§āĻŽ āϰāĻŋāĻ•ā§ā§Ÿā§‡āĻ¸ā§āϟ āĻŦāĻž āĻ•āĻ¨ā§āĻŸā§āϰ⧋āϞāĻžāϰ⧇

✅ āωāĻĻāĻžāĻšāϰāĻŖ – Controller:

use App\Rules\ValidSSN;

public function store(Request $request)
{
    $request->validate([
        'ssn' => ['required', new ValidSSN()],
    ]);

    // valid āĻšāϞ⧇ āĻĄā§‡āϟāĻž āϏ⧇āĻ­ āĻ•āϰ⧁āύ
}
Enter fullscreen mode Exit fullscreen mode

🟩 ⧍) Raw PHP Function (SSN āĻĢāϰāĻŽā§āϝāĻžāϟ āϝāĻžāϚāĻžāχ)

function isValidSSN($ssn)
{
    return preg_match('/^\d{3}-\d{2}-\d{4}$/', $ssn);
}

// ✅ āωāĻĻāĻžāĻšāϰāĻŖ
$ssn1 = "123-45-6789";
$ssn2 = "12-345-6789";

echo isValidSSN($ssn1) ? "Valid" : "Invalid"; // Valid
echo isValidSSN($ssn2) ? "Valid" : "Invalid"; // Invalid
Enter fullscreen mode Exit fullscreen mode

✅ āϏāĻ‚āĻ•ā§āώ⧇āĻĒ⧇:

Image description

✅ āĻĒā§āϰāĻļā§āύ ⧍ā§Ŧ: Using Laravel's Cache facade, optimize a scenario where API responses are cached for frequent requests but invalidated whenever the corresponding database table is updated.

Use PHP's Redis extension for caching.Implement a fallback for file-based caching if Redis isn't available.

āϝ⧇āĻ–āĻžāύ⧇ Laravel Cache Facade āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ API āϰ⧇āϏāĻĒāĻ¨ā§āϏ āĻ•ā§āϝāĻžāĻļ āĻ•āϰāĻž āĻšā§Ÿā§‡āϛ⧇ āĻāĻŦāĻ‚ āĻĄāĻžāϟāĻžāĻŦ⧇āϜ āφāĻĒāĻĄā§‡āϟ āĻšāϞ⧇āχ āĻ•ā§āϝāĻžāĻļ āχāύāĻ­ā§āϝāĻžāϞāĻŋāĻĄ āĻšāĻšā§āϛ⧇āĨ¤ Redis āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻšā§Ÿā§‡āϛ⧇ āĻāĻŦāĻ‚ Redis āύāĻž āĻĨāĻžāĻ•āϞ⧇ file-based fallback āĻ“ āϝ⧁āĻ•ā§āϤ āφāϛ⧇āĨ¤

✅ āωāĻ¤ā§āϤāϰ:

✅ āϞāĻ•ā§āĻˇā§āϝ:

  • API āϰ⧇āϏāĻĒāĻ¨ā§āϏ āĻ•ā§āϝāĻžāĻļ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇
  • āĻ•ā§āϝāĻžāĻļ āϤāĻ–āύāχ āχāύāĻ­ā§āϝāĻžāϞāĻŋāĻĄ āĻšāĻŦ⧇ āϝāĻ–āύ āĻĄāĻžāϟāĻžāĻŦ⧇āϜ āφāĻĒāĻĄā§‡āϟ āĻšā§Ÿ
  • Redis āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻŦ, āĻ•āĻŋāĻ¨ā§āϤ⧁ Redis āύāĻž āĻĨāĻžāĻ•āϞ⧇ file fallback āĻšāĻŦ⧇

🔧 āϧāĻžāĻĒ ā§§: .env āĻ“ cache.php āĻĢāĻžāχāϞ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ āĻ•āϰ⧁āύ

✅ .env āĻĢāĻžāχāϞ⧇ āϝ⧁āĻ•ā§āϤ āĻ•āϰ⧁āύ:

CACHE_DRIVER=redis
REDIS_CLIENT=phpredis
Enter fullscreen mode Exit fullscreen mode

✅ config/cache.php

'default' => env('CACHE_DRIVER', 'file'), // Redis āύāĻž āĻĨāĻžāĻ•āϞ⧇ fallback 'file'
Enter fullscreen mode Exit fullscreen mode

Laravel āĻ¸ā§āĻŦ⧟āĻ‚āĻ•ā§āϰāĻŋ⧟āĻ­āĻžāĻŦ⧇ fallback cache āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇āĨ¤

đŸ“Ļ āϧāĻžāĻĒ ā§¨: Redis āϏ⧇āϟāφāĻĒ

Redis āχāĻ¨ā§āϏāϟāϞ āĻ•āϰ⧁āύ (āωāĻŦ⧁āĻ¨ā§āϟ⧁):

sudo apt install redis
sudo systemctl enable redis
sudo systemctl start redis
Enter fullscreen mode Exit fullscreen mode

Laravel Redis āĻĒā§āϝāĻžāϕ⧇āϜ āφāϗ⧇ āĻĨ⧇āϕ⧇āχ āĻ…āĻ¨ā§āϤāĻ°ā§āϭ⧁āĻ•ā§āϤ āĻĨāĻžāϕ⧇āĨ¤ āϤāĻŦ⧇ āύāĻŋāĻļā§āϚāĻŋāϤ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ:

composer require predis/predis
Enter fullscreen mode Exit fullscreen mode

🔁 āϧāĻžāĻĒ ā§Š: API āϰ⧇āϏāĻĒāĻ¨ā§āϏ āĻ•ā§āϝāĻžāĻļ āĻ•āϰ⧁āύ

āϧāϰāĻŋ /api/products āϰāĻžāωāϟ āĻ°ā§Ÿā§‡āϛ⧇āĨ¤

📁 ProductController.php

use Illuminate\Support\Facades\Cache;
use App\Models\Product;

public function index()
{
    $cacheKey = 'products.all';

    // Redis/File Cache āĻĨ⧇āϕ⧇ āϰ⧇āϏāĻĒāĻ¨ā§āϏ āύ⧇āĻ“ā§ŸāĻž, āύāĻž āĻĨāĻžāĻ•āϞ⧇ DB āĻĨ⧇āϕ⧇
    $products = Cache::remember($cacheKey, 60, function () {
        return Product::all();
    });

    return response()->json($products);
}
Enter fullscreen mode Exit fullscreen mode

🧹 āϧāĻžāĻĒ ā§Ē: āĻ•ā§āϝāĻžāĻļ āχāύāĻ­ā§āϝāĻžāϞāĻŋāĻĄ āĻ•āϰāĻž āϝāĻ–āύ āĻĄā§‡āϟāĻž āφāĻĒāĻĄā§‡āϟ āĻšā§Ÿ

📁 ProductController.php

public function update(Request $request, $id)
{
    $product = Product::findOrFail($id);
    $product->update($request->all());

    // āĻ•ā§āϝāĻžāĻļ āĻĄāĻŋāϞāĻŋāϟ
    Cache::forget('products.all');

    return response()->json(['message' => 'Product updated']);
}
Enter fullscreen mode Exit fullscreen mode

āĻāĻ­āĻžāĻŦ⧇ āφāĻĒāύāĻŋ store() āĻŦāĻž delete() āĻŽā§‡āĻĨāĻĄā§‡āĻ“ Cache::forget() āϝ⧋āĻ— āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤


đŸŽ¯ Optional: Observer āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻ…āĻŸā§‹ āĻ•ā§āϝāĻžāĻļ āχāύāĻ­ā§āϝāĻžāϞāĻŋāĻĄā§‡āĻļāύ

📁 app/Observers/ProductObserver.php

namespace App\Observers;
use App\Models\Product;
use Illuminate\Support\Facades\Cache;

class ProductObserver
{
    public function saved(Product $product)
    {
        Cache::forget('products.all');
    }

    public function deleted(Product $product)
    {
        Cache::forget('products.all');
    }
}
Enter fullscreen mode Exit fullscreen mode

📁 AppServiceProvider.php

use App\Models\Product;
use App\Observers\ProductObserver;

public function boot()
{
    Product::observe(ProductObserver::class);
}
Enter fullscreen mode Exit fullscreen mode

đŸ§Ē Bonus: Cache fallback āϝāĻžāϚāĻžāχ

āφāĻĒāύāĻŋ Redis āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻŦāĻ¨ā§āϧ āĻ•āϰ⧇ file fallback āĻ•āĻžāϜ āĻ•āϰāϛ⧇ āĻ•āĻŋāύāĻž āĻĻ⧇āϖ⧁āύ:

sudo systemctl stop redis
php artisan route:clear
php artisan config:clear
Enter fullscreen mode Exit fullscreen mode

āϰāĻžāύ āĻ•āϰāϞ⧇ Laravel āύāĻŋāĻœā§‡āχ fallback āĻĄā§āϰāĻžāχāĻ­āĻžāϰ⧇ (file) āϚāϞ⧇ āϝāĻžāĻŦ⧇āĨ¤

✅ āϏāĻžāϰāϏāĻ‚āĻ•ā§āώ⧇āĻĒ:

Image description

❓ āĻĒā§āϰāĻļā§āύ ⧍⧭: āϤ⧁āĻŽāĻŋ āĻāĻ•āϟāĻŋ Laravel āϕ⧋āĻĄ āĻĒā§‡ā§Ÿā§‡āϛ⧋ āϝāĻž āĻ…āύ⧇āĻ• āϧ⧀āϰāĻ—āϤāĻŋāϤ⧇ āϚāϞāϛ⧇āĨ¤ āύāĻŋāĻšā§‡āϰ āϕ⧋āĻĄāϟāĻŋ āϕ⧀āĻ­āĻžāĻŦ⧇ āĻ…āĻĒāϟāĻŋāĻŽāĻžāχāϜ āĻ•āϰāĻŦ⧇ āϝāĻžāϤ⧇ āĻĄāĻžāϟāĻžāĻŦ⧇āϜ āĻ•ā§‹ā§Ÿā§‡āϰāĻŋāϰ āϏāĻ‚āĻ–ā§āϝāĻž āĻ•āĻŽāĻžāύ⧋ āϝāĻžā§Ÿ?

$orders = Order::where('status', 'completed')->get();
foreach ($orders as $order) {
    $items = $order->items;
    foreach ($items as $item) {
        $details = $item->details;
    }
}
Enter fullscreen mode Exit fullscreen mode

✅ āωāĻ¤ā§āϤāϰ:

āωāĻĒāϰ⧇āϰ āϕ⧋āĻĄāϟāĻŋ N+1 Query Problem āĻāϰ āĻļāĻŋāĻ•āĻžāϰāĨ¤ āĻĒā§āϰāϤāĻŋāϟāĻŋ Order āĻāϰ āϜāĻ¨ā§āϝ āφāϞāĻžāĻĻāĻž āĻ•āϰ⧇ items āĻāĻŦāĻ‚ āĻĒā§āϰāϤāĻŋāϟāĻŋ item āĻāϰ āϜāĻ¨ā§āϝ āφāϞāĻžāĻĻāĻž āĻ•āϰ⧇ details āĻ•ā§ā§Ÿā§āϝāĻžāϰāĻŋ āϚāĻžāϞāĻžāύ⧋ āĻšāĻšā§āϛ⧇āĨ¤ āĻāϰ āĻĢāϞ⧇ āĻ…āύ⧇āĻ•āϗ⧁āϞ⧋ āĻ…āĻĒā§āĻ°ā§Ÿā§‹āϜāĻ¨ā§€ā§Ÿ āĻĄāĻžāϟāĻžāĻŦ⧇āϜ āĻšāĻŋāϟ āĻšā§ŸāĨ¤

🔧 āϏāĻŽāĻžāϧāĻžāύ: Eager Loading āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ

Laravel-āĻāϰ with() āĻŽā§‡āĻĨāĻĄ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āφāĻŽāϰāĻž āĻĒā§āĻ°ā§Ÿā§‹āϜāĻ¨ā§€ā§Ÿ āϰāĻŋāϞ⧇āĻļāύāϗ⧁āϞ⧋ āĻāĻ•āϏāĻžāĻĨ⧇ āϞ⧋āĻĄ āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŋāĨ¤

✅ āĻ…āĻĒāϟāĻŋāĻŽāĻžāχāϜāĻĄ āϕ⧋āĻĄ:

$orders = Order::with('items.details')
    ->where('status', 'completed')
    ->get();

foreach ($orders as $order) {
    foreach ($order->items as $item) {
        $details = $item->details;
    }
}
Enter fullscreen mode Exit fullscreen mode

🧠 āĻŦā§āϝāĻžāĻ–ā§āϝāĻž:

Image description

🔍 āĻĢāϞāĻžāĻĢāϞ:

  • Performance āĻŦ⧃āĻĻā§āϧāĻŋ āĻĒāĻžāĻŦ⧇
  • Query āϏāĻ‚āĻ–ā§āϝāĻž āĻ•āĻŽāĻŦ⧇
  • Memory Efficient āĻšāĻŦ⧇
  • āĻĄā§‡āϟāĻž āĻāĻ•āϏāĻžāĻĨ⧇ āĻ•ā§āϝāĻžāĻļ⧇ āĻĨāĻžāĻ•āϤ⧇ āĻĒāĻžāϰāĻŦ⧇

✅ āϏāĻ‚āĻ•ā§āώ⧇āĻĒ⧇:

Image description

✅ āĻĒā§āϰāĻļā§āύ 28: . You are given the following PHP script, which processes a large array, Rewrite it to reduce memory usage without changing the output.

code:

$data = [];
for ($i = 0; $i < 100000; $i++) {
$data[] = str_repeat('X', 1000);
}
echo array_sum(array_map('strlen', $data));
Enter fullscreen mode Exit fullscreen mode

✅ āωāĻ¤ā§āϤāϰ:

āύāĻŋāĻļā§āϚ⧟āχ! āύāĻŋāĻšā§‡ āĻĻ⧇āĻ“ā§ŸāĻž āϕ⧋āĻĄāϟāĻŋ āĻāĻ•āϟāĻŋ āĻŦ⧜ āĻ…ā§āϝāĻžāϰ⧇ $data āϤ⧈āϰāĻŋ āĻ•āϰ⧇ āϝ⧇āĻ–āĻžāύ⧇ ā§§ āϞāĻžāĻ– āĻāϞāĻŋāĻŽā§‡āĻ¨ā§āϟ āφāϛ⧇, āĻĒā§āϰāϤāĻŋāϟāĻŋāϤ⧇ ā§§ā§Ļā§Ļā§Ļ āĻŦāĻžāϰ⧇āϰ 'X' āĻĨāĻžāϕ⧇āĨ¤ āĻāϰāĻĒāϰ strlen() āĻĻāĻŋā§Ÿā§‡ āĻĒā§āϰāϤāĻŋāϟāĻŋ āĻ¸ā§āĻŸā§āϰāĻŋāĻ‚ā§Ÿā§‡āϰ āĻĻ⧈āĻ°ā§āĻ˜ā§āϝ āĻŦ⧇āϰ āĻ•āϰ⧇ āϤāĻžāĻĻ⧇āϰ āϝ⧋āĻ—āĻĢāϞ āĻĒā§āϰāĻŋāĻ¨ā§āϟ āĻ•āϰ⧇āĨ¤

🔴 āĻŽā§‚āϞ āϏāĻŽāĻ¸ā§āϝāĻž:

$data[] = str_repeat('X', 1000);
Enter fullscreen mode Exit fullscreen mode

āĻāĻ­āĻžāĻŦ⧇ ā§§ āϞāĻžāĻ– āĻŦ⧜ āĻ¸ā§āĻŸā§āϰāĻŋāĻ‚ āĻŽā§‡āĻŽā§‹āϰāĻŋāϤ⧇ āϰ⧇āϖ⧇ āĻĻā§‡ā§Ÿ, āϝāĻž āĻĒā§āϰāϚ⧁āϰ āĻŽā§‡āĻŽā§‹āϰāĻŋ āĻ–āϰāϚ āĻ•āϰ⧇āĨ¤

✅ āϞāĻ•ā§āĻˇā§āϝ:

  • āĻāĻ•āχ āφāωāϟāĻĒ⧁āϟ
  • āĻ•āĻŋāĻ¨ā§āϤ⧁ āĻ•āĻŽ memory consumption

✅ āĻ…āĻĒāϟāĻŋāĻŽāĻžāχāϜāĻĄ āĻ­āĻžāĻ°ā§āϏāύ:

$totalLength = 0;

for ($i = 0; $i < 100000; $i++) {
    $totalLength += strlen(str_repeat('X', 1000));
}

echo $totalLength;
Enter fullscreen mode Exit fullscreen mode

✅ āĻŦā§āϝāĻžāĻ–ā§āϝāĻž:

  • āφāĻŽāϰāĻž āĻĒ⧁āϰ⧋ āĻ…ā§āϝāĻžāϰ⧇ $data āĻŽā§‡āĻŽā§‹āϰāĻŋāϤ⧇ āϜāĻŽāĻžāχ āύāĻžāĨ¤
  • āϏāϰāĻžāϏāϰāĻŋ āĻĒā§āϰāϤāĻŋāϟāĻŋ āĻ¸ā§āĻŸā§āϰāĻŋāĻ‚ā§Ÿā§‡āϰ strlen āĻŦ⧇āϰ āĻ•āϰ⧇ totalLength āĻ āϝ⧋āĻ— āĻ•āϰāĻŋāĨ¤
  • āĻŽā§‡āĻŽā§‹āϰāĻŋāϤ⧇ 1 āϞāĻžāĻ– āĻ¸ā§āĻŸā§āϰāĻŋāĻ‚ āύāĻž āϰ⧇āϖ⧇ āϏāϰāĻžāϏāϰāĻŋ āϝ⧋āĻ—āĻĢāϞ āĻ•āϰāĻž āĻšā§Ÿ, āĻĢāϞ⧇ Memory Usage āĻ…āύ⧇āĻ• āĻ•āĻŽā§‡ āϝāĻžā§ŸāĨ¤

🔍 āφāωāϟāĻĒ⧁āϟ:

100000000
Enter fullscreen mode Exit fullscreen mode

āĻ•āĻžāϰāĻŖ 100000 * 1000 = 100,000,000 āϚāϰāĻŋāĻ¤ā§āϰ

✅ āĻ…āϤāĻŋāϰāĻŋāĻ•ā§āϤ āϟāĻŋāĻĒāϏ:

  • Laravel āĻŦāĻž PHP performance optimization-āĻāϰ āϏāĻŽā§Ÿ "avoid keeping large arrays in memory" āϖ⧁āĻŦ āϗ⧁āϰ⧁āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖ āĻŦāĻŋāώ⧟āĨ¤
  • āĻāĻ•āχ āĻ•ā§ŒāĻļāϞ āφāĻĒāύāĻŋ CSV read, log process, āĻŦāĻž large dataset āϗ⧁āϞ⧋āϰ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇āĻ“ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ — streaming āĻŦāĻž on-the-fly processingāĨ¤

✅ āĻĒā§āϰāĻļā§āύ 29:. Write a raw PHP script to handle form submission with:

  1. XSS protection for input fields.
  2. CSRF token generation and validation.

✅ āωāĻ¤ā§āϤāϰ:

āĻ…āĻŦāĻļā§āϝāχ! āύāĻŋāĻšā§‡ āĻāĻ•āϟāĻŋ āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ Raw PHP āĻ¸ā§āĻ•ā§āϰāĻŋāĻĒā§āϟ āĻĻ⧇āĻ“ā§ŸāĻž āĻšāϞ⧋ āϝāĻž āĻāĻ•āϟāĻŋ āĻĢāĻ°ā§āĻŽ āĻĒā§āϰāϏ⧇āϏ āĻ•āϰ⧇ āĻāĻŦāĻ‚ āϤāĻžāϤ⧇:

✅ XSS Protection
✅ CSRF Token Generation & Validation

āωāϭ⧟ āϏāĻŋāĻ•āĻŋāωāϰāĻŋāϟāĻŋ āĻŦā§āϝāĻŦāĻ¸ā§āĻĨāĻž āĻ…āĻ¨ā§āϤāĻ°ā§āϭ⧁āĻ•ā§āϤ āĻ•āϰāĻž āĻšā§Ÿā§‡āϛ⧇āĨ¤


✅ Step-by-Step Raw PHP Script
📁 form.php

<?php
session_start();

// ✅ CSRF Token Generate
if (empty($_SESSION['csrf_token'])) {
    $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}

// ✅ āϝāĻĻāĻŋ POST āϏāĻžāĻŦāĻŽāĻŋāϟ āĻšā§Ÿ
if ($_SERVER['REQUEST_METHOD'] === 'POST') {

    // ✅ 1. CSRF Token Validate
    if (!isset($_POST['csrf_token']) || $_POST['csrf_token'] !== $_SESSION['csrf_token']) {
        die('CSRF token validation failed!');
    }

    // ✅ 2. XSS Protection — input sanitize
    $name = htmlspecialchars(trim($_POST['name'] ?? ''));
    $email = htmlspecialchars(trim($_POST['email'] ?? ''));

    echo "<h3>Form submitted safely!</h3>";
    echo "Name: " . $name . "<br>";
    echo "Email: " . $email . "<br>";

    // ✅ Optional: regenerate token for next form
    $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
?>

<!-- ✅ HTML Form -->
<!DOCTYPE html>
<html>
<head><title>Secure Form</title></head>
<body>
    <h2>Secure Form</h2>
    <form method="POST" action="form.php">
        <label>Name:</label><br>
        <input type="text" name="name" required><br><br>

        <label>Email:</label><br>
        <input type="email" name="email" required><br><br>

        <!-- ✅ CSRF Token -->
        <input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>">

        <button type="submit">Submit</button>
    </form>
</body>
</html>
Enter fullscreen mode Exit fullscreen mode

🔐 Breakdown

Image description

✅ Example Output:

Form submitted safely!
Name: Ruhul Amin
Email: ruhul@example.com
Enter fullscreen mode Exit fullscreen mode

đŸ›Ąī¸ Extra Security Tips:

  • XSS āϰ⧋āϧ⧇ āĻĒā§āϰāϤāĻŋāϟāĻŋ āφāωāϟāĻĒ⧁āĻŸā§‡āĻ“ htmlspecialchars() āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ
  • CSRF Token āĻĒā§āϰāϤāĻŋāϟāĻŋ āĻĢāĻ°ā§āĻŽā§‡ āύāϤ⧁āύ āĻ•āϰ⧇ āĻœā§‡āύāĻžāϰ⧇āϟ āĻ•āϰāĻž āĻ­āĻžāϞ⧋ (per request)
  • āφāϰāĻ“ āĻļāĻ•ā§āϤāĻŋāĻļāĻžāϞ⧀ validation-āĻāϰ āϜāĻ¨ā§āϝ filter_var() āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ

✅ āĻĒā§āϰāĻļā§āύ 30: Implement a custom artisan command to archive orders older than 1 year by:

Moving them to an archive table.Logging the operation details to a custom log file.Handling errors gracefully with retries and notifications.

✅ āωāĻ¤ā§āϤāϰ:

āĻ…āĻŦāĻļā§āϝāχ! āύāĻŋāĻšā§‡ Laravel Custom Artisan Command āĻāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āĻāĻ•āϟāĻŋ āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āϏāĻŽāĻžāϧāĻžāύ āĻĻ⧇āĻ“ā§ŸāĻž āĻšāϞ⧋ āϝ⧇āĻ–āĻžāύ⧇:

✅ ā§§ āĻŦāĻ›āϰ⧇āϰ āĻĒ⧁āϰ⧋āύ⧋ āĻ…āĻ°ā§āĻĄāĻžāϰāϗ⧁āϞ⧋ orders āĻŸā§‡āĻŦāĻŋāϞ āĻĨ⧇āϕ⧇ archived_orders āĻŸā§‡āĻŦāĻŋāϞ⧇ āϏāϰāĻŋā§Ÿā§‡ āύ⧇āĻ“ā§ŸāĻž āĻšāĻšā§āϛ⧇
✅ āĻ…āĻĒāĻžāϰ⧇āĻļāύ āĻĄāĻŋāĻŸā§‡āχāϞāϏ custom log file āĻ āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰāĻž āĻšāĻšā§āϛ⧇
✅ āϰāĻŋāĻŸā§āϰāĻžāχ āĻ“ āύ⧋āϟāĻŋāĻĢāĻŋāϕ⧇āĻļāύ āϏāĻš error handling āĻŦā§āϝāĻŦāĻ¸ā§āĻĨāĻžāĻ“ āϰāĻžāĻ–āĻž āĻšā§Ÿā§‡āϛ⧇

đŸ› ī¸ āϧāĻžāĻĒ ā§§: archived_orders āĻŽāĻžāχāĻ—ā§āϰ⧇āĻļāύ āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ

php artisan make:migration create_archived_orders_table
Enter fullscreen mode Exit fullscreen mode

📁 database/migrations/xxxx_xx_xx_create_archived_orders_table.php

public function up()
{
    Schema::create('archived_orders', function (Blueprint $table) {
        $table->id();
        $table->unsignedBigInteger('user_id');
        $table->decimal('amount', 10, 2);
        $table->timestamps();
    });
}
Enter fullscreen mode Exit fullscreen mode
php artisan migrate
Enter fullscreen mode Exit fullscreen mode

🧑‍đŸ’ģ āϧāĻžāĻĒ ā§¨: āĻ•āĻžāĻ¸ā§āϟāĻŽ āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ

php artisan make:command ArchiveOldOrders
Enter fullscreen mode Exit fullscreen mode

📁 app/Console/Commands/ArchiveOldOrders.php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Throwable;

class ArchiveOldOrders extends Command
{
    protected $signature = 'orders:archive-old';
    protected $description = 'Archive orders older than 1 year to archived_orders table';

    public function handle()
    {
        $this->info('Starting archive process...');
        $attempts = 0;
        $maxAttempts = 3;

        do {
            try {
                DB::beginTransaction();

                $oldOrders = DB::table('orders')
                    ->where('created_at', '<', now()->subYear())
                    ->get();

                foreach ($oldOrders as $order) {
                    DB::table('archived_orders')->insert([
                        'id'        => $order->id,
                        'user_id'   => $order->user_id,
                        'amount'    => $order->amount,
                        'created_at'=> $order->created_at,
                        'updated_at'=> $order->updated_at,
                    ]);

                    DB::table('orders')->where('id', $order->id)->delete();

                    // ✅ āĻ•āĻžāĻ¸ā§āϟāĻŽ āϞāĻ— āĻĢāĻžāχāϞ⧇ āϞāĻ— āĻ•āϰāĻž
                    Log::channel('archive')->info("Archived order ID: {$order->id}");
                }

                DB::commit();
                $this->info('Archiving complete. Total orders: ' . count($oldOrders));
                return Command::SUCCESS;

            } catch (Throwable $e) {
                DB::rollBack();
                $attempts++;

                Log::channel('archive')->error("Attempt {$attempts} failed: " . $e->getMessage());

                if ($attempts >= $maxAttempts) {
                    $this->error('Archiving failed after 3 attempts.');
                    // ✅ Email or Slack notification if needed
                    // Notification::route('mail', 'admin@example.com')->notify(new ArchiveFailedNotification($e));
                    return Command::FAILURE;
                }

                $this->warn("Retrying... (Attempt: {$attempts})");
                sleep(2); // delay between retries
            }
        } while ($attempts < $maxAttempts);
    }
}
Enter fullscreen mode Exit fullscreen mode

📝 āϧāĻžāĻĒ ā§Š: āĻ•āĻžāĻ¸ā§āϟāĻŽ āϞāĻ— āĻšā§āϝāĻžāύ⧇āϞ āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ

📁 config/logging.php āĻ channels āϏ⧇āĻ•āĻļāύ⧇ āϝ⧁āĻ•ā§āϤ āĻ•āϰ⧁āύ:

'archive' => [
    'driver' => 'single',
    'path' => storage_path('logs/order-archive.log'),
    'level' => 'info',
],
Enter fullscreen mode Exit fullscreen mode

🚀 āϧāĻžāĻĒ ā§Ē: Artisan Command āϰāĻžāύ āĻ•āϰ⧁āύ

php artisan orders:archive-old
Enter fullscreen mode Exit fullscreen mode

📄 āϞāĻ— āĻĢāĻžāχāϞ

āϞāĻ— āĻĒāĻžāĻŦ⧇āύ āĻāĻ–āĻžāύ⧇:

storage/logs/order-archive.log
Enter fullscreen mode Exit fullscreen mode

āωāĻĻāĻžāĻšāϰāĻŖ:

[2025-05-26 12:30:00] local.INFO: Archived order ID: 10123
[2025-05-26 12:30:00] local.INFO: Archived order ID: 10124
Enter fullscreen mode Exit fullscreen mode

🔐 Bonus: āύ⧋āϟāĻŋāĻĢāĻŋāϕ⧇āĻļāύ āĻĢ⧇āχāϞ āĻšāϞ⧇

// Notification::route('mail', 'admin@example.com')
// ->notify(new ArchiveFailedNotification($e));

āϚāĻžāχāϞ⧇ āφāĻŽāĻŋ ArchiveFailedNotification āĻ•ā§āϞāĻžāϏāĻ“ āϤ⧈āϰāĻŋ āĻ•āϰ⧇ āĻĻāĻŋāϤ⧇ āĻĒāĻžāϰāĻŋāĨ¤

✅ āϏāĻ‚āĻ•ā§āώ⧇āĻĒ⧇

Image description

Top comments (0)