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.
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.