Service Container
Aplikasi Symfony berisi berbagai macam objek: misalnya objek "Mailer" untuk mengirim email dan juga objek lainnya misal objek yang digunakan untuk berkomunikasi dengan database, dll. Hampir semua hal yang dilakukan oleh Symfony based application menggunakan object-object tersebut.
Begitu pula saat kita memasang bundle baru maka kita akan mendapatkan fitur tambahan dari bundle tersebut. Di Symfony objek-objek tersebut dikenal sebagai services dan setiap service berada dalam wadah bernama service container.
Dengan menggunakan wadah berupa service container ini bertujuan untuk kita menentukan bagaimana objet-objek tersebut disusun. Hal ini bertujuan mempermudah penggunaan dengan memanfaatkan arsitektur yang baik.
Jadi Apa itu Symfony Service Container? Symfony Service container adalah wadah dari berbagai macam objek dengan kemampuan menangani ketergantungan antara dependency.
Lalu Apa itu Service Dalam Symfony? Pada symfony, setiap objek yang memiliki peranan tertentu disebut dengan service dan setiap service berada dalam sebuah objek yang secara khusus berfungsi sebagai service container (Container itu ya object juga!).
Default Services di Symfony
Pada saat kita memulai sebuah aplikasi Symfony maka container sudah berisi berbagai macam service dasar yang siap digunakan. Dari Controller misalnya, kita bisa mengakses berbagai macam service dari service container dengan memberikan argumen berupa nama Class atau nama Interface.
root@cb423a87a735:/var/www# ./bin/console debug:autowiring
root@cb423a87a735:/var/www# ./bin/console debug:container
Selanjutnya kita akan membuat service sendiri dan menginject service tersebut kedalam sebuah controller dari sebuat aplikasi web yang memiliki route yang dapat diakses secara langsung dari browser.
Membuat Service Sederhana
Buat file src/Service/MessageGenerator.php lalu masukan beberapa baris kode:
Implementasikan Service diatas dengan cara dipanggil ke method ke sebuah controller.
Hasil dari inject diatas akan muncul dibrowser seperti dibawah ini.
Sekarang lihat dan pahami ini untuk memahami hasil kerja dari service container.
public function index(MessageGenerator $mg)
Kenapa saya bisa menggunakan $mg->getHappyMessage() di dalam fungsi index? Jawabannya adalah: "Itulah hasil kerja Service Container yang meresolve dependencies".
Load Semua File PHP di folder src Sebagai Services
Pada config/services.yaml ada baris seperti dibawah ini, baris ini befungsi untuk me-load semua file php yang berada didalam folder src kedalam Service Container kecuali: DependencyInjection, Entity, Migrations, Tests, Kernel.php. Karena kita memasukan semua file src kedalam Service Container maka kebutuhan dependency pada setiap class di folder src ditangani oleh service container dengan menggunakan metode dependency injection (Dependency Injection adalah sebuah implementasi dari Strategy pattern).
Dependency Injection bukanlah design patter tetapi merupakan sebuah implementasi dari Strategy pattern link.
# makes classes in src/ available to be used as services
# this creates a service per class whose id is the fully-qualified class name
App\:
resource: '../src/*'
exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}'
Autowiring
Bila autowiring false maka harus inject deps manual di service.yml.
_defaults:
autowire: false
autoconfigure: true
.................inject.manual.karena.gak.ada.autowiring................
App\Controller\BlogController:
arguments: ['@App\Service\Greeting']
App\Service\Greeting:
arguments: ['@logger']
Autoconfigure
Bila autoconfigure juga false maka harus pasang tags manual di service.yml.
_defaults:
autowire: false
autoconfigure: false
.................tag.manual.karena.gak.ada.autoconfigure................
App\Controller\BlogController:
arguments: ['@App\Service\Greeting']
tags:
- { name: controller.service_arguments }
Autowiring and Required Annotation
Ketika autowiring dalam kondisi enable maka kita dapat mengkonfigurasi supaya Container memanggil methods yang ada pada file class ketika proses instant dilakukan. Contohnya, saat kita hendak menginject logger service pada class dengan menggunakan setter-injection:

Bila public: false maka fungsi ini tidak jalan, dan memang ini sebaiknya false kalo mau ada yg public ya partial aja.
Ini akan berfungsi sekarang. |
Sumber
Comments
Post a Comment