Laravel Series · Chapter 3 · Controllers

Laravel Controllers
Complete Guide in Hindi

Laravel Controllers की पूरी जानकारी — Basic, Resource, Invokable, Dependency Injection, Form Requests, Middleware in Controllers। Real CRUD example के साथ।

🎮 Basic Controller 📦 Resource Controller ⚡ Invokable 💉 Dependency Injection ✅ Form Requests
make:controllerArtisan command
7 methodsResource Controller में
__invokeSingle action controller
$this->middlewareController middleware

📋 इस Article में क्या-क्या है

  1. Controller क्या है?
  2. Controller बनाना — Artisan
  3. Basic Controller
  4. Resource Controller — CRUD
  5. Invokable Controller
  6. Dependency Injection
  7. Request Object
  8. Form Request Validation
  9. Controller Middleware
  10. Real World — ProductController
1
Controller क्या है?

Controller — MVC का C। User request आने पर: input लेता है, business logic run करता है, Model से data fetch करता है, View को data देता है। Routes में closure function लिखने की जगह Controller use करो — code organized रहता है।

❌ Route में Logic — Bad

Route::get("/products", function() {
  $products = Product::where("active", 1)
    ->orderBy("naam")->paginate(15);
  return view("products.index", compact("products"));
});
// Route file messy हो जाती है ❌

✅ Controller में Logic — Good

Route::get("/products", [ProductController::class, "index"]);

// ProductController.php
public function index() {
  $products = Product::active()->paginate(15);
  return view("products.index", compact("products"));
}
// Clean और organized ✅

2
Controller बनाना — Artisan Commands
ARTISAN — CONTROLLER GENERATE
# Basic controller
php artisan make:controller ProductController

# Resource controller — 7 CRUD methods auto-generate
php artisan make:controller ProductController --resource

# Resource + Model bind
php artisan make:controller ProductController --resource --model=Product

# Invokable — single action
php artisan make:controller SendWelcomeEmail --invokable

# API resource — no create/edit methods
php artisan make:controller Api/ProductController --api

# Nested folder
php artisan make:controller Admin/ProductController --resource
# → app/Http/Controllers/Admin/ProductController.php

3
Basic Controller — Structure
app/Http/Controllers/ProductController.php
<?php

namespace App\Http\Controllers;

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

class ProductController extends Controller {

  // GET /products
  public function index() {
    $products = Product::all();
    return view("products.index", compact("products"));
  }

  // GET /products/{id}
  public function show(int $id) {
    $product = Product::findOrFail($id);
    return view("products.show", compact("product"));
  }

  // Custom method
  public function featured() {
    $products = Product::where("featured", true)->get();
    return view("products.featured", compact("products"));
  }
}
?>
Response Types — Views, JSON, Redirect
<?php
class ExampleController extends Controller {

  // View return
  public function page() {
    return view("welcome", ["title" => "Home"]);
  }

  // JSON response (API)
  public function api() {
    return response()->json([
      "success" => true,
      "data" => Product::all(),
    ]);
  }

  // Redirect
  public function goHome() {
    return redirect()->route("home");
  }

  // Redirect with flash message
  public function store() {
    // ... save logic
    return redirect()->route("products.index")
                ->with("success", "✅ Product saved!");
  }

  // Download file
  public function download() {
    return response()->download(storage_path("app/report.pdf"));
  }
}
?>

4
Resource Controller — Complete CRUD
📦
CRUD

Resource Controller

7 standard CRUD methods automatically generate होते हैं। --resource flag से। Route Model Binding के साथ use करने पर DB queries automatically।

7 CRUD methods --resource flag Auto Route Binding
app/Http/Controllers/ProductController.php — FULL RESOURCE
<?php

namespace App\Http\Controllers;

use App\Models\Product;
use Illuminate\Http\Request;
use Illuminate\Http\RedirectResponse;
use Illuminate\View\View;

class ProductController extends Controller {

  // 1. GET /products — List all
  public function index(): View {
    $products = Product::latest()->paginate(15);
    return view("products.index", compact("products"));
  }

  // 2. GET /products/create — Show create form
  public function create(): View {
    return view("products.create");
  }

  // 3. POST /products — Save new product
  public function store(Request $request): RedirectResponse {
    $validated = $request->validate([
      "naam" => "required|string|max:255",
      "price" => "required|numeric|min:0",
      "stock" => "required|integer|min:0",
    ]);
    Product::create($validated);
    return redirect()->route("products.index")
                ->with("success", "Product created!");
  }

