Skip to main content

Reverse Engineering dengan Doctrine dan Symfony


Pada kasus-kasus tertentu dimana kita perlu membuat ulang applikasi yang sebelumnya telah berjalan, atau misal karena database dan table-tablenya telah dibuatkan sebelumnya oleh pihak lain. Untuk memulai pekerjaan seperti ini kita bisa menggunakan fasilitas dari Doctrine tools dan Symfony untuk memulai pekerjaan ini supaya dapat dimulai lebih cepat dengan langkah-langkah sebagai berikut:
  1. Buat Symfony 4 Project dengan Doctrine support yang telah terpasang didalamnya.
  2. Mengkonfigurasi string koneksi ke database yang diinginkan di .env.
  3. Install REPL bernama psysh-bundle
  4. Generate entity-entity dari table yang telah ada didalam database yang diinginkan.
  5. Generate setter dan getter untuk entity-entity yang telah berhasil digenerate.
  6. Generate repository class untuk entity-entity diatas. 
  7. Setup encoders dan in memory users provider untuk user login (bila menggunakan table users takutnya memakan waktu, sebagiknya dibahas lain waktu).
  8. Setup FOSserBundel.
  9. Setup EasyAdminBundle sebagai administrasi backend sederhana untuk menampilkan informasi dari database.
  10. Setup API Platform.
  11. Setup API Platform Entity supaya dikenali sebagai API.
  12. Install Symfony Cors
  13. Setup API Platform Admin.

"Seperti yang dijelaskan dalam dokumentasi resmi Doctrine, reverse engineering adalah salah satu cara untuk memulai sebuah pekerjaan dari database yang sudah terbentuk sebelumnya. Kemampuan Doctrine sendiri mampu mengkonversi 70-80% dari informasi mapping yang diperlukan dari informasi berupa fields, indexes dan foreign key constraints yang berada di database. Akan tetapi tetap masih  ada beberapa keterbatasan yang mana Doctrine tidak mampu untuk melakukan konversi, seperti misalnya: inverse associations, inheritance types, entities dengan beberapa foreign keys sebagai primary keys atau operasi semantic pada associations seperti misalnya cascade atau lifecycle events. Beberapa hal tersebut masih menjadi PR yang harus dikerjakan secara manual." sumber

Tahap 1 - Buat Symfony Project 


Sebelumnya saya telah membuat beberapa catatan mengenai cara membuat project Symfony di local komputer kita, adapun catatan-catatan tersebut dapat dilihat pada halaman-halaman berikut:

  1. Setup Symfony 4, PostgreSQL, Nginx diatas Docker (link).
  2. Setup Symfony Website Skeleton dengan Cepat dan Mudah (link).
  3. Symfony 4 Api Platform Installation (link)

Ketiga catatan saya diatas dapat membantu untuk memulai membuat project Symfony 4 dengan cepat karena saya sertakan snapshotnya juga. Bila ada pertanyaan silahkan komentar saja dihalaman yang tengah diikuti. 

+Pasang Bootstrap dengan Encore
Petunjuk instalasi Encore ada disini. Cara memasang Bootstrap dengan Encore ada disini.

$ composer require symfony/webpack-encore-bundle
 $ yarn install

$ yarn add jquery popper.js --dev

$ yarn add bootstrap --dev

Hasilnya
Hasil dari instalasi Encore dan Bootstrap
Hasil dari instalasi Encore dan Bootstrap

Tahap 2 - Buat dan Test Koneksi ke Database

Untuk memulai tahap ini pastikan bahwa kita sudah memiliki applikasi Symfony terpasang pada komputer kita dalam kondisi terkoneksi dengan database yang menjadi target, selain itu pastikan juga REPL psysh-bundle terpasang, bila perlu detailnya bisa cek apa yang sudah saya lakukan dibawah ini 

+Buat Koneksi
Memasang string koneksi di .env milik Symfony.

Tahap 3 - Install REPL psysh-bundle

Tidak ada yang spesial dalam instalasi psysh-bundle. Untuk cara instalasi dapat dilakukan persis seperti yang ada pada halaman github bundle ini.

$ composer require --dev theofidry/psysh-bundle

Bila belum  Symfony 4 maka registrasikan sendiri bundelan ini.

<?php
// app/AppKernel.php

public function registerBundles()
{
    //...

    if (in_array($this->getEnvironment(), ['dev', 'test'])) {
        //...
        $bundles[] = new Fidry\PsyshBundle\PsyshBundle();
    }

    return $bundles;
}

+Test Koneksi Via Psysh

Test koneksi kedatabase.

Tahap 4 - Generate Entity dari Database

Sekarang tiba saatnya masuk kepembahasan utama. Pada tahap ini kita akan mengkonversi berbagai macam informasi didatabase menjadi php class entity dan juga berserta annotationnya.
 $ bin/console doctrine:mapping:import "App\Entity" annotation --path=src/Entity 

Error karena ada table yang tidak memiliki primary keys

Upps... ada error...!

In DatabaseDriver.php line 289:

Table cache has no primary key. Doctrine does not support reverse engineering from tables that don't have a primary key. 

Untuk mengatasi error diatas maka kita perlu meng-exclude beberapa table yang tidak memiliki primary key dari konfigurasi Doctrine config/packages/doctrine.yaml.

