Sebuah perangkat lunak yang baik harus bersifat modular dan maintainable. Pengelompokan beberapa potong kode ke dalam satu modul yang dapat digunakan kembali disebut “package” di Laravel. Pada artikel kali ini kita akan membahas bagaimana cara membuat package laravel sendiri dari awal. Ada beberapa langkah sederhana yang digunakan untuk membuat “package” kita sendiri.
Pada contoh ini, kita akan memasukan konsep-konsep seperti migration, routes, views dan dependency atau ketergantungan pada package lain.
Install Laravel
Karena kita akan membuat composer package secara spesifik untuk Laravel, maka langkah pertama yang harus kita buat adalah menginstal Laravel itu sendiri. Abaikan langkah ini jika anda telah memiliki project Laravel.
Struktur Folder
Selanjutnya, kita akan membuat folder untuk package yang akan kita buat. Penamaan package standar adalah [vendor]/[nama package]. Sebagai contoh, Framework Laravel sendiri adalah sebuah package yang di publish sebagai “laravel/framework” yang mana “laravel” adalah nama vendor dan “framework” adalah nama packagenya.

Dengan mengikuti penamaan package standar diatas, mari kita beri nama package kita “lab-informatika/demo-package“. Buatlah folder packages pada root project kita.
Kemudian buat folder [vendor] kemudian [nama package] pada folder packages yang telah kita buat sebelumnya.
Buat File Composer
Karena kita membuat package composer, setiap package harus memiliki file composer.json
yang akan berisi detail package dan dependency package yang diperlukan. Pada folder demo-package jalankan perintah dibawah ini:
composer init
Kita akan diminta untuk mengisi detail dari package yang akan dibuat, kita bisa melewati proses ini dengan menekan enter untuk menggunakan nilai default. Kita bisa mengubahnya nanti pada file composer.json
.
{
"name": "lab-informatika/demo-package",
"description": "Laravel demo package",
"authors": [
{
"name": "Alfa Adhitya",
"email": "alfa2159@gmail.com"
}
],
"require": {}
}
Load Package pada composer.json utama
Pada setiap app Laravel file composer.json
terletak pada root project. Ini adalah file composer utama dimana kita mendefinisikan dependecy project kita.
Untuk membuat laravel package sendiri, update file composer.json
dan load package yang kita buat melalui PSR-4 autoload.
"autoload": {
"psr-4": {
"App\\": "app/",
"LabInformatika\\DemoPackage\\": "packages/lab-informatika/demo-package/src"
},
"classmap": [
"database/seeds",
"database/factories"
]
},
Kemudian jalankan perintah berikut
composer dump-autoload
Buat Service Provider
Service Provider adalah pintu masuk utama dalam package kita. Disinilah package kita diload. Pada root aplikasi kita, buat Service Provider dengan menggunakan artisan command.
php artisan make:provider DemoPackageServiceProvider
Perintah diatas akan menghasilkan sebuah file baru pada folder “app/Providers“, kemudian pindahkan file ini pada folder package kita (packages/lab-informatika/demo-package/src). Jangan lupa untuk mengganti namespace pada class ini sesuai dengan package kita.
<?php
namespace LabInformatika\DemoPackage\Providers;
use Illuminate\Support\ServiceProvider;
class DemoPackageServiceProvider extends ServiceProvider
{
/**
* Register services.
*
* @return void
*/
public function register()
{
//
}
/**
* Bootstrap services.
*
* @return void
*/
public function boot()
{
//
}
}
Selanjutnya, tambahkan Service Provider pada package kita di file config/app.php
pada providers
array.
'providers' => [
/*
* Laravel Framework Service Providers...
*/
Illuminate\Auth\AuthServiceProvider::class,
//
/*
* Package Service Providers...
*/
LabInformatika\DemoPackage\Providers\DemoPackageServiceProvider::class,
/*
* Application Service Providers...
*/
App\Providers\AppServiceProvider::class,
//
],
Package routes
Buat file routes.php pada folder src
pada package kita, kemudian tambahkan kode dibawah ini
<?php
Route::get('demo', function() {
echo 'Hello from the demo package!';
});
Kemudian include package routes kita pada method boot()
di Service Provider
public function boot()
{
$this->loadRoutesFrom(__DIR__.'/routes.php');
}

Disini saya menggunakan artisan serve, sehingga kita bisa mengakses route pada package kita dengan url https://localhost:8000/demo
Kita juga bisa menggunakan Controller seperti biasa pada package yang kita buat. Baca Menggunakan Controller pada Laravel untuk penjelasan lebih lengkap mengenai Controller.
Package Config

Terkadang kita juga memerlukan sebuah config yang akan digunakan pada package kita, sehingga user dapat dengan mudah mengoverride pengaturan default pada package yang kita buat. Untuk membuat config untuk package kita, buat folder resources/config pada folder package kita. Penamaan folder disini bebas, artinya kita bisa menyimpan file config kita dimana saja selama berada dalam folder package kita.
Selanjutnya, untuk mempublish pengaturan package kita, gunakan method publishes
pada method boot
di class Service Provider.
/**
* Bootstrap services.
*
* @return void
*/
public function boot()
{
//
$this->publishes([
__DIR__.'/../resources/config/demo.php' => config_path('demo.php'),
]);
}
Ketika user menjalankan perintah vendor:publish
, file config kita akan di copy ke folder config pada project laravel kita.
Untuk mengakses nilai pengaturan pada package kita, kita bisa menggunakan kode dibawah ini:
$value = config('demo.option');
Package Views
Untuk meregister view package package kita, kita perlu memberi tahu Laravel dimana view pada package kita disimpan. Gunakan method loadViewsFrom
untuk mendefinisikan letak folder view pada package kita.
/**
* Bootstrap services.
*
* @return void
*/
public function boot()
{
//
$this->loadViewsFrom(__DIR__.'/../resources/views', 'demo');
}
Untuk memanggil view yang di registrasi pada package, kita harus menggunakan syntax namespace:view
untuk merender view yang kita buat. Untuk nama namespace kita definisikan pada method loadViewsFrom
pada parameter kedua.
Jadi untuk contoh diatas, kita menggunakan demo::view
untuk merender view pada package kita. Sebagai contoh, buat file view dengan nama index.blade.php pada folder resources/views pada package kita. Silahkan isi bebas content pada index.blade.php ini.
Route::get('demo-view', function () {
return view('demo::index');
});
Untuk mengakses route diatas, kita bisa gunakan url https://localhost:8000/demo-view.

