Bagaimana Membuat dan Menggunakan Shared Model di Laravel?

Membuat dan Menggunakan Model sebagai Composer Package

Yugo
Laravel Indonesia
4 min readOct 31, 2016

--

Contoh Kasus

Saya punya dua buah aplikasi terpisah, anggap saja namanya “admin” dan “frontend”. Keduanya berbasis framework Laravel dan menggunakan sumber basisdata yang sama.

Saat ini, saya selalu membuat model pada masing-masing aplikasi. Padahal, model yang dibuat, nama berkas dan isinya selalu sama antara satu dengan yang lainnya. Saya merasa, hal ini kurang efektif. Lainnya, lumayan kerepotan juga menjaga konsistensi di antara keduanya, apalagi jika pengembangnya lebih dari satu.

Ada beberapa solusi yang ditawarkan:

  1. Menyalin model dari aplikasi utama ke aplikasi lainnya. Dengan asumsi model pada aplikasi “admin” merupakan model rujukan.
  2. Membuat aplikasi baru khusus menangani data, seperti API misalnya.
  3. Membuat dan menjadikan model sebagai Composer Package dan menggunakannya pada semua aplikasi.

Yang pertama merupakan cara yang saya gunakan sekarang. Menganggap model pada aplikasi “admin” merupakan yang utama. Jadi, jika ada perubahan model di aplikasi admin, saya langsung menyalinnya ke aplikasi lainnya. Bad practice.

Cara kedua lebih terstruktur sekaligus persiapan agar data dapat dikonsumsi oleh platform lainnya. Hanya saja, dengan sumber daya pengembang yang terbatas, hal ini cukup menguras tenaga karena kita harus menambah satu aplikasi lagi.

Cara ketiga adalah yang sudah saya gunakan dan akan saya bagikan di tulisan ini.

Sebelum melanjutkan ke bahasan berikutnya, ada beberapa hal yang harus dimiliki dan dikuasai oleh pembaca, yaitu:

  1. Koneksi Internet.
  2. Pemahaman akan framework Laravel.
  3. Paham dalam penggunaan Command Line Interface.
  4. Paham menggunakan repositori CVS seperti Git, SVN, Mercurial, dan lain sebagainya.
  5. Paham dalam menggunakan dan membuat Composer Package.

Membuat Composer Package

Composer is a tool for dependency management in PHP. It allows you to declare the libraries your project depends on and it will manage (install/update) them for you.

Buat direktori baru dengan nama “package”. Di dalam direktori ini, kita akan membuat satu (atau beberapa) Composer Package nantinya, salah satunya adalah “model”.

Tambahkan direktori kode sumber dalam direktori “model” dengan nama “src”. Buat pula beberapa berkas model di dalamnya. Isinya sama persis dengan model yang kita buat pada aplikasi Laravel.

Pada contoh di bawah, saya menambahkan dua model, yaitu “User.php” dan “Blog.php” dalam direktori “src”.

package
├── model
│ ├── src
│ │ ├── Blog.php
│ │ └── User.php
│ └── tests
└── repository

Masuk ke dalam direktori “package/model”, kemudian inisiasi Composer Package dengan perintah:

composer init

Berikutnya, kita akan dipandu untuk mengisi beberapa data seperti package name, developer, dependency, dan lain sebagainya.

Berdasarkan contoh yang saya buat, hasil akhirnya adalah sebagai berikut.

{
"name": "opentrip/model",
"description": "Shared model for all Laravel applications",
"type": "library",
"license": "Private",
"authors": [
{
"name": "Dedy Yugo Purwanto",
"email": "dedy.yugo.purwanto@gmail.com"
}
],
"minimum-stability": "dev",
"require": {}
}

Tambahkan namespace autoload PSR-4 pada berkas “composer.json”.

"autoload": {
"psr-4": {
"Opentrip\\": "src/"
}
}

Dalam contoh, saya menambahkan namespace “Opentrip\\” dengan sumber direktori di “src”. Sehingga nantinya, dalam implementasi pada aplikasi, kurang lebih menjadi seperti ini:

<?phpnamespace App\Http\Controllers;use Opentrip\Blog;class SampleController extends Controller {}

Untuk memastikan package yang telah dibuat tidak ada kesalahan, ujicoba dengan instal package menggunakan Composer.

composer install

Selengkapnya mengenai pembuatan Composer Package, dapat dibaca pada artikel berikut: https://knpuniversity.com/screencast/question-answer-day/create-composer-package.

Commit dan Push Package ke CVS

Dalam tulisan ini, saya menggunakan Git sebagai repositori utama.

Jika ingin menggunakan repositori gratis namun private, bisa menggunakan gitlab.com. Sedangkan jika code yang kita commit-push bersifat terbuka, dapat menggunakan github.com. Penyedia repository CVS populer lainnya ada bitbucket.org.

Buat repositori baru pada penyedia layanan. Saya menggunakan Gitlab.com karena model yang saya gunakan bersifat private. Adapun repositori tersebut beralamat di https://gitlab.com/arvernester/opentrip-model.git.

Masuk ke dalam direktori “package/model”, inisiasi Git, commit, dan push dengan perintah (kurang lebih) seperti berikut:

git init
git remote add origin https://gitlab.com/arvernester/opentrip-model.git
git add .
git commit -a
git push origin master

Selengkapnya mengenai Git, dapat dibaca pada dokumentasi Github.com.

Menambahkan dan Menggunakan Shared Model pada Aplikasi

Terakhir, agar model dapat digunakan pada kedua aplikasi, “frontend” dan “admin”, harus menambahkan package di atas pada kedua aplikasi tersebut.

Ubah berkas “composer.json” pada masing-masing aplikasi dengan menambahkan key respository yang bersumber dari Git.

"repositories": [
{
"type": "git",
"url": "https://gitlab.com/arvernester/opentrip-model.git"
}
]

Dalam Composer, juga dimungkinkan menambahkan repositori selain Git, seperti SVN misalnya. Selengkapnya dapat dibaca pada dokumentasi resminya.

Tambahkan juga package name pada required package.

"require": {
"php": ">=5.6.4",
"laravel/framework": "5.3.*",
"opentrip/model": "dev-master"
},

Untuk mengunduh package tersebut, jalankan perintah di bawah.

composer update

Apabila repositori bersifat private, akan ada dialog menanyakan username dan password repositori tersebut.

Periksa direktori “opentrip/model” telah ada dalam direktori “vendor” untuk memastikan repositori benar-benar berhasil diinstal.

Setelahnya, model dapat digunakan pada controller dengan namespace yang telah didefinsikan seperti di atas.

<?phpnamespace App\Http\Controllers;use Opentrip\Blog;
use Opentrip\User;
class BlogController extends Controller
{

public function index()
{
$blogs = Blog::with('user')->paginate(5);
return view('content.blog.index', compact('blogs'))
->withTitle('Blog');
}
}

Konklusi

Dengan menjadikan model sebagai package yang terpisah dari aplikasi, akan memudahkan dalam pengelolaan dan penggunaan pada beberapa aplikasi sekaligus.

Kekurangannya, kita harus mengunggah package ke repositori CVS dan meng-update composer dari aplikasi lainnya apabila setiap ada perubahan pada model.

--

--