Menilik Fitur Baru Laravel 8

Laravel adalah salah satu framework PHP paling populer saat ini. Framework laravel memiliki konsep MVC yang akan memecah source code sesuai fungsi masing-masing. Pada awal bulan lalu, tepatnya pada 8 September 2020 Laravel merilis versi terbarunya, Laravel 8. Namun, versi ini bukanlah versi LTS (Long Term Support). Developer akan terus mengembangkan dan memperbaiki bugsnya selama satu tahun mendatang. Nah, TAS Official akan mengajak kalian untuk menilik fitur baru Laravel 8. Apa saja?

Laravel Jetstream dan Laravel Fortify

Laravel Jetstream adalah suat kerangka scafolding yang akan membantu kita dalam penyediaan fitur-fitur umum yang sering digunakan. Beberapa fitur bawaan ini meliputi :

  • Authentication (login, dashboard, logout, password reset)
  • Two factor authentication (fitur ini menarik, seperti Google Authenticator)
  • Browser session management
  • API token management (Menggunakan Laravel Sanctum dan adanya hak akses)
  • Full “teams” functionality (user bisa membuat team, undang user ke team, dll)
  • User profile
  • Delete account functionality

Lebih lanjut, fitur terbaru ini akan menggantikan Laravel UI pada versi terdahulunya.

Direktori app/Models

Pada Laravel 8, secara default model akan berada pada folder app/Models. Kita dapat melihatnya secara langsung pada Github Branch master. Hal ini karena tingginya permintaan dari komunitas. Jika kita sudah upgrade ke laravel 8 maka perintah php artisan make:model akan membuat model baru pada app/Models

Job Batching

Fitur menarik lainnya dari Laravel 8 adalah Job Batching. Melalui fitur ini developer dapat mengeksekusi banyak jobs kemudian memanggilnya dengan perintah callback ketika selesai. Contoh enggunaan bus::batch adalah sebagai berikut

use App\Jobs\ProcessPodcast;
use App\Podcast;
use Illuminate\Bus\Batch;
use Illuminate\Support\Facades\Batch;
use Throwable;

$batch = Bus::batch([
    new ProcessPodcast(Podcast::find(1)),
    new ProcessPodcast(Podcast::find(2)),
    new ProcessPodcast(Podcast::find(3)),
    new ProcessPodcast(Podcast::find(4)),
    new ProcessPodcast(Podcast::find(5)),
])->then(function (Batch $batch) {
    // All jobs completed successfully...
})->catch(function (Batch $batch, Throwable $e) {
    // First batch job failure detected...
})->finally(function (Batch $batch) {
    // The batch has finished executing...
})->dispatch();

return $batch->id;

Migration Squashing

Perintah ini berfungsi untuk menyatukan file-file migration dalam satu file SQL. Fitur ini mendukung dua database management system besar yakni MySQL dan PostgreSQL. Perintah untuk melakukan migration squashing adalah sebagai berikut:

$ php artisan schema:dump

Perintah ini dapat sekaligus melakukan dump dan menghapus file migration dengan menambah parameter prune

$ php artisan schema:dump --prune

File hasil squash akan tersimpan dalam app/schema

Model Factory

Laravel melakukan banyak peningkatan pada model factory. Model Factory pada versi ini memberikan dukungan penuh pada relationship pada model kelas. Salah satu contoh penggunaannya adalah sebagai berikut:

<?php

namespace Database\Factories;

use App\Models\User;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Str;

class UserFactory extends Factory
{
    protected $model = User::class;

    public function definition()
    {
        return [
            'name' => $this->faker->name,
            'email' => $this->faker->unique()->safeEmail,
            'email_verified_at' => now(),
            'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
            'remember_token' => Str::random(10),
        ];
    }
}

Model ini menambahkan trait hasFactory, sehingga kita dapat menggunakan perintah berikut ini pada model Factory :

<?php
use App\Models\User;