  // 4. GET /products/{product} — Show single
  public function show(Product $product): View { // Route Model Binding
    return view("products.show", compact("product"));
  }

  // 5. GET /products/{product}/edit — Show edit form
  public function edit(Product $product): View {
    return view("products.edit", compact("product"));
  }

  // 6. PUT /products/{product} — Update
  public function update(Request $request, Product $product): RedirectResponse {
    $validated = $request->validate([
      "naam" => "required|string|max:255",
      "price" => "required|numeric|min:0",
    ]);
    $product->update($validated);
    return redirect()->route("products.show", $product)
                ->with("success", "Product updated!");
  }

  // 7. DELETE /products/{product} — Delete
  public function destroy(Product $product): RedirectResponse {
    $product->delete();
    return redirect()->route("products.index")
                ->with("success", "Product deleted!");
  }
}
?>

5
Invokable Controller — Single Action

Invokable Controller — सिर्फ एक काम करने वाला controller। __invoke() method। Complex single actions के लिए perfect — SendWelcomeEmail, GenerateReport, ProcessPayment।

INVOKABLE — Single Action Controller
<?php

// app/Http/Controllers/SendWelcomeEmail.php
namespace App\Http\Controllers;

use App\Models\User;
use App\Mail\WelcomeMail;
use Illuminate\Support\Facades\Mail;

class SendWelcomeEmail extends Controller {

  public function __invoke(User $user) {
    Mail::to($user->email)->send(new WelcomeMail($user));
    return redirect()->back()->with("success", "Email sent!");
  }
}

// routes/web.php — method name की ज़रूरत नहीं
Route::post("/users/{user}/welcome-email", SendWelcomeEmail::class);
?>
💡 When to use Invokable? Single responsibility principle। एक controller जो सिर्फ एक काम करे — GenerateInvoice, ProcessRefund, SendOTP जैसे actions।

6
Dependency Injection — Constructor & Method

Dependency Injection (DI) — Classes को manually new से create नहीं करना। Laravel का Service Container automatically inject करता है। Testing easy, decoupled code।

DEPENDENCY INJECTION — CONSTRUCTOR & METHOD
<?php

// Constructor Injection — हर method में available
class OrderController extends Controller {

  public function __construct(
    private readonly OrderService $orderService,
    private readonly PaymentService $paymentService,
  ) {}

  public function store(Request $request) {
    $order = $this->orderService->create($request->validated());
    $this->paymentService->charge($order);
    return redirect()->route("orders.show", $order);
  }
}

// Method Injection — specific method में
class ReportController extends Controller {

  public function generate(
    Request $request, // HTTP Request
    ReportService $service, // Auto-injected
    int $year, // Route parameter
  ) {
    $report = $service->generateAnnual($year);
    return view("reports.annual", compact("report"));
  }
}
?>

7
Request Object — Input Data Handle करना
REQUEST — ALL USEFUL METHODS
<?php
public function store(Request $request) {

  // Input values
  $naam = $request->input("naam"); // GET + POST दोनों
  $price = $request->input("price", 0); // Default value
  $naam = $request->naam; // Magic property
  $naam = $request->naam(); // Method access

  // All input
  $all = $request->all(); // All inputs array
  $only = $request->only(["naam", "price"]); // Specific fields
  $excl = $request->except(["_token"]); // Exclude fields

  // Check methods
  $request->has("naam"); // key exist करता है?
  $request->filled("naam"); // exist + non-empty?
  $request->missing("email"); // missing है?
  $request->boolean("active"); // "1","true","on" → true
  $request->integer("qty"); // Integer cast
  $request->float("price"); // Float cast

  // HTTP info
  $request->method(); // "GET", "POST"
  $request->isMethod("post"); // true/false
  $request->url(); // Full URL
  $request->path(); // /products/create
  $request->ip(); // User IP
  $request->userAgent(); // Browser info
  $request->wantsJson(); // API request?

  // File upload
  $file = $request->file("photo");
  $path = $file->store("photos", "public");
}
?>

8
Form Request — Dedicated Validation Class

FormReq

Form Request

Controller से validation logic अलग करने का elegant तरीका। Authorize (permission check) + Rules (validation rules) — एक dedicated class में।

