Pertanyaan Interview PHP Laravel Developer 2026: Panduan Persiapan Lengkap

Panduan komprehensif untuk mempersiapkan interview PHP Laravel developer tahun 2026. Mencakup pertanyaan teknis Eloquent ORM, Service Container, authentication, queue, dan testing.

Pertanyaan Interview PHP Laravel Developer 2026

Pertanyaan interview PHP Laravel developer menguji pengetahuan framework dan prinsip desain perangkat lunak. Dengan dirilis-nya Laravel 13 pada Maret 2026 yang memperkenalkan AI SDK, PHP Attributes, dan Passkey authentication, interviewer mengharapkan kandidat mendemonstrasikan pemahaman fitur terkini bersama fundamental inti.

Area Fokus Interview

Interview Laravel biasanya mencakup lima pilar: relasi Eloquent ORM dan performa, Service Container dan dependency injection, pola authentication dan authorization, penanganan queue dan job, serta strategi testing. Posisi senior menambahkan keputusan arsitektur dan pengetahuan ekosistem package.

Pertanyaan Eloquent ORM dan Database

Eloquent tetap menjadi topik paling sering dibahas dalam interview Laravel. Interviewer menilai apakah kandidat memahami lazy vs eager loading, tipe relasi, dan optimasi query.

P: Apa itu masalah N+1 query dan bagaimana Laravel mengatasinya?

Masalah N+1 terjadi ketika kode mengeksekusi satu query untuk mengambil collection, kemudian N query tambahan untuk memuat data terkait untuk setiap item. Laravel menyediakan eager loading melalui with() untuk mengatasi ini.

app/Http/Controllers/PostController.phpphp
// Masalah N+1: 1 query untuk posts + N queries untuk authors
$posts = Post::all();
foreach ($posts as $post) {
    echo $post->author->name; // Memicu query per post
}

// Solusi: Eager load dengan with()
$posts = Post::with('author')->get(); // Total 2 queries
foreach ($posts as $post) {
    echo $post->author->name; // Tidak ada query tambahan
}

Laravel 13 mempertahankan strict mode dalam development, yang melempar exception ketika lazy loading terjadi, membantu menangkap masalah N+1 lebih awal.

P: Jelaskan perbedaan antara hasOne, hasMany, belongsTo, dan belongsToMany.

RelasiLokasi Foreign KeyContoh
hasOnePada model terkaitUser hasOne Profile (profiles.user_id)
hasManyPada model terkaitUser hasMany Posts (posts.user_id)
belongsToPada model saat iniPost belongsTo User (posts.user_id)
belongsToManyTabel pivotUser belongsToMany Roles (tabel role_user)

P: Bagaimana menangani soft deletes dan apa implikasinya?

app/Models/Post.phpphp
use Illuminate\Database\Eloquent\SoftDeletes;

class Post extends Model
{
    use SoftDeletes;
    
    // Record soft-deleted dikecualikan secara default
    // Untuk menyertakannya:
    // Post::withTrashed()->get();
    // Untuk mendapatkan hanya yang dihapus:
    // Post::onlyTrashed()->get();
}

Soft deletes menambahkan kolom deleted_at. Query secara otomatis mengecualikan record soft-deleted kecuali diminta secara eksplisit. Ini mempengaruhi unique constraints dan memerlukan compound indexes yang menyertakan deleted_at untuk performa optimal.

Service Container dan Dependency Injection

Service Container adalah inti Laravel. Memahami binding, resolution, dan contextual injection membedakan developer junior dari senior.

P: Apa perbedaan antara bind, singleton, dan instance dalam Service Container?

app/Providers/AppServiceProvider.phpphp
public function register(): void
{
    // bind: Instance baru setiap resolve
    $this->app->bind(PaymentService::class, function ($app) {
        return new PaymentService($app->make(StripeClient::class));
    });
    
    // singleton: Instance sama sepanjang request
    $this->app->singleton(CartService::class, function ($app) {
        return new CartService();
    });
    
    // instance: Bind instance yang sudah ada
    $analytics = new AnalyticsService('UA-xxxxx');
    $this->app->instance(AnalyticsService::class, $analytics);
}

P: Bagaimana contextual binding bekerja?

Contextual binding memungkinkan injeksi implementasi berbeda berdasarkan class yang membutuhkan dependency tersebut.

app/Providers/AppServiceProvider.phpphp
public function register(): void
{
    $this->app->when(PhotoController::class)
        ->needs(Filesystem::class)
        ->give(function () {
            return Storage::disk('photos');
        });

    $this->app->when(VideoController::class)
        ->needs(Filesystem::class)
        ->give(function () {
            return Storage::disk('videos');
        });
}

Pertanyaan Authentication dan Authorization

Laravel 13 memperluas fitur authentication dengan dukungan native passkey. Interview sering mencakup authentication tradisional dan modern.

P: Jelaskan perbedaan antara Gates dan Policies.