User::factory()->count(50)->create();

Maintenance Mode Yang Lebih Baik

Pada versi terdahulu, artisan-down dapat dilewatkan dengan perintah allow-list. Perintah allow-list ini dapat mendaftarkan alamat IP-Addres komputer untuk mengakses selama mode maintenance. Sedangkan pada Laravel 8 perintah ini diganti dengan token.

$ php artisan down --secret="1630542a-246b-4b66-afa1-dd72a4c43515"

Untuk mengaksesnya, kita harus melewatkannya pada URL setelah domain utama. Misal

https://teknosejahtera.co.id/1630542a-246b-4b66-afa1-dd72a4c43515

Selain itu juga menambahkan perlakuan khusus agar segera menampilkan halaman ketika maintenance mode. Hal ini memungkinkan untuk developer melakukan update melalui composer dan pengguna langsung dapat melihat hasil update ini (pre-render). Perintah untuk melakukan pre-render adalah

$ php artisan down --render="errors::503"

Rate Limiting

Pada Laravel 8, Rate Limiting dapat dilakukan melalui facade. Perintah untuk melakukan Rate Limiting adalah sebagai berikut

use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Support\Facades\RateLimiter;

RateLimiter::for('global', function (Request $request) {
    return Limit::perMinute(1000);
});

Untuk memanggil Rate Limiting dapat dilakukan menggunakan Middleware Throtle

Route::get('/login')->middleware(['throttle:authentication']);

Time Testing Helpers

Fitur Time Testing Helper akan memudahkan kita dalam melakukan pengolahan waktu saat unit testing. Bahasa ini mendukung modifikasi waktu dengan perintah travel.

/ Travel into the future...
    $this->travel(5)->milliseconds();
    $this->travel(5)->seconds();
    $this->travel(5)->minutes();
    $this->travel(5)->hours();
    $this->travel(5)->days();
    $this->travel(5)->weeks();
    $this->travel(5)->years();

    // Travel into the past...
    $this->travel(-5)->hours();

    // Travel to an explicit time...
    $this->travelTo(now()->subHours(6));

    // Return back to the present time...
    $this->travelBack();

Wah, kaya time travelers ya!

Peningkatan Artisan Serve

Laravel 8 secara otomatis akan mendeteksi konfigurasi environment tanpa harus melakukan restart pada php artisan serve

Nah, setelah menilik fitur baru laravel 8, apakah kalian tertarik mencobanya?

Cara Install Composer di Windows, MacOS, dan Linux

Apa itu composer? Buat kalian yang baru aja bergabung ke dunia web development pasti baru denger ini kan? Tapi, no problem, semua master berawal dari pemula. Bagi kalian yang udah jago mungkin ga perlu lagi baca tulisan ini , tapi jaga-jaga kalo kalian yang lupa caranya, boleh kok mampir and baca tulisan ini untuk mengulik tutorial install composer baik di Windows, MacOs, maupun Linux.

Dependency Manager

Composer merupakan dependency manager pada bahasa PHP. Apa sih dependency manager ? Secara bahasa, dependency artinya ketergantungan. Nah, ngapain sih ada ketergantungan ? Bukanya lebih baik kalo apa-apa mandiri? Gini guys, aku kasih sedikit rahasia. Zaman now, apa yang kita buat hampir 90% lebih udah pernah dibuat orang. Artinya masalah yang kita hadapi juga udah pernah dihadapi oleh banyak orang. Oleh karena itu, tentunya udah banyak orang yang mendokumentasikan secara rapi. Kita cukup googling aja, and viola. Muncul lah jawabannya. 90% jawaban itu bakal muncul dari web bernama stackoverflow. Biasanya, pilihan jawaban yang sudah verified merupakan jawaban atas masalah yang lagi kamu alami.

