PHP Laravel Framework Mülakat Soruları 2026: Eloquent, Kuyruklar ve Mimari Desenler

2026 yılı Laravel mülakat sorularına kapsamlı rehber. Eloquent ORM, kuyruk sistemi, mimari desenler ve PHP geliştiricileri için en iyi uygulamalar.

PHP Laravel Framework Mülakat Soruları 2026: Eloquent, Kuyruklar ve Mimari Desenler

Laravel, 2026 yılında kurumsal web uygulamaları için PHP'nin önde gelen framework'ü olmaya devam etmektedir. Laravel 12'nin yayınlanması ve ekosistemin sürekli gelişmesiyle birlikte, mülakat soruları daha zorlu hale gelmiş olup gelişmiş Eloquent ORM kavramlarını, kuyruk sistemlerini ve mimari desenleri kapsamaktadır. Bu makale, Laravel Developer pozisyonları için teknik mülakatlarda sıkça karşılaşılan konuları ele almaktadır.

Laravel 12, PHP 8.4 yerel niteliklerini kullanıyor

Laravel'in en son sürümü, routing ve middleware tanımlamaları için PHP 8.4 niteliklerini kullanmaktadır. Kurumsal projeler framework'ün en son sürümlerine geçiş yaptığından, yeni sözdizimi bilgisi çoğu mülakatta beklenmektedir.

Eloquent ORM: Gelişmiş İlişkiler ve Sorgu Optimizasyonu

Eloquent ORM, Laravel'in kalbinde yer almaktadır ve gelişmiş ilişkiler ile N+1 optimizasyonu hakkındaki sorular neredeyse her mülakatta karşılaşılan konulardandır. Mülakatı yapanlar, eager loading, lazy loading ve sorgu optimizasyon tekniklerinin derinlemesine anlaşılmasını beklemektedir.

Temel sorulardan biri with() ve load() arasındaki farkı kapsamaktadır. with() metodu sorgu oluşturma aşamasında eager loading gerçekleştirirken, load() zaten alınmış model koleksiyonları üzerinde lazy eager loading yapmaktadır.

php
// Eager loading - JOIN ile tek sorgu
$posts = Post::with(["author", "comments.user"])->get();

// Lazy eager loading - alma işleminden sonra yükleme
$posts = Post::all();
$posts->load("author");

// Constraining eager loads - ilişkileri filtreleme
$users = User::with(["posts" => function ($query) {
    $query->where("published", true)
          ->orderBy("created_at", "desc")
          ->limit(5);
}])->get();

Gelişmiş sorular, polimorfik many-to-many ilişkilerini ve özel ilişki türlerinin uygulanmasını kapsamaktadır. Eloquent'te polimorfizm, bir modelin farklı model türlerine ait olabildiği esnek veri modelleme olanağı sağlamaktadır.

php
// Polimorfik many-to-many ilişki
class Tag extends Model
{
    public function posts(): MorphToMany
    {
        return $this->morphedByMany(Post::class, "taggable");
    }

    public function videos(): MorphToMany
    {
        return $this->morphedByMany(Video::class, "taggable");
    }
}

class Post extends Model
{
    public function tags(): MorphToMany
    {
        return $this->morphToMany(Tag::class, "taggable");
    }
}

Query Builder vs Raw SQL: Her Birini Ne Zaman Kullanmalı

Mülakatı yapanlar sıklıkla Query Builder'ın yetmediği ve raw SQL kullanımının gerekli olduğu senaryoları sormaktadır. DB::raw(), whereRaw() ve selectRaw() metotlarını bilmek, karmaşık analitik sorgularla çalışan geliştiriciler için şarttır.

php
// Pencere fonksiyonları ile karmaşık analitik sorgu
$salesRanking = DB::table("sales")
    ->select([
        "product_id",
        "total_amount",
        DB::raw("RANK() OVER (PARTITION BY category_id ORDER BY total_amount DESC) as category_rank"),
        DB::raw("SUM(total_amount) OVER (PARTITION BY category_id) as category_total")
    ])
    ->whereYear("created_at", 2026)
    ->get();

