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

Numpang Kerja Remote dari Bandung Digital Valley

Cara Decompile berkas Dex dan Apk Android