Sama halnya dengan dependency manager ini. Ternyata banyak programmer berhati malaikat yang udah bisa resolve masalah dan berbaik hati berbagi dengan programmer lain. Programmer malaikat ini membuat suatu library dan membagikannya dalam repository publik, sehingga orang lain bisa gunain lewat internet. Nah itulah latar belakang adanya dependency, jadi jika kita bikin aplikasi dan membutuh suatu library library yang ternyata library itu udah ada orang lain yang buat, kita tinggal download aja melalui dependency manager. Dependency manager ini ibaratadalah jalan tol untuk memecahkan masalah kita.

Kembali lagi ke Composer. Sebenarnya, apa itu composer? Composer merupakan dependecy manager dalam bahasa PHP. Apa hanya untuk PHP? Of Cuorse. Buat kalian yang terbiasa menggunakan Java, composer ini seperti maven / gradle dan ibarat npm kalau pada NodeJS. Kalau kita ingin install composer sebenarnya gampang banget kok. Tinggal buka composer, lalu ikutin aja step-stepnya.

Nah sekian tutorial kali ini. Wkwkwkw nggak-nggak. Bercanda.

Oke , ga usah panjang lebar langsung kita coba aja install Composer. Nah perlu kalian tahu, instalasi composer ternyata beda-beda sesuai sistem operasinya. Nah perlu kalian tahu, instalasi composer ternyata beda-beda sesuai sistem operasinya. Karena itu, jangan sampai salah memilih tutorial ya.

Instalasi Pada Windows

Untuk kalian yang pake sistem operasi windows, kalian bisa langsung buka halaman Getting Started. Lalu kalian dibawa ke halaman berikut ini

Sumber : Composer

Pilih 4.1 Installation Windows -> Using Installer. Otomatis file installer Composer akan terdownload. Double klik pada installernya, kemudian next-next aja sampai selesai. Jika kalian diminta untuk menunjukan path dari php, maka pilih php.exe pada web server yang kalian install. Jika kalian menggunakan XAMPP (yang paling umum), path php terletak pada C:\Xampp\php\php.exe.

Instalasi Pada MacOs atau Linux

Kalian bisa bisa ikuti daftar command line berikut ini pada Terminal:

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === '8a6138e2a05a8c28539c9f0fb361159823655d7ad2deecb371b04a83966c61223adc522b0189079e3e9e277cd72b8897') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"

Composer akan terinstall namun masih dalam bentuk file composer.phar, pindahkan ke /usr/local/bin/ agar dapat menggunakan perintah CLI composer

mv composer.phar /usr/local/bin/composer

Selesai

Nah itulah tutorial boleh kok mampir and baca tulisan ini untuk mengulik tutorial cara install composer baik di Windows, MacOs, maupun Linux. . Jika mengalami masalah kalian bisa tinggalkan komentar ya. See ya in next article !

Benarkah NodeJS Akan Menggantikan PHP?

Web development semakin berkembang dari waktu ke waktu. Teknologi baru selalu bermunculan setiap harinya. Dari sisi back-end, terdapat dua bahasa pemrograman yang cukup mendominasi yaitu NodeJS dan PHP. PHP yang menjadi tulang punggung duni per-website-an diprediksi akan tergerus NodeJS yang merupakan pemain baru. Mampukah PHP tertap bertahan? Atau justru NodeJs akan berhasil menggantikan PHP?

Pembahasan ini sebenarnya cukup “keramat” untuk diperbincangkan. Meskipun, pada awal kemunculannya Javascript hanya pada sisi front end,lambat laun merambah ke back-end dan menjadi kompetitor tangguh bagi PHP. Terlebih beberapa artikel pergeseran teknologi dari PHP ke NodeJS beberapa kali ter-blow up. Bukan hanya dalam negeri, artikel seperti “Which is better for back-end – PHP or Node js?” , “Is Node js killing PHP?” atau “Is NodeJS eating PHP Market?” sering menjadi topik perbincangan developer luar negeri.