// Veri kaynağı olarak alt sorgu
$topSellers = DB::table(DB::raw("(
    SELECT seller_id, SUM(amount) as total_sales
    FROM orders
    WHERE status = 'completed'
    GROUP BY seller_id
    HAVING SUM(amount) > 10000
) as top_sellers"))
->join("users", "users.id", "=", "top_sellers.seller_id")
->select("users.name", "top_sellers.total_sales")
->orderByDesc("total_sales")
->get();

Laravel Kuyruk Sistemi: Jobs, Workers ve Retry Stratejileri

Kuyruk sistemi, ölçeklenebilir Laravel uygulamaları için temel bir mekanizmadır. Mülakat soruları Job sınıflarının uygulanması, worker yapılandırması ve hata işleme stratejilerine odaklanmaktadır.

php
namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Contracts\Queue\ShouldBeUnique;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\Middleware\WithoutOverlapping;

class ProcessPayment implements ShouldQueue, ShouldBeUnique
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    public int $tries = 3;
    public int $backoff = 60;
    public int $timeout = 120;
    public int $uniqueFor = 3600;

    public function __construct(
        private readonly Order $order,
        private readonly string $paymentMethod
    ) {}

    public function middleware(): array
    {
        return [
            new WithoutOverlapping($this->order->id),
        ];
    }

    public function uniqueId(): string
    {
        return $this->order->id;
    }

    public function handle(PaymentGateway $gateway): void
    {
        $result = $gateway->charge(
            $this->order->total,
            $this->paymentMethod
        );

        if ($result->successful()) {
            $this->order->markAsPaid();
        }
    }

    public function failed(\Throwable $exception): void
    {
        Log::error("Payment failed", [
            "order_id" => $this->order->id,
            "error" => $exception->getMessage()
        ]);
        
        $this->order->markAsPaymentFailed();
    }
}

Gelişmiş konular, birden fazla işin gruplandırılmasını ve ilerlemenin bütün olarak izlenmesini sağlayan Job Batching'i kapsamaktadır.

php
use Illuminate\Bus\Batch;
use Illuminate\Support\Facades\Bus;

$batch = Bus::batch([
    new ProcessPodcast($podcast1),
    new ProcessPodcast($podcast2),
    new ProcessPodcast($podcast3),
])->then(function (Batch $batch) {
    Log::info("All podcasts processed successfully");
})->catch(function (Batch $batch, \Throwable $e) {
    Log::error("Batch processing failed", ["error" => $e->getMessage()]);
})->finally(function (Batch $batch) {
    Cache::forget("processing_podcasts");
})->allowFailures()->dispatch();

// İlerlemeyi izleme
$progress = $batch->progress();
$pending = $batch->pendingJobs;
$failed = $batch->failedJobs;

Mimari Desenler: Repository, Service Layer ve Action Classes

Laravel uygulama mimarisi hakkındaki sorular, mid ve senior pozisyon mülakatlarında standarttır. Repository Pattern veri erişim mantığını izole ederken, Service Layer iş mantığını kapsüllemektedir.

php
// Repository Interface
namespace App\Repositories\Contracts;

interface UserRepositoryInterface
{
    public function findById(int $id): ?User;
    public function findByEmail(string $email): ?User;
    public function create(array $data): User;
    public function update(User $user, array $data): User;
    public function delete(User $user): bool;
    public function paginate(int $perPage = 15): LengthAwarePaginator;
}

// Repository Implementation
namespace App\Repositories;

class EloquentUserRepository implements UserRepositoryInterface
{
    public function __construct(
        private readonly User $model
    ) {}

    public function findById(int $id): ?User
    {
        return $this->model->find($id);
    }

    public function findByEmail(string $email): ?User
    {
        return $this->model->where("email", $email)->first();
    }

    public function create(array $data): User
    {
        return $this->model->create($data);
    }

    public function paginate(int $perPage = 15): LengthAwarePaginator
    {
        return $this->model->latest()->paginate($perPage);
    }
}

Action Classes, Laravel topluluğu tarafından teşvik edilen modern bir desendir ve her sınıf tek bir iş operasyonundan sorumludur.

php
namespace App\Actions;

class CreateUserAction
{
    public function __construct(
        private readonly UserRepositoryInterface $users,
        private readonly HashManager $hash,
        private readonly Dispatcher $events
    ) {}

    public function execute(array $data): User
    {
        $user = $this->users->create([
            "name" => $data["name"],
            "email" => $data["email"],
            "password" => $this->hash->make($data["password"]),
        ]);

        $this->events->dispatch(new UserCreated($user));

        return $user;
    }
}

// Controller'da kullanım
class UserController extends Controller
{
    public function store(
        StoreUserRequest $request,
        CreateUserAction $action
    ): JsonResponse {
        $user = $action->execute($request->validated());
        
        return response()->json($user, 201);
    }
}

