Skip to content

FAQ - Pertanyaan Umum Laravel Bootcamp

Bootcamp Laravel - Sistem Pengelolaan Dokumen (SiDoku)


📋 Daftar Isi

  1. Instalasi dan Setup
  2. PHP dan OOP
  3. Laravel Basics
  4. Routing dan Controllers
  5. Database dan Eloquent
  6. Authentication
  7. API Development
  8. Testing
  9. Deployment
  10. Troubleshooting

Instalasi dan Setup

Q: Laragon tidak bisa dijalankan, muncul error "Port 80 is used"?

A: Port 80 sedang digunakan aplikasi lain (biasanya Skype, IIS, atau XAMPP).

Solusi:

  1. Buka Laragon > Menu > Preferences > Services & Ports
  2. Ubah port Apache dari 80 ke 8080
  3. Atau matikan aplikasi yang menggunakan port 80

Untuk mencari aplikasi yang menggunakan port 80:

bash
netstat -ano | findstr :80

Q: Composer install gagal dengan error "Your requirements could not be resolved"?

A: Biasanya karena versi PHP atau extension tidak sesuai.

Solusi:

  1. Cek versi PHP:
bash
php -v
  1. Cek extension yang aktif:
bash
php -m
  1. Aktifkan extension yang diperlukan di php.ini:
ini
extension=curl
extension=fileinfo
extension=mbstring
extension=openssl
extension=pdo_mysql
extension=zip
  1. Jalankan composer update:
bash
composer update

Q: Bagaimana cara mengubah versi PHP di Laragon?

A:

  1. Download PHP versi yang diinginkan dari https://windows.php.net/download/
  2. Extract ke C:\laragon\bin\php\php-8.x.x-Win32-vs16-x64
  3. Klik kanan Laragon > PHP > Pilih versi baru
  4. Restart Laragon

PHP dan OOP

Q: Apa bedanya == dan === di PHP?

A:

OperatorNamaPenjelasan
==Loose comparisonMembandingkan nilai saja
===Strict comparisonMembandingkan nilai DAN tipe data

Contoh:

php
$a = 5;
$b = "5";

var_dump($a == $b);   // true (nilai sama)
var_dump($a === $b);  // false (tipe berbeda: int vs string)

Best Practice: Selalu gunakan === untuk menghindari bug yang tidak terduga.


Q: Kapan menggunakan public, protected, dan private?

A:

VisibilityAkses dari Class SendiriAkses dari Child ClassAkses dari Luar
publicYaYaYa
protectedYaYaTidak
privateYaTidakTidak
php
class User {
    public $nama;        // Bisa diakses dari mana saja
    protected $email;    // Hanya class ini dan turunannya
    private $password;   // Hanya class ini saja
}

Best Practice: Gunakan visibility seketat mungkin. Mulai dengan private, ubah ke protected atau public jika diperlukan.


Q: Apa itu Traits dan kapan menggunakannya?

A: Traits adalah mekanisme untuk menggunakan kembali kode di multiple class tanpa inheritance.

php
trait Timestampable {
    public function getCreatedAt() {
        return $this->created_at->format('d/m/Y');
    }
}

class Dokumen {
    use Timestampable;
}

class User {
    use Timestampable;
}

Gunakan traits ketika:

  • Butuh fungsi yang sama di beberapa class yang tidak terkait
  • Menghindari inheritance chain yang panjang

Laravel Basics

Q: Apa bedanya config() dan env()?

A:

FunctionPenggunaanCached
env()Membaca langsung dari file .envTidak
config()Membaca dari file configYa

Best Practice: Selalu gunakan config() di kode aplikasi:

php
// [X] Jangan
$dbHost = env('DB_HOST');

// [OK] Gunakan ini
$dbHost = config('database.connections.mysql.host');

Kenapa? Karena setelah php artisan config:cache, env() tidak akan bekerja.


Q: Apa itu Service Container dan Service Provider?

A:

Service Container adalah "kotak" yang menyimpan semua class dan cara membuatnya. Laravel menggunakannya untuk Dependency Injection.

Service Provider adalah tempat untuk mendaftarkan service ke container.

php
// Di AppServiceProvider
public function register(): void
{
    $this->app->bind(PaymentInterface::class, StripePayment::class);
}

// Di Controller
public function __construct(PaymentInterface $payment) 
{
    $this->payment = $payment; // Otomatis di-inject
}

Q: Bagaimana cara membuat helper function sendiri?

A:

  1. Buat file app/Helpers/helpers.php
  2. Tambahkan function:
php
<?php

if (!function_exists('format_rupiah')) {
    function format_rupiah($angka) {
        return 'Rp ' . number_format($angka, 0, ',', '.');
    }
}
  1. Tambahkan di composer.json:
json
"autoload": {
    "files": [
        "app/Helpers/helpers.php"
    ]
}
  1. Jalankan:
bash
composer dump-autoload
  1. Gunakan:
php
echo format_rupiah(5000000); // Rp 5.000.000