Gates adalah closure sederhana yang menentukan apakah user diizinkan melakukan action. Policies mengelompokkan logika authorization di sekitar model tertentu.

app/Providers/AppServiceProvider.phpphp
use Illuminate\Support\Facades\Gate;

public function boot(): void
{
    // Gate: Closure sederhana
    Gate::define('edit-settings', function (User $user) {
        return $user->isAdmin();
    });
}

// app/Policies/PostPolicy.php
class PostPolicy
{
    public function update(User $user, Post $post): bool
    {
        return $user->id === $post->user_id;
    }
    
    public function delete(User $user, Post $post): bool
    {
        return $user->id === $post->user_id || $user->isAdmin();
    }
}

// Penggunaan di controller
public function update(Request $request, Post $post)
{
    $this->authorize('update', $post);
    // Atau: Gate::authorize('edit-settings');
}

P: Bagaimana cara mengimplementasikan Passkey authentication di Laravel 13?

routes/web.phpphp
use Illuminate\Support\Facades\Route;

Route::middleware('web')->group(function () {
    Route::post('/passkey/register', [PasskeyController::class, 'store']);
    Route::post('/passkey/authenticate', [PasskeyController::class, 'authenticate']);
});

// app/Http/Controllers/PasskeyController.php
use Illuminate\Support\Facades\Auth;
use Laravel\Passkey\Passkey;

class PasskeyController extends Controller
{
    public function store(Request $request)
    {
        $passkey = Passkey::createFor($request->user());
        return response()->json(['passkey' => $passkey]);
    }
    
    public function authenticate(Request $request)
    {
        $user = Passkey::authenticate($request->credential);
        Auth::login($user);
        return redirect('/dashboard');
    }
}

Pertanyaan Queue dan Job

Memahami pemrosesan background sangat penting untuk membangun aplikasi scalable.

P: Kapan menggunakan queue dan bagaimana menangani kegagalan job?

Queue harus digunakan untuk operasi time-intensive yang tidak memerlukan respons segera: mengirim email, memproses gambar, memanggil API pihak ketiga.

app/Jobs/ProcessPodcast.phpphp
class ProcessPodcast implements ShouldQueue
{
    use Queueable;
    
    public $tries = 3;
    public $backoff = [60, 300, 600]; // Exponential backoff
    public $timeout = 120;
    
    public function __construct(public Podcast $podcast) {}
    
    public function handle(AudioProcessor $processor): void
    {
        $processor->process($this->podcast->audio_path);
    }
    
    public function failed(\Throwable $exception): void
    {
        // Kirim notifikasi ke admin
        Notification::route('mail', 'admin@example.com')
            ->notify(new JobFailed($this->podcast, $exception));
    }
}

// Dispatching job
ProcessPodcast::dispatch($podcast)
    ->onQueue('podcasts')
    ->delay(now()->addMinutes(5));

P: Jelaskan job batching dan penggunaannya.

Job batching memungkinkan eksekusi grup job dan melakukan callback ketika seluruh batch selesai.

app/Http/Controllers/ImportController.phpphp
use Illuminate\Bus\Batch;
use Illuminate\Support\Facades\Bus;

public function import(Request $request)
{
    $jobs = collect($request->users)->map(function ($userData) {
        return new ImportUser($userData);
    });
    
    $batch = Bus::batch($jobs)
        ->then(function (Batch $batch) {
            // Semua job berhasil selesai
            Notification::send($batch->createdBy, new ImportCompleted());
        })
        ->catch(function (Batch $batch, \Throwable $e) {
            // Kegagalan batch job pertama terdeteksi
            Log::error('Batch failed', ['batch_id' => $batch->id]);
        })
        ->finally(function (Batch $batch) {
            // Batch selesai dieksekusi
        })
        ->allowFailures()
        ->dispatch();
    
    return response()->json(['batch_id' => $batch->id]);
}

Pertanyaan Testing

Aplikasi Laravel yang teruji dengan baik menunjukkan kematangan teknis. Interviewer mengharapkan keakraban dengan PHPUnit dan Pest.

P: Bagaimana pendekatan testing feature vs unit di Laravel?

Unit tests menguji class individu secara terisolasi. Feature tests menguji seluruh flow request HTTP.

tests/Unit/Services/DiscountServiceTest.phpphp
use App\Services\DiscountService;

test('calculates percentage discount correctly', function () {
    $service = new DiscountService();
    $result = $service->calculate(100, 'SAVE20');
    
    expect($result)->toBe(80.0);
});

// tests/Feature/Api/ProductTest.php
use App\Models\Product;
use App\Models\User;

test('authenticated users can create products', function () {
    $user = User::factory()->create();
    
    $response = $this->actingAs($user)
        ->postJson('/api/products', [
            'name' => 'Laravel Course',
            'price' => 99.99,
        ]);
    
    $response->assertStatus(201)
        ->assertJsonPath('data.name', 'Laravel Course');
    
    $this->assertDatabaseHas('products', [
        'name' => 'Laravel Course',
        'user_id' => $user->id,
    ]);
});