Middleware ve Request Yaşam Döngüsü

Laravel'de HTTP isteği yaşam döngüsünü anlamak kritik öneme sahiptir. Mülakatı yapanlar middleware yürütme sırası, global ve route middleware arasındaki farklar ve özel middleware uygulaması hakkında sorular sormaktadır.

php
namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;

class EnsureUserIsSubscribed
{
    public function handle(Request $request, Closure $next): Response
    {
        if (!$request->user()?->subscribed()) {
            return redirect()->route("subscription.plans");
        }

        return $next($request);
    }
}

// Terminable middleware - yanıt gönderildikten sonra çalışır
class LogResponseTime
{
    private float $startTime;

    public function handle(Request $request, Closure $next): Response
    {
        $this->startTime = microtime(true);
        
        return $next($request);
    }

    public function terminate(Request $request, Response $response): void
    {
        $duration = microtime(true) - $this->startTime;
        
        Log::channel("performance")->info("Request completed", [
            "path" => $request->path(),
            "duration_ms" => round($duration * 1000, 2)
        ]);
    }
}

Laravel'de Test: Feature ve Unit Tests

Test, teknik mülakatların ayrılmaz bir parçasıdır. Adayların Feature Tests ile Unit Tests arasındaki farkı bilmesi ve bağımlılıkları mock'laması beklenmektedir.

php
namespace Tests\Feature;

use App\Models\User;
use App\Models\Post;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;

class PostApiTest extends TestCase
{
    use RefreshDatabase;

    public function test_user_can_create_post(): void
    {
        $user = User::factory()->create();

        $response = $this->actingAs($user)
            ->postJson("/api/posts", [
                "title" => "Test Post",
                "content" => "Test content"
            ]);

        $response->assertStatus(201)
            ->assertJsonStructure([
                "data" => ["id", "title", "content", "created_at"]
            ]);

        $this->assertDatabaseHas("posts", [
            "title" => "Test Post",
            "user_id" => $user->id
        ]);
    }

    public function test_unauthenticated_user_cannot_create_post(): void
    {
        $response = $this->postJson("/api/posts", [
            "title" => "Test Post"
        ]);

        $response->assertStatus(401);
    }
}

Facade'ler kullanarak harici servisleri mock'lama:

php
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Queue;

public function test_payment_webhook_dispatches_job(): void
{
    Queue::fake();

    $response = $this->postJson("/webhooks/stripe", [
        "type" => "payment_intent.succeeded",
        "data" => ["object" => ["id" => "pi_123"]]
    ]);

    $response->assertOk();
    Queue::assertPushed(ProcessPaymentWebhook::class);
}

public function test_external_api_integration(): void
{
    Http::fake([
        "api.example.com/*" => Http::response(["status" => "ok"], 200)
    ]);

    $service = app(ExternalApiService::class);
    $result = $service->fetchData();

    $this->assertEquals("ok", $result["status"]);
    Http::assertSent(fn ($request) => 
        $request->url() === "https://api.example.com/data"
    );
}

Laravel mülakatlarında başarılı olmaya hazır mısın?

İnteraktif simülatörler, flashcards ve teknik testlerle pratik yap.

Sonuç

2026 yılında Laravel Developer pozisyonları için yapılan mülakatlar, Eloquent ORM, kuyruk sistemi ve mimari desenlerin sağlam bir şekilde anlaşılmasını gerektirmektedir. Adayların gelişmiş sorgu optimizasyon tekniklerini, Job Batching uygulamasını ve Repository ile Action Classes desenlerini bilmesi gerekmektedir. PHPUnit kullanarak test yapma ve bağımlılıkları mock'lama konusundaki pratik bilgi, işe alım sürecinde ek bir avantaj sağlamaktadır. Laravel framework'ünün sürekli gelişimi, geliştiricilerin en son özellikler ve en iyi uygulamalar hakkındaki bilgilerini düzenli olarak güncellemelerini gerektirmektedir.

Günün meydan okuması

Laravel kodundaki hatayı bulabilir misin?

Gerçek bir kod parçası, gizli bir hata, günde bir deneme. Denemek için hesap gerekmez.

Anthony Fillion-Maillet

Yazan:

Anthony Fillion-Maillet

SharpSkill kurucusu

10 yılı aşkın süredir fullstack geliştirici. SharpSkill’i yönetiyor ve burada yayımlanan her şeyden sorumlu.

16 Eylül 2026 tarihinde güncellendi

Paylaş

İlgili makaleler