Publish View
Kita juga bisa mempublish view pada package yang kita buat, sehingga user bisa dengan mudah mengoverride view yang kita buat jika diperlukan. Kita bisa menggunakan method publishes
untuk mempublish view pada package kita.
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
$this->loadViewsFrom(__DIR__.'/../resources/views', 'demo');
$this->publishes([
__DIR__.'/../resources/views' => resource_path('views/vendor/demo'),
]);
}

Ketika user menjalankan perintah vendor:publish
, view pada package kita akan di copy ke folder resources/views/vendor (ini tergantung kita mendefinisikan path pada method publishes diatas) seperti ditunjukan pada gambar ini.
Package Translations
Jika package yang kita buat memerlukan translation, kita bisa menggunakan method loadTranslationsFrom
untuk memberitahu Laravel di folder mana harus memuat translation ini.
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
//
$this->loadTranslationsFrom(__DIR__.'/..resources/lang', 'demo');
}
Publish Translation
Jika kita perlu mengizinkan user untuk merubah translation pada package yang kita buat, kita harus mempublish translation. Kita bisa gunakan method publishes
untuk mempublish translation pada package kita.
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
$this->loadTranslationsFrom(__DIR__.'/../resources/lang', 'demo');
$this->publishes([
__DIR__.'/../resources/lang' => resource_path('lang/vendor/demo'),
]);
}
Untuk memanggil translation pada package yang kita buat, caranya sama dengan pemanggilan translation pada app utama, hanya saja kita menggunakan namespace untuk memanggil translation.
@lang('demo::app.name')
Package Discovery
Package Discovery merupakan sebuah fitur dari Laravel untuk meregister Service Provider secara otomatis tanpa harus menambahkan pada file config/app.php
seperti yang kita lakukan pada langkah sebelumnya.
Untuk meregistrasikan Service Provider, ubah file composer.json
pada package yang kita buat. Kemudian tambahkan daftar Service Provider yang akan di load secara otomatis pada bagian extra.
"extra": {
"laravel": {
"providers": [
"LabInformatika\\DemoPackage\\Providers\\DemoPackageServiceProvider"
]
}
}
Publish Package
Pada bagian ini kita akan membahas bagaimana mempublish package kita agar bisa digunakan oleh publik. Ada beberapa langkah yang harus kita lakukan sebelum package kita bisa digunakan oleh orang lain.
Update composer.json
Hal pertama yang harus dilakukan adalah mengupdate file composer.json
kita dengan menambahkan autoload PSR-4. Disini kita harus menambahkan namespace dari package kita dan path ke root package yang telah kita buat.
"autoload": {
"psr-4": {
"LabInformatika\\DemoPackage\\": "src"
}
},
Github Setup
Agar package yang kita buat bisa diakses oleh publik, maka langkah pertama yang harus kita lakukan adalah menyimpan source code dari package yang kita buat di Github.
Pertama, buat repository baru terlebih dahulu untuk menyimpan source code dari package yang dibuat.

Push to Github
Berikut adalah langkah-langkah untuk push package kita ke repository github. Pertama, masuk ke folder package kita dari terminal/command line.
git init
git remote add origin git@github.com:Lab-Informatika/laravel-demo-package.git
git add .
git commit -m "Initial Commit"
git push origin master
Github Release
Selanjutnya, kita harus membuat versioning pada package yang kita buat dengan cara membuat github release. Untuk membuat github release, buka project repository kita kemudian pilih tab release.

Klik pada button “Draft a new release” untuk membuat release baru. Kemudian isi tag version dengan versi package saat release. Untuk penamaan umum, biasanya nama tag release di awali dengan huruf v, kemudian di ikuti oleh nomor versi, misalnya v1.0.0.
Selanjutnya isi judul release dan deskripsi release jika diperlukan. Deskripsi release biasanya di isi dengan penambahan fitur pada package, apa yang berubah, apa yang diperbaiki dari release sebelumnya, dsb.
Setup packagist
Packagist adalah repository utama untuk composer, packagist menyimpan seluruh paket-paket library PHP maupun framework-framework yang bisa diinstall dengan composer.
Agar package yang kita bangun bisa di instal oleh orang banyak menggunakan composer, maka kita harus submit package kita ke packagist.
Setelah login di halaman packagist, pilih menu submit kemudian masukan alamat github repository dari package yang dibuat.

Setelah submit package ke packagist, sekarang kita bisa menginstal package yang kita buat melalui composer.
composer require lab-informatika/demo-package

Resources
Seperti itulah cara membuat laravel package sendiri dari awal. Silahkan kunjungi repository dari contoh kasus kali ini.
laravel-demo-package (this link opens in a new window) by Lab-Informatika (this link opens in a new window)
Create demo package for Laravel
No Comments
Leave a comment Cancel