Routing dan Controllers

Q: Bagaimana cara membuat route dengan multiple middleware?

A:

php
// Array middleware
Route::get('/admin', [AdminController::class, 'index'])
    ->middleware(['auth', 'verified', 'role:admin']);

// Group middleware
Route::middleware(['auth', 'verified'])->group(function () {
    Route::get('/dashboard', [DashboardController::class, 'index']);
    
    Route::middleware('role:admin')->group(function () {
        Route::resource('users', UserController::class);
    });
});

Q: Bagaimana cara membuat route yang menerima parameter opsional?

A:

php
Route::get('/dokumen/{id?}', function ($id = null) {
    if ($id) {
        return "Dokumen ID: $id";
    }
    return "Semua dokumen";
});

Q: Bagaimana cara redirect dari controller?

A:

php
// Redirect ke URL
return redirect('/home');

// Redirect ke named route
return redirect()->route('dokumen.index');

// Redirect dengan parameter
return redirect()->route('dokumen.show', ['id' => 1]);

// Redirect back
return redirect()->back();

// Redirect dengan flash message
return redirect()->route('dokumen.index')
    ->with('success', 'Data berhasil disimpan!');

// Redirect dengan input (untuk form)
return redirect()->back()->withInput();

// Redirect dengan errors
return redirect()->back()->withErrors(['email' => 'Email tidak valid']);

Database dan Eloquent

Q: Apa bedanya find(), first(), dan get()?

A:

MethodReturnContoh
find($id)Single model atau nullUser::find(1)
findOrFail($id)Single model atau 404 errorUser::findOrFail(1)
first()Single model atau nullUser::where('active', true)->first()
firstOrFail()Single model atau 404 errorUser::where('active', true)->firstOrFail()
get()Collection (array of models)User::where('active', true)->get()

Q: Bagaimana cara melakukan soft delete?

A:

  1. Tambahkan column deleted_at di migration:
php
$table->softDeletes();
  1. Tambahkan trait di Model:
php
use Illuminate\Database\Eloquent\SoftDeletes;

class Dokumen extends Model
{
    use SoftDeletes;
}
  1. Operasi:
php
// Soft delete
$dokumen->delete();

// Restore
$dokumen->restore();

// Force delete (permanen)
$dokumen->forceDelete();

// Query termasuk soft deleted
Dokumen::withTrashed()->get();

// Hanya soft deleted
Dokumen::onlyTrashed()->get();

Q: Bagaimana mengatasi N+1 Query Problem?

A: Gunakan Eager Loading:

php
// [X] N+1 Problem (query untuk setiap dokumen)
$dokumens = Dokumen::all();
foreach ($dokumens as $dok) {
    echo $dok->kategori->nama;
}

// [OK] Eager Loading (hanya 2 query)
$dokumens = Dokumen::with('kategori')->get();
foreach ($dokumens as $dok) {
    echo $dok->kategori->nama;
}

Tips: Install laravel-debugbar untuk melihat query yang dijalankan:

bash
composer require barryvdh/laravel-debugbar --dev

Q: Bagaimana cara menjalankan raw SQL query?

A:

php
use Illuminate\Support\Facades\DB;

// Select
$users = DB::select('SELECT * FROM users WHERE active = ?', [1]);

// Insert
DB::insert('INSERT INTO users (name, email) VALUES (?, ?)', ['John', 'john@example.com']);

// Update
DB::update('UPDATE users SET active = ? WHERE id = ?', [1, 1]);

// Delete
DB::delete('DELETE FROM users WHERE id = ?', [1]);

// Statement (DDL)
DB::statement('DROP TABLE users');

Authentication

Q: Bagaimana cara cek apakah user sudah login?

A:

php
// Di Controller
if (auth()->check()) {
    $user = auth()->user();
}

// Di Blade
@auth
    <p>Halo, {{ auth()->user()->name }}!</p>
@endauth

@guest
    <a href="/login">Login</a>
@endguest

Q: Bagaimana cara membuat guard custom?

A:

  1. Edit config/auth.php:
php
'guards' => [
    'admin' => [
        'driver' => 'session',
        'provider' => 'admins',
    ],
],

'providers' => [
    'admins' => [
        'driver' => 'eloquent',
        'model' => App\Models\Admin::class,
    ],
],
  1. Gunakan guard:
php
// Login
Auth::guard('admin')->attempt($credentials);

// Cek auth
Auth::guard('admin')->check();

// Get user
Auth::guard('admin')->user();

Q: Bagaimana cara logout user dari semua device?

A:

php
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;

// Logout dari semua session (perlu database session driver)
DB::table('sessions')
    ->where('user_id', auth()->id())
    ->delete();

// Atau dengan Sanctum (hapus semua token)
$user->tokens()->delete();

API Development

Q: Bagaimana cara handle CORS di Laravel?

A:

Laravel 11+ sudah include CORS middleware. Edit config/cors.php:

