برنامه نویسی بک‌اند با Laravel و PHP

راهنمای جامع توسعه API و سیستم‌های مدیریت محتوا

مقدمه

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 استفاده کنید. این ابزار به شما کمک می‌کند تا مشکلات را سریع‌تر پیدا کنید.

مقالات مرتبط

برای یادگیری بیشتر، مقالات زیر را مطالعه کنید:

نتیجه‌گیری

Laravel فریمورک قدرتمندی است که توسعه وب را آسان‌تر می‌کند. با یادگیری اصول اولیه و تمرین مداوم، می‌توانید API ها و سیستم‌های مدیریت محتوای حرفه‌ای بسازید. علی سلمانیان آماده کمک به شما در پروژه‌های Laravel است.

درباره نویسنده

علی سلمانیان - برنامه نویس وب و اندروید با بیش از 5 سال تجربه در توسعه نرم‌افزار. متخصص Laravel، PHP، React و Android.

📧 alisalmanian1395@gmail.com | 📱 +98 938 822 2808