Resource Controllers
Controllerهای Resource برای عملیات CRUD استاندارد
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