Study
Symfony

Services & Dependency Injection

Penjelasan

Symfony sangat menganut Dependency Injection — logika bisnis yang bisa dipakai ulang biasanya diekstrak jadi class Service tersendiri (disimpan di src/Service), lalu di-INJECT ke controller/service lain cukup lewat type-hint di constructor. Symfony otomatis mendeteksi dan menyediakan instance-nya (disebut autowiring), tanpa perlu registrasi manual untuk kasus umum.

Contoh Konsep

<?php

namespace App\Service;

class HargaService
{
    public function hitungDenganPajak(float $harga): float
    {
        return $harga * 1.11; // PPN 11%
    }
}

// Dipakai di controller, cukup type-hint di constructor:
namespace App\Controller;

class ProdukController extends AbstractController
{
    public function __construct(private HargaService $hargaService) {}

    #[Route('/produk/{id}/harga', name: 'produk_harga')]
    public function harga(int $id): Response
    {
        $total = $this->hargaService->hitungDenganPajak(100000);
        return new Response((string) $total);
    }
}

Praktikum

Buat Service DiskonService dengan method hitung(float $harga, float $persenDiskon): float yang mengembalikan harga setelah dikurangi diskon. Buat method controller yang menerima DiskonService lewat constructor injection dan memakainya.

Editor Latihan

Ketik/edit bebas di sini untuk latihan — kode ini tidak dijalankan.

Tips

Autowiring bekerja berdasarkan TYPE-HINT, bukan nama variabel — selama class Service kamu terdaftar sebagai service (default-nya OTOMATIS untuk semua class di src/), Symfony akan tahu cara menyediakannya cukup dari tipe parameternya, tanpa file konfigurasi tambahan untuk kasus sederhana.