Resource Controllers

Controllerهای Resource برای عملیات CRUD استاندارد

graph TD A[Route::resource] --> B[Resource Controller] B --> C[index] B --> D[create] B --> E[store] B --> F[show] B --> G[edit] B --> H[update] B --> I[destroy] C --> J[GET /resource] D --> K[GET /resource/create] E --> L[POST /resource] F --> M[GET /resource/{id}] G --> N[GET /resource/{id}/edit] H --> O[PUT/PATCH /resource/{id}] I --> P[DELETE /resource/{id}]

Resource Controller یک Controller است که تمام عملیات CRUD (Create, Read, Update, Delete) را در یک کلاس مدیریت می‌کند. این الگو استاندارد RESTful را پیاده‌سازی می‌کند و کد را organized و maintainable می‌کند.


متدهای استاندارد Resource Controller:


  • <strong>index()</strong>: نمایش لیست تمام resources (GET /resource)
  • <strong>create()</strong>: نمایش فرم ایجاد resource جدید (GET /resource/create)
  • <strong>store()</strong>: ذخیره resource جدید (POST /resource)
  • <strong>show()</strong>: نمایش یک resource خاص (GET /resource/{id})
  • <strong>edit()</strong>: نمایش فرم ویرایش (GET /resource/{id}/edit)
  • <strong>update()</strong>: به‌روزرسانی resource (PUT/PATCH /resource/{id})
  • <strong>destroy()</strong>: حذف resource (DELETE /resource/{id})

مزایای Resource Controllers:


  • کد سازمان‌یافته و استاندارد
  • پیاده‌سازی RESTful conventions
  • Routeهای خودکار با <code>Route::resource()</code>
  • کاهش boilerplate code
  • Consistency در API design
  • آسان‌تر برای testing

API Resource Controllers:


برای API endpoints که نیازی به create() و edit() ندارند (چون فرم HTML ندارند)، می‌توانید از Route::apiResource() استفاده کنید که فقط متدهای index, store, show, update, destroy را ایجاد می‌کند.

مثال‌ها

ایجاد Resource Controller

php artisan make:controller UserController --resource

// Or with model
php artisan make:controller UserController --resource --model=User

دستور artisan برای ایجاد Resource Controller.

Route Resource

// Full resource routes
Route::resource('users', UserController::class);

// Creates:
// GET    /users              index
// GET    /users/create       create
// POST   /users              store
// GET    /users/{user}       show
// GET    /users/{user}/edit  edit
// PUT    /users/{user}       update
// PATCH  /users/{user}       update
// DELETE /users/{user}       destroy

این یک خط route تمام متدهای CRUD را ایجاد می‌کند.

API Resource Routes

// API resource (without create/edit)
Route::apiResource('users', UserController::class);

// Creates:
// GET    /users              index
// POST   /users              store
// GET    /users/{user}       show
// PUT    /users/{user}       update
// PATCH  /users/{user}       update
// DELETE /users/{user}       destroy

// Multiple API resources
Route::apiResources([
    'users' => UserController::class,
    'posts' => PostController::class,
]);

API resource routes که فقط متدهای مورد نیاز API را ایجاد می‌کند.

Partial Resource Routes

// Only specific methods
Route::resource('users', UserController::class)
    ->only(['index', 'show', 'store']);

// Exclude specific methods
Route::resource('users', UserController::class)
    ->except(['create', 'edit', 'destroy']);

// With middleware
Route::resource('users', UserController::class)
    ->middleware(['auth'])
    ->except(['index', 'show']);

استفاده از only() و except() برای محدود کردن methods.

Resource Controller Implementation

<?php

namespace App\Http\Controllers;

use App\Models\User;
use App\Http\Requests\StoreUserRequest;
use App\Http\Requests\UpdateUserRequest;

class UserController extends Controller
{
    public function index()
    {
        $users = User::paginate(15);
        return view('users.index', compact('users'));
    }
    
    public function create()
    {
        return view('users.create');
    }
    
    public function store(StoreUserRequest $request)
    {
        $user = User::create($request->validated());
        return redirect()->route('users.show', $user)
            ->with('success', 'User created');
    }
    
    public function show(User $user)
    {
        return view('users.show', compact('user'));
    }
    