P: Bagaimana cara mocking external services dalam test?

tests/Feature/PaymentTest.phpphp
use App\Services\PaymentGateway;
use Mockery;

test('processes payment successfully', function () {
    $mock = Mockery::mock(PaymentGateway::class);
    $mock->shouldReceive('charge')
        ->once()
        ->with(100, 'tok_visa')
        ->andReturn(['status' => 'success', 'id' => 'ch_123']);
    
    $this->app->instance(PaymentGateway::class, $mock);
    
    $response = $this->postJson('/api/payments', [
        'amount' => 100,
        'token' => 'tok_visa',
    ]);
    
    $response->assertStatus(200)
        ->assertJsonPath('payment_id', 'ch_123');
});

Pertanyaan Laravel 13 dan Fitur Modern

P: Jelaskan fitur AI SDK baru di Laravel 13.

Laravel 13 memperkenalkan abstraksi first-party untuk berinteraksi dengan provider AI.

config/ai.php sudah dikonfigurasi dengan providerphp
// app/Services/ContentService.php
use Illuminate\Support\Facades\AI;

class ContentService
{
    public function generateSummary(string $content): string
    {
        $response = AI::chat()
            ->system('You are a helpful assistant that summarizes content.')
            ->user("Summarize this: {$content}")
            ->generate();
        
        return $response->text;
    }
    
    public function streamResponse(string $prompt)
    {
        return AI::chat()
            ->user($prompt)
            ->stream();
    }
}

P: Bagaimana PHP Attributes meningkatkan Laravel 13?

app/Http/Controllers/UserController.phpphp
use Illuminate\Routing\Attributes\Get;
use Illuminate\Routing\Attributes\Middleware;

#[Middleware('auth')]
class UserController extends Controller
{
    #[Get('/users/{user}')]
    public function show(User $user)
    {
        return view('users.show', compact('user'));
    }
    
    #[Get('/users/{user}/edit')]
    #[Middleware('can:edit,user')]
    public function edit(User $user)
    {
        return view('users.edit', compact('user'));
    }
}

Pertanyaan Arsitektur dan Best Practices

Posisi senior sering menyertakan pertanyaan desain sistem.

P: Bagaimana mengstrukturkan aplikasi Laravel besar?

Aplikasi besar mendapat manfaat dari domain-driven organization.

text
app/
├── Domain/
│   ├── Orders/
│   │   ├── Actions/
│   │   │   └── CreateOrderAction.php
│   │   ├── Models/
│   │   │   └── Order.php
│   │   ├── Events/
│   │   │   └── OrderCreated.php
│   │   └── Services/
│   │       └── OrderService.php
│   └── Users/
│       ├── Actions/
│       ├── Models/
│       └── Services/
├── Http/
│   └── Controllers/
└── Providers/

P: Jelaskan implementasi Repository pattern di Laravel.

app/Repositories/Contracts/UserRepositoryInterface.phpphp
interface UserRepositoryInterface
{
    public function find(int $id): ?User;
    public function findByEmail(string $email): ?User;
    public function create(array $data): User;
    public function paginate(int $perPage = 15): LengthAwarePaginator;
}

// app/Repositories/EloquentUserRepository.php
class EloquentUserRepository implements UserRepositoryInterface
{
    public function __construct(private User $model) {}
    
    public function find(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->paginate($perPage);
    }
}

// app/Providers/RepositoryServiceProvider.php
public function register(): void
{
    $this->app->bind(
        UserRepositoryInterface::class,
        EloquentUserRepository::class
    );
}

Siap menguasai wawancara Laravel Anda?

Berlatih dengan simulator interaktif, flashcards, dan tes teknis kami.

Kesimpulan

Interview PHP Laravel developer tahun 2026 menguji pemahaman mendalam tentang fitur framework dan kemampuan membuat keputusan arsitektur yang tepat. Kandidat harus mempersiapkan pertanyaan praktis tentang Eloquent ORM, Service Container, authentication, queue, dan testing. Memahami fitur Laravel 13 seperti AI SDK dan PHP Attributes menunjukkan kesadaran terhadap perkembangan ekosistem. Fokus pada menulis kode yang bersih, testable, dan maintainable, serta kemampuan menjelaskan trade-off dari berbagai pendekatan akan membantu kandidat sukses dalam interview Laravel.

Tantangan harian

Bisakah kamu menemukan bug di Laravel?

Satu potongan kode nyata, satu bug tersembunyi, satu percobaan per hari. Tanpa akun untuk mencoba.

Anthony Fillion-Maillet

Ditulis oleh

Anthony Fillion-Maillet

Pendiri SharpSkill

Developer fullstack selama lebih dari 10 tahun. Ia menjalankan SharpSkill dan bertanggung jawab atas semua yang diterbitkan di sini.

Diperbarui 7 September 2026

Tag

#php
#laravel
#interview
#web development
#backend

Bagikan

Artikel terkait