make:request authorize() method rules() method
STEP 1 — Form Request बनाओ
php artisan make:request StoreProductRequest
php artisan make:request UpdateProductRequest
app/Http/Requests/StoreProductRequest.php
<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class StoreProductRequest extends FormRequest {

  // Permission check — कौन create कर सकता है?
  public function authorize(): bool {
    return $this->user()->can("create", Product::class);
    // return true; // सब allow
  }

  // Validation rules
  public function rules(): array {
    return [
      "naam" => "required|string|max:255",
      "slug" => "required|string|unique:products,slug",
      "price" => "required|numeric|min:0",
      "stock" => "required|integer|min:0",
      "category_id" => "required|exists:categories,id",
      "image" => "nullable|image|mimes:jpg,png,webp|max:2048",
      "description" => "nullable|string|max:5000",
    ];
  }

  // Custom error messages (optional)
  public function messages(): array {
    return [
      "naam.required" => "Product का नाम ज़रूरी है।",
      "price.required" => "Price enter करें।",
      "category_id.exists" => "Valid category select करें।",
      "image.max" => "Image 2MB से छोटी होनी चाहिए।",
    ];
  }

  // Input prepare करना (optional)
  protected function prepareForValidation(): void {
    $this->merge([
      "slug" => str($this->naam)->slug(), // naam से slug auto-generate
    ]);
  }
}
?>
STEP 2 — Controller में Use करो
<?php
use App\Http\Requests\StoreProductRequest;
use App\Http\Requests\UpdateProductRequest;

class ProductController extends Controller {

  public function store(StoreProductRequest $request) {
    // Validation automatic! Failed → redirect back with errors
    // $request->validated() — only validated fields
    // $request->safe() — safe access
    Product::create($request->validated());
    return redirect()->route("products.index")->with("success", "Created!");
  }

  public function update(UpdateProductRequest $request, Product $product) {
    $product->update($request->validated());
    return redirect()->route("products.show", $product)->with("success", "Updated!");
  }
}
?>
✅ Form Request के फायदे: Controller slim रहता है। Validation logic reusable। Authorization और validation एक जगह। Custom error messages easy।

9
Controller Middleware — Access Control
MIDDLEWARE — CONTROLLER LEVEL
<?php

// Laravel 10 और पुराने — Constructor में
class ProductController extends Controller {

  public function __construct() {
    $this->middleware("auth"); // All methods
    $this->middleware("admin")->only(["create", "store", "destroy"]);
    $this->middleware("log")->except(["index", "show"]);
  }
}

// Laravel 11 — static middleware() method
class ProductController extends Controller {

  public static function middleware(): array {
    return [
      "auth", // All methods
      new Middleware("admin", only: ["create", "store", "destroy"]),
      new Middleware("verified", except: ["index", "show"]),
    ];
  }
}
?>

10
Real World — Common Validation Rules
RuleमतलबExample
requiredField ज़रूरी है"naam" => "required"
nullablenull allowed"bio" => "nullable|string"
stringString होना चाहिए"naam" => "required|string"
integerInteger होना चाहिए"qty" => "required|integer"
numericNumber (int/float)"price" => "required|numeric"
emailValid email format"email" => "required|email"
max:255Max length/value"naam" => "max:255"
min:0Min value"price" => "min:0"
unique:table,colDB में unique होना चाहिए"email" => "unique:users,email"
exists:table,colDB में exist होना चाहिए"cat_id" => "exists:categories,id"
confirmedpassword_confirmation match"password" => "confirmed"
imageImage file (jpg/png/gif)"photo" => "image|max:2048"
mimes:jpg,pngSpecific mime types"file" => "mimes:pdf,doc"
in:a,b,cSpecific values में से"role" => "in:admin,user"
booleantrue/false/1/0"active" => "boolean"
dateValid date"dob" => "required|date"
after:todayFuture date"expires" => "after:today"
urlValid URL"website" => "nullable|url"
Pattern: Route → FormRequest (validate + authorize) → Controller (business logic) → Model (DB) → View/JSON।

निष्कर्ष

Controllers Laravel के दिल हैं। Business logic यहाँ रहती है — Routes slim, Models focused, Views clean।

Route::resource()ResourceController — CRUD के लिए perfect combination।

Form Requests — Validation controller से अलग। authorize() + rules() + messages()।

$request->validated() — हमेशा validated data use करो। Direct $_POST नहीं।

Dependency Injection — Constructor में services inject करो। new करने की ज़रूरत नहीं।

Invokable Controllers — Single action के लिए। SendEmail, ProcessPayment।

🚀 अगला Chapter: Chapter 4: Blade Templates — Layouts, Components, Directives, @foreach, @if, @auth। Beautiful views बनाना।