    public function edit(User $user)
    {
        return view('users.edit', compact('user'));
    }
    
    public function update(UpdateUserRequest $request, User $user)
    {
        $user->update($request->validated());
        return redirect()->route('users.show', $user)
            ->with('success', 'User updated');
    }
    
    public function destroy(User $user)
    {
        $user->delete();
        return redirect()->route('users.index')
            ->with('success', 'User deleted');
    }
}

یک Resource Controller کامل با تمام methods.

Nested Resources

// Nested resource routes
Route::resource('users.posts', PostController::class);

// Creates:
// GET    /users/{user}/posts              index
// GET    /users/{user}/posts/create       create
// POST   /users/{user}/posts              store
// GET    /users/{user}/posts/{post}       show
// GET    /users/{user}/posts/{post}/edit edit
// PUT    /users/{user}/posts/{post}       update
// DELETE /users/{user}/posts/{post}       destroy

// In controller
public function index(User $user)
{
    $posts = $user->posts;
    return view('posts.index', compact('posts', 'user'));
}

Nested resources برای relationships.

Resource Names

// Custom route names
Route::resource('users', UserController::class)
    ->names([
        'index' => 'users.list',
        'show' => 'users.view',
    ]);

// Or with prefix
Route::resource('users', UserController::class)
    ->names('admin.users');

// Usage
route('users.list');
route('users.view', $user);

Custom route names برای resource routes.

Shallow Nesting

// Shallow nesting (avoid deep nesting)
Route::resource('users.posts', PostController::class)
    ->shallow();

// Creates:
// GET    /users/{user}/posts              index
// GET    /users/{user}/posts/create       create
// POST   /users/{user}/posts              store
// GET    /posts/{post}                    show (shallow)
// GET    /posts/{post}/edit               edit (shallow)
// PUT    /posts/{post}                    update (shallow)
// DELETE /posts/{post}                    destroy (shallow)

Shallow nesting برای جلوگیری از URLهای خیلی عمیق.

موارد استفاده

  • ایجاد RESTful APIs
  • مدیریت CRUD operations برای resources
  • سازمان‌دهی کد با standard structure
  • ایجاد admin panels
  • API endpoints با consistent structure
  • Nested resources برای relationships

اشتباهات رایج

  • استفاده از resource controller برای non-CRUD operations
  • عدم استفاده از Form Requests برای validation
  • قرار دادن business logic در controller
  • عدم استفاده از route model binding
  • فراموش کردن middleware برای protected routes
  • استفاده از resource برای everything که over-engineering است

بهترین روش‌ها

  • از resource controllers برای CRUD operations استفاده کنید
  • از Form Requests برای validation استفاده کنید
  • از route model binding استفاده کنید
  • از API resources برای API endpoints استفاده کنید
  • از shallow nesting برای nested resources استفاده کنید
  • Business logic را در Service classes قرار دهید
  • Resource controllers را test کنید

موارد خاص

  • Nested resources با multiple levels
  • Resource routes با custom constraints
  • Resource controllers با soft deletes
  • API resources با different response formats
  • Resource routes با subdomain routing
  • Conditional resource methods

نکات عملکرد

  • Resource routes با route caching سریع‌تر می‌شوند
  • استفاده از eager loading در index() مهم است
  • Pagination در index() برای large datasets
  • Route model binding می‌تواند performance را بهبود دهد

نکات امنیتی

  • همیشه از middleware برای protected routes استفاده کنید
  • از Form Requests برای validation و authorization استفاده کنید
  • مطمئن شوید که destroy() method authorization دارد
  • از route model binding برای automatic 404 استفاده کنید

نکات مصاحبه

  • تفاوت بین resource و apiResource چیست؟
  • چه زمانی باید از resource controller استفاده کرد؟
  • Nested resources چیست و چه زمانی استفاده می‌شود؟
  • Shallow nesting چیست و چرا مهم است؟
  • چگونه می‌توان resource routes را customize کرد؟
  • مزایای استفاده از resource controllers چیست؟

یادداشت‌های نسخه

  • Laravel 11.x: بهبود performance در resource route resolution
  • Laravel 11.x: پشتیبانی بهتر از shallow nesting
  • Laravel 10.x: بهبود API resource controllers
  • Laravel 9.x: بهبود nested resource handling