php
return [
    'paths' => ['api/*'],
    'allowed_origins' => ['*'], // Atau domain spesifik
    'allowed_methods' => ['*'],
    'allowed_headers' => ['*'],
    'exposed_headers' => [],
    'max_age' => 0,
    'supports_credentials' => false,
];

Q: Bagaimana cara handle API versioning?

A:

php
// routes/api.php

// Versi 1
Route::prefix('v1')->group(function () {
    Route::apiResource('dokumens', Api\V1\DokumenController::class);
});

// Versi 2
Route::prefix('v2')->group(function () {
    Route::apiResource('dokumens', Api\V2\DokumenController::class);
});

Struktur folder:

app/Http/Controllers/Api/
    V1/
        DokumenController.php
    V2/
        DokumenController.php

Q: Bagaimana format response API yang baik?

A:

Konsisten dengan struktur:

json
{
    "success": true,
    "message": "Data berhasil diambil",
    "data": {
        // data here
    },
    "meta": {
        "current_page": 1,
        "per_page": 15,
        "total": 100
    }
}

Error response:

json
{
    "success": false,
    "message": "Validasi gagal",
    "errors": {
        "email": ["Email tidak valid"],
        "password": ["Password minimal 8 karakter"]
    }
}

Testing

Q: Bagaimana cara test dengan database terpisah?

A:

  1. Buat database testing atau gunakan SQLite memory:
xml
<!-- phpunit.xml -->
<env name="DB_CONNECTION" value="sqlite"/>
<env name="DB_DATABASE" value=":memory:"/>
  1. Gunakan RefreshDatabase trait:
php
use Illuminate\Foundation\Testing\RefreshDatabase;

class DokumenTest extends TestCase
{
    use RefreshDatabase;
}

Q: Bagaimana cara mock external service di test?

A:

php
use Illuminate\Support\Facades\Http;

public function test_external_api_call()
{
    // Mock HTTP response
    Http::fake([
        'api.example.com/*' => Http::response([
            'status' => 'success',
            'data' => ['name' => 'John']
        ], 200),
    ]);
    
    // Test kode yang memanggil API
    $response = $this->get('/fetch-external');
    
    $response->assertStatus(200);
}

Deployment

Q: Apa yang harus dilakukan setelah deploy kode baru?

A:

bash
# 1. Pull kode terbaru
git pull origin main

# 2. Install dependencies
composer install --optimize-autoloader --no-dev

# 3. Build assets
npm ci && npm run build

# 4. Jalankan migration
php artisan migrate --force

# 5. Clear dan cache
php artisan optimize:clear
php artisan optimize

# 6. Restart queue worker
php artisan queue:restart

Q: Bagaimana cara debug di production tanpa expose error?

A:

  1. Set di .env:
env
APP_DEBUG=false
LOG_LEVEL=error
  1. Cek log di storage/logs/laravel.log

  2. Gunakan service seperti Sentry atau Bugsnag

  3. Untuk debug sementara, gunakan Log::debug():

php
Log::debug('Debug info', ['user_id' => $userId, 'action' => 'login']);

Troubleshooting

Q: Error "Class not found" setelah membuat file baru?

A:

bash
composer dump-autoload

Q: Error "SQLSTATE[42S02]: Table doesn't exist"?

A:

bash
php artisan migrate
# atau
php artisan migrate:fresh --seed

Q: Error "The page has expired due to inactivity"?

A: CSRF token expired. Pastikan form memiliki @csrf:

html
<form method="POST">
    @csrf
    <!-- fields -->
</form>

Q: Error "419 Page Expired" di AJAX?

A: Tambahkan CSRF token di header:

javascript
// jQuery
$.ajaxSetup({
    headers: {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    }
});

// Fetch
fetch('/api/endpoint', {
    method: 'POST',
    headers: {
        'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').content,
        'Content-Type': 'application/json',
    },
    body: JSON.stringify(data)
});

Q: Error "Target class [Controller] does not exist"?

A: Di Laravel 8+, pastikan menggunakan full namespace di routes:

php
use App\Http\Controllers\DokumenController;

Route::get('/dokumen', [DokumenController::class, 'index']);

Q: Error "No application encryption key has been specified"?

A:

bash
php artisan key:generate

A: Buat manual di public/index.php:

php
// Tambahkan di awal file setelah <?php
$targetFolder = $_SERVER['DOCUMENT_ROOT'].'/../storage/app/public';
$linkFolder = $_SERVER['DOCUMENT_ROOT'].'/storage';
if (!is_link($linkFolder)) {
    symlink($targetFolder, $linkFolder);
}

Atau buat file PHP sementara:

php
<?php
symlink('../storage/app/public', './storage');
echo 'Symlink created!';

📚 Resources Tambahan

Official Documentation

Video Tutorials

Packages Berguna

Komunitas


Tip: Jika ada pertanyaan yang belum terjawab, jangan ragu untuk bertanya di forum komunitas atau menggunakan fitur search di dokumentasi Laravel!

Dibuat dengan ❤️ untuk ASN Indonesia