مقدمه
Laravel یکی از محبوبترین فریمورکهای PHP است که توسعه وب را آسانتر و سریعتر میکند. در این مقاله، شما را با اصول Laravel و نحوه ساخت API های قدرتمند آشنا میکنم.
چرا Laravel؟
مزایای Laravel:
- Eloquent ORM: کار با پایگاه داده به صورت شیگرا
- Artisan CLI: ابزارهای خط فرمان قدرتمند
- Blade Templating: موتور قالبسازی انعطافپذیر
- Middleware: مدیریت درخواستها و پاسخها
- Security: ویژگیهای امنیتی پیشفرض
نصب و راهاندازی Laravel
1. پیشنیازها
- PHP 8.1 یا بالاتر
- Composer
- MySQL یا PostgreSQL
- Apache یا Nginx
2. نصب Laravel
# نصب Laravel با Composer
composer create-project laravel/laravel my-project
cd my-project
# اجرای سرور توسعه
php artisan serve
ساختار پروژه Laravel
app/
├── Http/
│ ├── Controllers/
│ ├── Middleware/
│ └── Requests/
├── Models/
├── Providers/
└── Services/
config/ # تنظیمات
database/ # Migration ها و Seeders
resources/
├── views/ # Blade templates
└── js/ # فایلهای JavaScript
routes/ # Route ها
storage/ # فایلهای ذخیره شده
tests/ # تستها
مفاهیم اصلی Laravel
1. Routes پیشرفته - API و Web
Route ها URL های اپلیکیشن را تعریف میکنند. در اینجا مثالهای پیشرفته میبینید:
الف) Web Routes با Middleware و Grouping:
<?php
// routes/web.php
use App\Http\Controllers\ProductController;
use App\Http\Controllers\CartController;
use App\Http\Controllers\OrderController;
use App\Http\Controllers\ProfileController;
use Illuminate\Support\Facades\Route;
// Public Routes
Route::get('/', [ProductController::class, 'index'])->name('home');
Route::get('/products/{product}', [ProductController::class, 'show'])->name('products.show');
Route::get('/search', [ProductController::class, 'search'])->name('products.search');
// Guest Routes (only for non-authenticated users)
Route::middleware('guest')->group(function () {
Route::get('/login', [AuthController::class, 'showLogin'])->name('login');
Route::post('/login', [AuthController::class, 'login']);
Route::get('/register', [AuthController::class, 'showRegister'])->name('register');
Route::post('/register', [AuthController::class, 'register']);
});
// Authenticated Routes
Route::middleware('auth')->group(function () {
// Profile Management
Route::get('/profile', [ProfileController::class, 'show'])->name('profile.show');
Route::put('/profile', [ProfileController::class, 'update'])->name('profile.update');
Route::delete('/profile', [ProfileController::class, 'destroy'])->name('profile.destroy');
// Cart Management
Route::prefix('cart')->name('cart.')->group(function () {
Route::get('/', [CartController::class, 'index'])->name('index');
Route::post('/add', [CartController::class, 'add'])->name('add');
Route::put('/update/{item}', [CartController::class, 'update'])->name('update');
Route::delete('/remove/{item}', [CartController::class, 'remove'])->name('remove');
Route::delete('/clear', [CartController::class, 'clear'])->name('clear');
});
// Order Management
Route::prefix('orders')->name('orders.')->group(function () {
Route::get('/', [OrderController::class, 'index'])->name('index');
Route::post('/create', [OrderController::class, 'store'])->name('store');
Route::get('/{order}', [OrderController::class, 'show'])->name('show');
Route::post('/{order}/cancel', [OrderController::class, 'cancel'])->name('cancel');
});
// Logout
Route::post('/logout', [AuthController::class, 'logout'])->name('logout');
});
// Admin Routes
Route::middleware(['auth', 'admin'])->prefix('admin')->name('admin.')->group(function () {
Route::get('/dashboard', [AdminController::class, 'dashboard'])->name('dashboard');
// Product Management
Route::resource('products', AdminProductController::class);
Route::post('products/{product}/toggle-status', [AdminProductController::class, 'toggleStatus'])
->name('products.toggle-status');
// Order Management
Route::get('orders', [AdminOrderController::class, 'index'])->name('orders.index');
Route::get('orders/{order}', [AdminOrderController::class, 'show'])->name('orders.show');
Route::put('orders/{order}/status', [AdminOrderController::class, 'updateStatus'])
->name('orders.update-status');
// User Management
Route::resource('users', AdminUserController::class);
Route::post('users/{user}/toggle-status', [AdminUserController::class, 'toggleStatus'])
->name('users.toggle-status');
});
// API Routes
Route::prefix('api/v1')->group(function () {
// Public API
Route::get('/products', [Api\ProductController::class, 'index']);
Route::get('/products/{product}', [Api\ProductController::class, 'show']);
Route::get('/categories', [Api\CategoryController::class, 'index']);
// Authenticated API
Route::middleware('auth:sanctum')->group(function () {
Route::get('/user', [Api\UserController::class, 'show']);
Route::put('/user', [Api\UserController::class, 'update']);
Route::apiResource('cart', Api\CartController::class);
Route::apiResource('orders', Api\OrderController::class);
});
});
// Fallback Route (must be last)
Route::fallback(function () {
return response()->view('errors.404', [], 404);
});
ب) API Routes با Rate Limiting:
<?php
// routes/api.php
use Illuminate\Support\Facades\Route;
use Illuminate\Http\Request;
// Rate Limited API Routes
Route::middleware(['throttle:60,1'])->group(function () {
Route::get('/products', [Api\ProductController::class, 'index']);
Route::get('/products/{product}', [Api\ProductController::class, 'show']);
});
// Strict Rate Limiting for Auth
Route::middleware(['throttle:5,1'])->group(function () {
Route::post('/auth/login', [Api\AuthController::class, 'login']);
Route::post('/auth/register', [Api\AuthController::class, 'register']);
Route::post('/auth/forgot-password', [Api\AuthController::class, 'forgotPassword']);
});
// Authenticated API with Sanctum
Route::middleware(['auth:sanctum', 'throttle:100,1'])->group(function () {
Route::get('/user', function (Request $request) {
return $request->user();
});
Route::apiResource('orders', Api\OrderController::class);
Route::apiResource('cart', Api\CartController::class);
});
// Admin API with stricter limits
Route::middleware(['auth:sanctum', 'admin', 'throttle:200,1'])->prefix('admin')->group(function () {
Route::apiResource('products', Api\AdminProductController::class);
Route::apiResource('users', Api\AdminUserController::class);
Route::get('/analytics', [Api\AdminAnalyticsController::class, 'index']);
});
🛣️ نکات مهم Routes:
- Route Groups: برای سازماندهی بهتر routes
- Middleware: برای اعمال محدودیتها و احراز هویت
- Rate Limiting: برای محافظت از API
- Resource Routes: برای CRUD operations
2. Controllers
Controller ها منطق اپلیکیشن را مدیریت میکنند:
<?php
namespace App\Http\Controllers;
use App\Models\User;
use Illuminate\Http\Request;
class UserController extends Controller
{
public function index()
{
$users = User::all();
return response()->json($users);
}
public function store(Request $request)
{
$user = User::create($request->validated());
return response()->json($user, 201);
}
}
3. Models و Eloquent
Eloquent ORM کار با پایگاه داده را آسان میکند:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
protected $fillable = ['name', 'email', 'password'];
protected $hidden = ['password'];
// روابط
public function posts()
{
return $this->hasMany(Post::class);
}
}
Migration ها
Migration ها ساختار پایگاه داده را مدیریت میکنند:
// ایجاد migration
php artisan make:migration create_users_table
// فایل migration
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('users');
}
};
API Development
1. API Routes
// routes/api.php
Route::middleware('auth:sanctum')->group(function () {
Route::apiResource('users', UserController::class);
Route::apiResource('posts', PostController::class);
});
2. API Resources
برای کنترل فرمت پاسخ API:
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class UserResource extends JsonResource
{
public function toArray($request)
{
return [
'id' => $this->id,
'name' => $this->name,
'email' => $this->email,
'created_at' => $this->created_at->format('Y-m-d H:i:s'),
];
}
}
3. Authentication
استفاده از Laravel Sanctum برای احراز هویت API:
// نصب Sanctum
composer require laravel/sanctum
// در Controller
use Illuminate\Support\Facades\Auth;
public function login(Request $request)
{
if (Auth::attempt($request->only('email', 'password'))) {
$user = Auth::user();
$token = $user->createToken('api-token')->plainTextToken;
return response()->json([
'user' => $user,
'token' => $token
]);
}
return response()->json(['error' => 'Unauthorized'], 401);
}
Middleware
Middleware ها درخواستها را قبل از رسیدن به Controller پردازش میکنند:
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class CheckApiKey
{
public function handle(Request $request, Closure $next)
{
if ($request->header('X-API-Key') !== config('app.api_key')) {
return response()->json(['error' => 'Invalid API Key'], 401);
}
return $next($request);
}
}
Validation
اعتبارسنجی دادههای ورودی:
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class StoreUserRequest extends FormRequest
{
public function rules()
{
return [
'name' => 'required|string|max:255',
'email' => 'required|email|unique:users',
'password' => 'required|min:8|confirmed',
];
}
public function messages()
{
return [
'name.required' => 'نام الزامی است',
'email.unique' => 'این ایمیل قبلاً ثبت شده است',
];
}
}
بهترین روشهای توسعه
1. Service Layer
جداسازی منطق کسبوکار از Controller:
<?php
namespace App\Services;
use App\Models\User;
use App\Repositories\UserRepository;
class UserService
{
protected $userRepository;
public function __construct(UserRepository $userRepository)
{
$this->userRepository = $userRepository;
}
public function createUser(array $data)
{
// منطق کسبوکار
$data['password'] = bcrypt($data['password']);
return $this->userRepository->create($data);
}
}
2. Repository Pattern
جداسازی دسترسی به داده از منطق کسبوکار
3. Testing
نوشتن تستهای واحد و feature برای اطمینان از کیفیت کد
Deployment
1. Environment Configuration
# .env.production
APP_ENV=production
APP_DEBUG=false
APP_URL=https://yourdomain.com
DB_CONNECTION=mysql
DB_HOST=your-db-host
DB_DATABASE=your-database
DB_USERNAME=your-username
DB_PASSWORD=your-password
2. Optimization
# بهینهسازی برای production
php artisan config:cache
php artisan route:cache
php artisan view:cache
php artisan optimize
🚀 نکات حرفهای
همیشه از Laravel Telescope برای debugging و monitoring استفاده کنید. این ابزار به شما کمک میکند تا مشکلات را سریعتر پیدا کنید.
مقالات مرتبط
برای یادگیری بیشتر، مقالات زیر را مطالعه کنید:
- راهنمای کامل طراحی سایت با React.js
- ایمنی در برنامه نویسی وب و موبایل
- توسعه اپلیکیشن اندروید با Java و Kotlin
نتیجهگیری
Laravel فریمورک قدرتمندی است که توسعه وب را آسانتر میکند. با یادگیری اصول اولیه و تمرین مداوم، میتوانید API ها و سیستمهای مدیریت محتوای حرفهای بسازید. علی سلمانیان آماده کمک به شما در پروژههای Laravel است.