۵۵ سوال تخصصی و چالشی لاراول + جواب‌های کامل

آرش فدایی ۲ دقیقه زمان مطالعه
۵۵ سوال تخصصی و چالشی لاراول + جواب‌های کامل

راهنمای مصاحبة Laravel ارشد: ۲۰ سوال که واقعاً پرسیده می‌شود

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


۱. معماری MVC در Laravel چگونه واقعاً کار می‌کند؟

معماری MVC لاراول نه فقط Model-View-Controller است، بلکه لایه‌های اضافی دارد. جریان درخواست به این صورت است:

Request → Route → Middleware → Controller → Service/Repository → Model (Eloquent) → View/JSON

این ساختار چرا مهم است؟

  • کد تمیز: هر لایه یک مسئولیت دارد
  • تست‌پذیری: هر بخش را جداگانه تست کن
  • نگهداری آسان: بعد از سال‌ها هم قابل فهم باقی می‌ماند
  • مقیاس‌پذیری: پروژه بزرگ می‌شود اما کد مرتب باقی می‌ماند

نکته عملی: این ساختار حتی برای پروژه‌های بزرگ مثل Spotify یا Netflix استفاده می‌شود، اما با تقسیم بیشتر (Microservices).


۲. Migrations چرا نسخه‌کنترل دیتابیس نام‌گذاری شده‌اند؟

Migration یعنی تاریخچه تمام تغییرات دیتابیسی است، درست مثل Git برای کد. بدون Migration:

  • توسعه‌دهنده A: ستون email اضافه می‌کند
  • توسعه‌دهنده B: ستون phone اضافه می‌کند
  • وقتی merge کنند: کدام ستون اول افزوده شود؟ بهم‌ریختگی!

با Migration: هر تغییر در فایل ثبت می‌شود و ترتیب دقیق حفظ می‌شود:

php artisan make:migration add_email_to_users
php artisan migrate
php artisan migrate:rollback

فایدة اضافی: Rollback! اگر مشکلی بود، یک دستور و همه چیز برگشت.


۳. Eloquent ORM: به جای نوشتن SQL

Eloquent یعنی اینکه SQL نمی‌نویسی، بلکه به PHP صحبت می‌کنی.

❌ بدون Eloquent (SQL):

$users = DB::select(‘SELECT * FROM users WHERE age > 18’);
foreach ($users as $user) {
    $posts = DB::select(‘SELECT * FROM posts WHERE user_id = ?’, [$user->id]);
}

✅ با Eloquent:

$users = User::where(‘age’, ‘>’, 18)->with(‘posts’)->get();
foreach ($users as $user) {
    echo $user->posts; // داده‌ها از قبل بارگذاری شده‌اند
}

مزایای Eloquent:

  • روابط خودکار (hasOne, hasMany, belongsToMany)
  • Mutators (تبدیل خودکار ستون‌ها)
  • Scopes (کوئری‌های قابل استفاده‌مجدد)
  • Events (قبل و بعد از ذخیره)
  • SoftDeletes (حذف نرم بدون حذف فیزیکی)

۴. مشکل N+1: هزینه‌های پنهان

مشکل N+1 یکی از رایج‌ترین خطاهای عملکردی در Laravel است. این یعنی اینکه ۱ query اصلی + n query اضافی اجرا می‌شود:

❌ مشکل N+1 (۱۰۱ query):

$posts = Post::all(); // 1 query
foreach ($posts as $post) {
    echo $post->user->name; // 100 query (هر پست یک query)
}

✅ حل (۲ query):

$posts = Post::with(‘user’)->get(); // 2 query
foreach ($posts as $post) {
    echo $post->user->name; // داده‌ها آماده هستند
}

تفاوت عملی: ۱۰۰ پست با روش اول = ۱۰۱ query (نزدیک ۵ ثانیه) | روش دوم = ۲ query (۰.۲ ثانیه)


۵. Service Container: قلب Dependency Injection

Service Container لاراول خودکار تمام Dependencies را مدیریت می‌کند. اگر کنترلر به UserService احتیاج داشت، بدون نیاز به new کردن خود Container آن را ایجاد می‌کند:

public function __construct(UserService $userService) {
    // Laravel خودش UserService ایجاد می‌کند!
    $this->userService = $userService;
}

فایدة این:

  • کد تمیز‌تر (کنترلر Dependencies خود را نمی‌سازد)
  • تست ساده‌تر (Mock Objects را pass کن)
  • کد انعطاف‌پذیر (اگر UserService تغییر کرد، کنترلر نمی‌داند)

۶. Caching: سرعت شوم‌آور

Caching یعنی اینکه نتیجة کوئری‌های سنگین را یکبار محاسبه کن و بار دیگر بیرون آن استفاده کن.