Kecualikan beberapa table yang tidak memiliki primary key dari skema Doctrine supaya tidak menyebabkan error.

doctrine:
    dbal:
        schema_filter~^(?!cache|migrations||session)~

Daftar table yang dikecualikan karena tidak memiliki primary key.

Hasilnya

Beriku ini adalah hasil dari eksekusi perintah bin/console doctrine:mapping:import.
bin/console doctrine:mapping:import
Perintah bin/console doctrine:mapping:import diatas menghasilkan file-file entity sebagai berikut:

Tahap 5 - Generate Setter dan Getter

Hasil dari proses diatas belum termasuk dengan setters dan getters, oleh karena itu maka kita perlu generate setters dan getters nya.

 $ bin/console make:entity --regenerate App

Generate setters dan getters
Akhirnya semua entity  punya setters dan getters (Setter dan Getter milik ve $ownerId yang nanti kita konversi ke relationship di waktu yang lain).

Tahap 6 - Generate Repository Class

Sengaja saya pisah proses pembuatan repository dengan proses generate setter dan getter diatas supaya lebih jelas untuk dipahami.
Set nama repository class yang diinginkan 
$ ./bin/console make:entity --regenerate  
Hasil dari proses generate

Tahap 7 - Encoders dan Users Provider

Untuk membuat login pertama kita akan mensetup encoders dan in memory users provider. Kenapa tidak pakai users yang telah ada di database? jawabannya karena memakan waktu untuk mencari tahu dan mengurus encoding password yang sebelumnya dilakukan oleh yang merancang database.

Buka file security.yaml lihat bagian encoders.



Buka file security.yaml lihat bagian providers.

Lihat pemasangan FOSUserBundle dibawah.

Tahap 8 - Pasang FOSUserBundle

Untuk ini kita memerlukan User entity untuk digunakan oleh FOSUserBundle untuk login pada kasus ini saya menggunakan user di in memory sehingga ada sedikit penyesuaian (Table users di database tidak saya gunakan untuk login dulu untuk menyingkat waktu). 

Untuk menyingkat waktu ikuti saja catatan saya yang sebelumnya saya buat disini dengan sedikit penyesuaian diaatas.


AppBundle\Entity\User
config/packages/fos_user.yaml
Halaman Login


Tahap 9 - Pasang EasyAdminBundle

Route untuk Easy Admin ada di /admin
Register entity-entity yang diinginkan dikelola oleh easy admin.


Pastikan pada access controll /admin hanya bisa diakses oleh admin saja.
Untuk mengakses halaman admin  milik EasyAdmin kita perlu masuk ke route /admin yang telah kita set sebelumnya diatas.
Tampilan halaman backend dari Easy Admin.

Tahap 10 - Pasang API Platform

Untuk terkait instalasi API Platform bisa melihat catatatn saya sebelumnya disini. Hanya bedanya Symfony disini saya tambahkan sebagai web-skaleton dengankan pada catatan API Platform saya yang sebelumnya menggunakan Symfony skeleton saja, lihat link instalasi API Platform dari Symfony skeleton disini
"Untuk mengetahui perbedaan Symfony Skeleton dengan Symfony Web Skeleton silahkan lihat catatan saya sebelumnya disini."
 composer require api
Install API Platform.
hasil install API Platform.
Hasilnya
Hasil instalasi, penambahan command di console

Untuk mengakses 
halaman spesifikasi API  milik API Platform kita perlu masuk ke route default milik API Platform /api.



Masih kosong ya "No operations defined in spec!"

Tahap 11 - Setup API Platform Entity

Setup Entity Supaya dikenali oleh API Platform.
src/Entity/Images.php


Tahap 12 - Install Symfony CorsBundle

$ composer req cors



Hasilnya di .env

Tahap 13 - Install API Platform Client Admin


$ yarn create react-app the_jakarta_client
$ cd the_jakarta_client
$ yarn add @api-platform/admin


+Set URL Symfony API Platform

Rubah total isi dari file App.js berikut ini supaya sesuai dengan keperluan kita.


$ vim src/App.js


vim src/App.js
$ yarn start


Hasil dari yarn start.

Penampakan Halaman dari API Platform Admin.
Add caption


Penutup

Hasil akhir dari catatan ini adalah membuat user interface dari table-table di database dengan bantuan EasyAdmin dan juga dengan API Platform Admin Bundle.

Via API Platform Admin (ReactJS).
Via Easy Admin Bundle.
























Sumber
  1. https://undebugable.blogspot.com/2019/11/test-koneksi-symfony-ke-database-dengan.html
  2. https://stackoverflow.com/questions/51774053/symfony-4-and-doctrine-how-to-generate-repository-automatically-after-mapping
  3. https://symfony.com/doc/current/doctrine/reverse_engineering.html
  4. https://symfony.com/doc/current/doctrine/reverse_engineering.html#generating-the-getters-setters-or-php-classes
  5. https://api-platform.com/docs/core/getting-started/#installing-api-platform-core
  6. https://undebugable.blogspot.com/2019/08/symfony-4-api-platform-installation.html
  7. https://undebugable.blogspot.com/2019/06/membuat-symfony-user-login-dengan.html



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