Sebagian orang akan mengganggap hal ini sebagai keuntungan. Tipe-tipe ini biasanya vendor besar yang sering mendapat ‘jatah’ project dari pemerintahan. Namun, tentu saja tidak sedikit yang akan menganggap hal ini menjadi malapetaka, karena project mereka akan otomatis berpindah tangan ke vendor yang lebih mampu. Jelas hal ini sebenarnya konsep yang salah kaprah. Jika ada teknologi baru yang lebih baik, mengapa tidak memilih yang lebih mudah?. Namun, benarkan NodeJS lebih baik dari PHP? Dan apakah PHP akan terus tergerus NodeJS? Sampai-sampai WordPresspun akan berpindah haluan ke NodeJS.

NodeJS VS PHP

PHP merupakan bahasa pemrograman paling umum yang dalam pengembangan webiste. Bahasa pemrograman ini dapat berperan sebagai compiler sekaligus interpreter. PHP pertama kali rilis pada tahun 1995. Saat ini versi terbaru PHP adalah 7.0.16 dan 7.1.2 yang resmi rilis pada tanggal 17 Februari 2017.

Nah, NodeJS sebenarnya bukan merupakan bahasa pemrograman. Jadi, salah jika seseorang mengatakan bahasa pemrograman NodeJs. NodeJS merupakan suatu framework yang akan membawa bahasa pemrograman JavaScript ke sisi back-end. Untuk dapat menggunakan NodeJs kita harus paham bahasa pemrograman.

Dari segi popularitas, NodeJS lebih unggul dari PHP. Sejak 2014 Framework NodeJS merajai kepopuleran bahasa pemrograman dengan angka 49,6% jauh melebihi PHP. Apa keuntungannya? Semakin populer suatu framework maka semakin dokumentasi akan semakin banyak. Hal ini akan mempermudah kita ketika mengalami kendala pengembangan proyek.

Sumber : stackoverflow.com

Sebaliknya, tingkat pengguna bahasa pemrograman PHP semakin berkurang dari waktu ke waktu. Tingkat penurunan yang terjadipun cukup signifikan yakni mencapai 7% .  Di sisi lain , pengguna NodeJS meningkat tajam 18% selama 4 tahun. Dengan ini, terbukti bahwa developer-developer website mulai beralih ke NodeJS

Sumber : stackoverflow.com

Selama proses development, PHP memerlukan web server. Meskipun server ini merupakan bawaan, namun hal ini akan memakan banyak resource server. Penggunaan server tambahan  seperti nginx tetap diperlukan untuk meningkatkan performa kecepatan PHP. Sebaliknya, NodeJS merupakan tipe single-fighter yang mampu berdiri sendiri tanpa memerlukan web server lain. NodeJS memiliki waktu eksekusi yang lebih baik dari PHP terutama dalam penambahan angka. Namun PHP memiliki waktu eksekusi yang lebih baik dalam hal operasi string, pengisian array, MySQL, dan membaca file.

Sumber : blog.teknosejahtera.co.id

Perfoma NodeJS vs PHP

Untuk kasus multi-tasking, NodeJS jauh lebih handal daripada PHP. Misal kita memiliki dua task yakni mengambil data dari database, dan menghapus file. Jika kita menggunakan PHP, proses ini akan dilakukan berurutan. Hapus file akan dilakukan setelah pengambilan data selesai. Namun, jika kita menggunakan NodeJS kedua hal ini dapat dilakukan bersamaan. Hasilnya, bisa jadi file terhapus duluan sebelum pengambilan data selesai.

sumber : Sebuah Seni Menerapkan “Clean Code”