// اگر cache نبود، کوئری را اجرا کن و برای 1 ساعت ذخیره کن
$users = Cache::remember(‘all_users’, 3600, function() {
    return User::with(‘posts’)->get();
});

// Logout کاربر → Cache تمام user رو پاک کن
Cache::tags([‘users’])->flush();

نتیجة عملی: بدون cache = ۵ ثانیه | با cache = ۰.۰۲ ثانیه (۲۵۰ برابر سریع‌تر!)


۷. Repository Pattern: جداسازی منطق

Repository یعنی اینکه کنترلر مستقیم دیتابیس را تماس نمی‌گیرد، بلکه از Repository میان‌فاصل استفاده می‌کند.

❌ بدون Repository:

public function show($id) {
    $user = User::where(‘id’, $id)->with(‘posts’)->first();
    return view(‘user.show’, [‘user’ => $user]);
}

✅ با Repository:

public function show($id, UserRepository $userRepo) {
    $user = $userRepo->findWithPosts($id);
    return view(‘user.show’, [‘user’ => $user]);
}

مزایا:

  • تست‌پذیری بالا (Repository رو Mock کن)
  • اگر ORM تغییر کرد، فقط Repository تغییر می‌کند
  • کد تمیزتر و منطقی‌تر

🔥 سوالات چالشی واقعی

سوال ۱: لاگین مشترک Next.js + Laravel

مسئله: سایت فرانت‌اند (Next.js) و بک‌اند (Laravel) جداگانه است. چطور session را هم‌راستا کنیم؟

راه‌حل: Laravel Sanctum + HttpOnly Cookie

  • ۱. کاربر از Next.js لاگین می‌کند
  • ۲. Laravel یک Sanctum token صادر می‌کند
  • ۳. Token در HttpOnly Cookie ذخیره می‌شود
  • ۴. هر request خودکار این cookie فرستاده می‌شود
  • ۵. Logout → Token در Redis blacklist قرار می‌گیرد

چرا HttpOnly؟ اگر token در localStorage بود، XSS attack می‌تونست آن را بدزد!


سوال ۲: پرداخت با Timeout – جلوگیری از دوبار کسر

مسئله: کاربر دکمة پرداخت را دوبار کلیک می‌کند. وجه دو بار کسر می‌شود!

راه‌حل: Idempotency Key

  1. هر درخواست پرداخت یک uuid منحصر به‌فرد دارد
  2. این uuid در جدول payment_requests ذخیره می‌شود
  3. اگر درخواست دوبار ارسال شود، سیستم می‌بیند که قبلاً پردازش شده
  4. نتیجه: فقط ۱ پرداخت واقعی

سوال ۳: Race Condition – آخرین محصول

مسئله: یک محصول باقی مانده است. دو کاربر یک‌زمان خریدند.

راه‌حل ۱: Pessimistic Locking

Product::where(‘id’, $id)->where(‘stock’, ‘>’, 0)->lockForUpdate()->first();

راه‌حل ۲: رزرو موقت

سبد خرید برای ۱۵-۳۰ دقیقه محصول را رزرو کند + cron برای آزادسازی


سوال ۴: سرچ سریع – ۱۰ میلیون رکورد

مسئله: سایت شما ۱۰ میلیون محصول دارد. سرچ کند است!

انتخاب راه‌حل:

  • کمتر از ۱۰۰ هزار: MySQL FULLTEXT + Redis
  • ۱۰۰K تا ۵M: Meilisearch یا Typesense
  • بیشتر از ۵M: Elasticsearch / OpenSearch
  • هر اندازه: Laravel Scout + Algolia (ساده‌ترین)

سوال ۵: ردیابی مهمان تا ثبت‌نام

مسئله: کاربر مهمان است، ۵ محصول به سبد می‌افزاید. بعد ثبت‌نام می‌کند. سبد بلاپاس شود!

راه‌حل:

  1. FingerprintJS برای بصمة دستگاه
  2. UUID در localStorage
  3. وقتی ثبت‌نام: تمام رکوردهای guest_id را به user_id منتقل کن

📌 نکات نهایی

برای مصاحبة موفق:

  • ✅ معماری و ساختار کد را اولویت بده
  • ✅ مثال‌های واقعی بیاور
  • ✅ مشکلات عملکردی را بدانی
  • ✅ بگوی “من می‌دانم چطور یاد بگیرم”
  • ✅ معماری صحبت کن، نه کد

یادتان باشد: بهترین Developer نه کسی است که بیشتر می‌داند، بلکه کسی است که بهترین معماری می‌سازد!

۷۰ بازدید ۰ پسندیدن

۰ نظر

ارسال نظر

تماس مستقیم با من