1. Laravel
  2. PHP

Cara Membuat Package Laravel sendiri

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.

Laravel package 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'),
    ]);
}
package view publish

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.

Github new Repository

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.

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

Packagist submit package

Setelah submit package ke packagist, sekarang kita bisa menginstal package yang kita buat melalui composer.

composer require lab-informatika/demo-package
Install package

Resources

Seperti itulah cara membuat laravel package sendiri dari awal. Silahkan kunjungi repository dari contoh kasus kali ini.

Comments to: Cara Membuat Package Laravel sendiri

    Your email address will not be published. Required fields are marked *

    Attach images - Only PNG, JPG, JPEG and GIF are supported.