Hal ini tidak berlaku untuk multithread. NodeJS menggunakan konsep single thread, artinya hanya akan ada satu proses yang berjalan sepanjang waktu, berbeda dengan PHP yang berbasis multi-threaded. Misal terdapat empat orang mengunjungi web kita. Dalam PHP, proses ini dibuat empat thread dimana setiap pengunjung dilayani oleh 1 thread khusus. Setiap thread akan diproses dengan sistem antrian seperti sebelumnya. Sedangkan di Node.js, empat pengunjung itu akan di layani oleh 1 thread saja. Thread secara bergantian berpindah dari satu proses ke proses lain tanpa harus menunggu proses yang satu selesai.

Sumber : quora.com

Sanggupkah NodeJS Menggantikan PHP?

Sampai saat ini, kita belum bisa menyimpulkan bahwa NodeJS akan menggantikan PHP. Penggunaan NodeJS dan PHP sangat bergantung pada jenis aplikasi yang akan kita kembangkan. Pada akhirnya yang terjadi antara NodeJS dan PHP bukanlah kompetisi melainkan sinergi. Sebagai contoh, untuk project yang bersifat real-time, NodeJS lebih cocok untuk dipakai. Sebaliknya,  tidak semua hosting mendukung NodeJs, saat itulah kita harus memilih menggunakan PHP.

Selamat bereksplorasi ! #HappyEnjoyneering!

Membuat Unit Testing di PHP dengan PHPUnit

Unit Testing adalah tes terkecil dalam serangkaian test untuk menguji sebuah fungsi atau kelas pada kode kita. Sebenarnya, beberapa tahapan testing dalam pengembangan aplikasi. Lebih lanjut, pengujian meliputi Unit Testing, Integration Test, Acceptance test, Performance Test, dsb. Unit testing memegang peranan penting pengujian ini. Tujuannya agar software yang telah rilis memiliki kualitas yang lebih baik. Untuk alasan ini, biasanya pengembang library selalu menyertakan unit test. Artikel ini akan membahas bagaimana cara membuat unit testing di PHP dengan PHPUnit.

Unit test akan menjadi kompas dalam pengujian (base case, edge case hingga corner case) . Tanpa adanya unit test, proses pengujian akan memakan banyak waktu. Pada perusahaan besar seperti Gojek dan Grab, unit test adalah suatu kewajiban. Tak jarang mereka merekrut tenaga khusus untuk melakukan pengujian software sehingga aplikasi menjadi lebih secure & reliable

Unit Test ini memiliki kemiripan dengan Integration Test. Keduanya menggunakan tools yang sama, hanya saja pada unit test tidak memperkenankan service-service dari luar. Setiap bahasa pemrograman atau framework memiliki tools berbeda untuk melakukan unit testing ini. Di PHP, salah satu tools yang populer untuk pengujian unit testing menggunakan PHPUnit.

Instalasi PHPUnit

Sebelum anda menginstall PHPunit anda harus menginstall composer terlebih dahulu. Composer ini tidak built-in di PHP, karena itu instalasi dilakukan terpisah. Composer merupakan dependency manager pada bahasa pemrograman PHP. File instalasi dan dokumentasi composer tersedia pada website resminya, https://getcomposer.org/. Proses instalasi composer sama seperti software pada umumnya. Kita hanya perlu double klik pada master instalasi kemudian next sampai finish.

Selanjutnya, buat sebuah folder kosong beri nama “belajar-php-unit”. Kemudian jalankan perintah ini pada Terminal atau CMD bagi pengguna OS windows

composer require phpunit/phpunit

Setelah perintah selesai dijalankan, buka folder belajar-php-unit. Dalam folder tersebut akan muncul tiga file baru yakni composer.json, composer.lock & folder vendor. Nah pada tahapan ini kita sudah berhasil menginstall phpunit.

Membuat Class Baru

Pada tutorial ini kita akan mencoba membuat unit-test pada kelas baru bernama class Matematika. Class Matematika ini adalah library yang kita buat dan akan dipakai oleh kita sendiri atau sendiri atau tim. Kita akan membuat unit test terhadap method yang ada pada class matematika ini.

Buat sebuah file bernama Matematika.php kemudian isikan source code berikut

<?php

