Laravel Controllers
Complete Guide in Hindi
Laravel Controllers की पूरी जानकारी — Basic, Resource, Invokable, Dependency Injection, Form Requests, Middleware in Controllers। Real CRUD example के साथ।
📋 इस Article में क्या-क्या है
- Controller क्या है?
- Controller बनाना — Artisan
- Basic Controller
- Resource Controller — CRUD
- Invokable Controller
- Dependency Injection
- Request Object
- Form Request Validation
- Controller Middleware
- Real World — ProductController
Controller — MVC का C। User request आने पर: input लेता है, business logic run करता है, Model से data fetch करता है, View को data देता है। Routes में closure function लिखने की जगह Controller use करो — code organized रहता है।
❌ Route में Logic — Bad
$products = Product::where("active", 1)
->orderBy("naam")->paginate(15);
return view("products.index", compact("products"));
});
// Route file messy हो जाती है ❌
✅ Controller में Logic — Good
// ProductController.php
public function index() {
$products = Product::active()->paginate(15);
return view("products.index", compact("products"));
}
// Clean और organized ✅
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
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"));
}
}
?>
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"));
}
}
?>
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!");
}
}
?>
Invokable Controller — सिर्फ एक काम करने वाला controller। __invoke() method। Complex single actions के लिए perfect — SendWelcomeEmail, GenerateReport, ProcessPayment।
// 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);
?>
Dependency Injection (DI) — Classes को manually new से create नहीं करना। Laravel का Service Container automatically inject करता है। Testing easy, decoupled code।
// 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"));
}
}
?>
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");
}
?>
php artisan make:request UpdateProductRequest
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
]);
}
}
?>
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!");
}
}
?>
// 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"]),
];
}
}
?>
| Rule | मतलब | Example |
|---|---|---|
| required | Field ज़रूरी है | "naam" => "required" |
| nullable | null allowed | "bio" => "nullable|string" |
| string | String होना चाहिए | "naam" => "required|string" |
| integer | Integer होना चाहिए | "qty" => "required|integer" |
| numeric | Number (int/float) | "price" => "required|numeric" |
| Valid email format | "email" => "required|email" | |
| max:255 | Max length/value | "naam" => "max:255" |
| min:0 | Min value | "price" => "min:0" |
| unique:table,col | DB में unique होना चाहिए | "email" => "unique:users,email" |
| exists:table,col | DB में exist होना चाहिए | "cat_id" => "exists:categories,id" |
| confirmed | password_confirmation match | "password" => "confirmed" |
| image | Image file (jpg/png/gif) | "photo" => "image|max:2048" |
| mimes:jpg,png | Specific mime types | "file" => "mimes:pdf,doc" |
| in:a,b,c | Specific values में से | "role" => "in:admin,user" |
| boolean | true/false/1/0 | "active" => "boolean" |
| date | Valid date | "dob" => "required|date" |
| after:today | Future date | "expires" => "after:today" |
| url | Valid URL | "website" => "nullable|url" |
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।