Skip to main content

Memahami Service, Service Container dan autowiring pada Symfony

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:
        autowirefalse 
        autoconfiguretrue
.................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:
        autowirefalse 
        autoconfigurefalse 
.................tag.manual.karena.gak.ada.autoconfigure................
    App\Controller\BlogController
        arguments: ['@App\Service\Greeting']
        tags:
            - { namecontroller.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:
Public and Private Services (Default is False) 

Bila public: false maka fungsi ini tidak jalan, dan memang ini sebaiknya false kalo mau ada yg public ya partial aja.


Set Partial Public Services dan Alias

Ini akan berfungsi sekarang.

Sumber
  1. https://symfony.com/doc/current/service_container.html
  2. https://howtodoinjava.com/design-patterns/behavioral/strategy-design-pattern/
  3. https://symfony.com/doc/current/service_container/autowiring.html#autowiring-other-methods-e-g-setters

Comments

Popular posts from this blog

Numpang Kerja Remote dari Bandung Creative Hub

Semalam kemarin (09 Januari 2019) tidak sengaja kami sekeluarga lewat Bandung Digital Hub saat pulang dari Fish Wow Cheeseee  yang di Jl. Lombok. Bandung Digital Hub ini sendiri berlokasi tidak jauh dari dari tempat kami makan tersebut, yaitu berlokasi di Jl. Laswi No.7, Kacapiring, Batununggal, Kota Bandung, Jawa Barat 40271. Berhubung untuk bulan Januari 2019 ini sedang tidak masuk ke kantor maka saya putuskan untuk besoknya (hari ini 09 Januari 2019) nyoba untuk bekerja remote dari Bandung Digital Hub , apalagi istri yang kebetulan follower pak Ridwan Kamil di Instagram juga Facebook dan tampaknya pernah lihat ulasan mengenai tempat ini sehingga tampak antusias supaya saya datang ketempat ini ini dan mencoba bekerja dari gedung creative hub dan coworking yang keren ini.  Tempat Parkir Masalah utama saat kita datang ke coworking space terutama yang berlokasi di Bandung (atau mungkin kota-kota lainnya) adalah lahan parkir, kadang lahan parkir ...

Numpang Kerja Remote dari Bandung Digital Valley

Satu lagi co-working place  gratisan dan keren yang cukup populer dikota Bandung, co-working place yang juga memberikan fasilitas tempat kerja (co-working place) dan fitur-fitur menarik lainnya,  co-working place keren  ini adalah Bandung Digital Valley atau yang sering disingkat BDV . C o-working place  Bandung Digital Valley ini  merupakan bagian dari Telkom , mulai aktif digunakan dari sekitar tahun 2012 lalu .  Tempat ini biasanya menjadi tempat favorit bagi para pengiat startup, freelancer, dan mahasiswa . Gedung BDV Gedung BDV Gedung BDV Co-working space Bandung Digital Valley ini sendiri berlokasi di Menara Bandung Digital Valley, Jl. Gegerkalong Hilir No.47, Sukarasa, Sukasari, Kota Bandung, Jawa Barat, detailnya bisa dilihat di Google map berikut. Pemandangan jalan setelah pintu satpam. Free Co-working Space Membership Untuk mulai menggunakan fasilitas co-working space ini secara gratis maka yang pe...

Membuat Authentikasi Berbasis Token pada Spring Boot dengan Spring Security dan JWT

Setelah beberapa kali mencari tutorial tentang otentikasi aplikasi web Spring Boot dengan menggunakan JWT yang mudah dipahami akhirnya saya menemukan artikel berbahasa Inggris tapi sangat mudah dipahami  dan diikuti, artikel tersbut berada disini , dengan judul " Spring Boot Token based Authentication with Spring Security & JWT ". Untuk memudahkan orang-orang yang terbiasa membaca artikel dalam bahasa indonesia (termasuk saya sendiri), artikel ini saya buat dan susun ulang (artikel aslinya tidak tertulis dengan runtut dan dapat membuat pemula bingung dengan berbagai error yang muncul) supaya lebih mudah untuk diikuti dan dapat di gunakan bersama. Applikasi yang akan kita buat adalah aplikasi web yang setiap endpoint-nya hanya bisa di akses oleh role tertentu. 1. Tools Yang Diperlukan IntelliJ Idea text editor. Spring Assistant Plugin. Postman. PostgreSQL + DBeaver. Min Java 8 Spring Boot 2.1.8 (dengan Spring Security, Spring Web, Spring Data JPA). jjwt 0.9.1. Maven 3.6.1....