class Matematika
{

    /**
     * @param integer $bilanganBasic
     * @param integer $bilanganExponen
     * 
     * @return integer
     */
    public static function pangkatBilangan($bilanganBasic, $bilanganExponen)
    {
        $nilaiSekarang = 1;
        for ($i = 1; $i <= $bilanganExponen; $i++) {
            $nilaiSekarang = $nilaiSekarang * $bilanganBasic;
        }
        return $nilaiSekarang;
    }
}

Method ini bertujuan untuk mencari hasil perpangkatan dua bilangan. Dalam method ini terdapat empat case yang mungkin terjadi, yakni:
1. Bilangan basic positif, bilangan exponen positif
2. Bilangan basic negatif, bilangan exponen positif
3. Bilangan basic Positif, exponen negatif
4. Inputan berupa string

Selanjutnya buat file test dengan nama MatematikaTest.php, dengan code seperti berikut:

<?php

use PHPUnit\Framework\TestCase;

require_once "./Matematika.php";

class MatematikaTest extends TestCase
{

    /*
     * Menguji pangkat bilangan positif, positif
     * 
     */

    public function testPositifSemua()
    {
        $hasilPangkat = Matematika::pangkatBilangan(2, 3);
        $this->assertEquals(8, $hasilPangkat);
    }

    /*
     * Menguji pangkat bilangan negatif, positif
     * 
     */
    public function testNegatifPositif()
    {
        $hasilPangkat = Matematika::pangkatBilangan(-3, 2);
        $this->assertEquals(9, $hasilPangkat);
    }

    /*
     * Menguji pangkat bilangan positif, negatif
     * 
     */
    public function testPositifNegatif()
    {

        $hasilPangkat = Matematika::pangkatBilangan(4, -2);
        $this->assertEquals(1 / 16, $hasilPangkat);
    }

    /*
     * Menguji pangkat bilangan input tidak sesuai
     * 
     */
    public function testInputNgawur()
    {

        $hasilPangkat = Matematika::pangkatBilangan("a", 4);
        $this->assertEquals(10, $hasilPangkat);
    }
}

Jalankan unit test dengan command:

vendor/bin/phpunit MatematikaTest.php

Hasil eksekusi unit test ini adalah sebagai berikut

PHPUnit 8.5.8 by Sebastian Bergmann and contributors.

..FE                                                                4 / 4 (100%)

Time: 79 ms, Memory: 4.00 MB

There was 1 error:

1) MatematikaTest::testInputNgawur
A non-numeric value encountered

{FOLDER ANDA}/Matematika.php:16
{FOLDER ANDA}/MatematikaTest.php:52

--

There was 1 failure:

1) MatematikaTest::testPositifNegatif
Failed asserting that 1 matches expected 0.0625.

{FOLDER ANDA}/MatematikaTest.php:42

ERRORS!
Tests: 4, Assertions: 4, Errors: 1, Failures: 1.

Kita melihat dari response tersebut, terdapat 4 test dengan 4 assertions, terdapat 1 error dan 1 failure.
1) MatematikaTest::testInputNgawur
A non-numeric value encountered

Error ini terjadi karena memberi inputan string pada inputan yang seharusnya integer.

Sedangkan 1 Failure terjadi karena hasil yang salah saat melakukan testPositifNegatif. Dalam kasus 2 pangkat -4, seharusnya menghasilkan 0.0625. Ini tidak sesuai dengan kenyataan dari pemanggilan method tersebut yakni 1. Dengan demikian method tersebut gagal untuk case bilangan positif pangkat negatif.

Contoh kasus diatas merupakan contoh kasus sederhana yang sangat lumrah terjadi dalam pengembangan aplikasi.

Meskipun kode yang dibuat sesuai requirement, terdapat case-case yang tidak berjalan pada proses bisnis yang akan terjadi. Itulah dia, cara membuat unit Testing di PHP dengan PHPUnit