Fitur Rahasia Laravel

tutorial laravel

Fitur Rahasia Laravel – Pada kesempatan ini kita akan membahas fitur rahasia pada framework laravel, saya mengatakan fitur rahasia karena hal-hal yang akan saya jabar-kan dibawah ini tidak bisa kita temukan di dokumentasi resminya (https://laravel.com/docs/7.x). Saya sendiri menemukan beberapa fitur ini kebanyakan berdasarkan referensi yang saya baca dari internet, ada cukup banyak kalau kita mau riset. Namun kali ini saya akan coba jabar-kan beberapa fitur rahasia laravel yang sering saya gunakan pada project yang sedang saya kembangkan.

BACA JUGA : https://soft-gain.com/2020/06/20/menyembunyikan-id-pada-url-tutorial-laravel-obfuscation/

1. Mendefinisikan attribute didalam method find()

Sebagian dari kita pasti tidak asing dengan method find() atau findOrFail(), namun tahukan anda kita dapat mendefinisikan attribute tertentu saat menggunakan method ini? Contohnya seperti dibawah ini :

$barangs = model::find($id, ['nama_barang', 'jumlah_barang']);

2. Menduplikat data

Untuk menduplikat data pada laravel, kita dapat menggunakan method replicate() seperti dibawah ini :

$barangs = model::find($id);
$newBarangs = $barangs->replicate(); // proses untuk duplikat data
$newBarangs->save();

3. Memeriksa attribute yang telah diubah

Anda dapat menggunakan method getChanges untuk memeriksa attribute mana saja yang diubah, contohnya seperti ini :

$barangs = model::where('id',$id)->first();
$barangs->nama_barang = $request->nama_barang;
$barangs->jumlah_barang = $request->jumlah_barang;
$barangs->keterangan = $request->keterangan;
$barangs->save();

dd( $barangs->getChanges() );
// contoh output method getChanges()
// array:2 [▼
//   "keterangan" => "keterangan - edit"
//   "updated_at" => "2020-06-30 05:34:48"
// ]

4. Memeriksa model atau attribute yang diubah

Jika hanya hendak memeriksa model atau attribute sudah diubah atau belum bisa menggunakan method isDirty(), contohnya seperti ini :

$barangs = model::where('id',$id)->first();
$barangs->isDirty(); // false
$barangs->nama_barang = $request->nama_barang;
$barangs->jumlah_barang = $request->jumlah_barang;
$barangs->keterangan = $request->keterangan;
$barangs->isDirty(); // true
$barangs->save();

// Atau bisa juga dengan specific attribute
$barangs->isDirty('nama_barang'); // true
$barangs->isDirty('jumlah_barang'); // false

5. Mendapatkan nilai attribute asli yang sudah diubah

Selain bisa mendapatkan dan memeriksa perubahan pada suatu attribute, kita juga bisa mendapatkan kembali nilai asli dari suatu attribute yang sudah kita ubah sebelumnya, contohnya seperti ini :

$barangs = model::where('id',$id)->first();
$barangs->nama_barang = $request->nama_barang;
$barangs->jumlah_barang = $request->jumlah_barang;
$barangs->keterangan = $request->keterangan;
dd( $barangs->getOriginal() );

// contoh output dari method getOriginal()
// array:4 [▼
//   "id" => 7
//   "nama_barang" => "Laptop"
//   "jumlah_barang" => 10
//   "keterangan" => "keterangan - edit"
// ]

6. Model relationship dengan where dan order by statement

Tahukah anda kita bisa menyisipkan beberapa where dan order by statement pada model relasi yang kita buat? Contoh nya seperti dibawah ini :

public function getUpdatedBy(){
     return $this->hasOne(User::class, 'id', 'updated_by')->where('role','admin')->orderBy('email');
}

7. Multiple id parameter pada find() method

Kembali lagi pada find() method, kali ini kita juga bisa mendefinisikan beberapa parameter id sekaligus, contohnya seperti ini :

$barangs = model::find([2,4,6]);

8. Order by data pada relationship

Untuk fitur yang satu ini, kita akan mencoba mengurutkan data berdasarkan model relationship, biasanya konsep ini kita perlukan untuk menampilkan data topik pada suatu blog atau forum berdasarkan post terakhir, contohnya seperti dibawah ini :

// di model tambahkan method latest()
return $this->hasOne(User::class, 'id', 'updated_by')->latest();

// di controller tambahkan method sortByDesc
$barangs = model::with('getUpdatedBy')->get()->sortByDesc('getUpdatedBy.created_at');

9. Multiple where condition

Jika biasanya kita mendefinisikan kondisi where satu persatu, sebetulnya kita bisa mendefinisikan kondisi tersebut sekaligus dalam satu where statement, contohnya seperti ini :

$query->where(['nama' => $nama, 'status' => $status]);

Demikianlah penjabaran fitur-fitur laravel yang saya rasa akan berguna bila kita ketahui, mungkin artikel ini akan terus diupdate point-point nya seiring dengan ditemukannya fitur-fitur menarik lainnya pada laravel, terima kasih.

Cron Job Laravel Windows, Otomatisasi Script Menggunakan Task Scheduler

tutorial laravel

Cron Job Laravel Windows – Pada kali ini kita akan membahas bagaimana cara membuat sebuah cron atau sebuah task scheduling menggunakan laravel di operating system berbasis windows. Sebetulnya hal ini tidak lumrah, karena biasanya aplikasi berbasis laravel akan di host pada os berbasis linux dan untuk otomatisasi task-nya menggunakan scheduler system bawaan linux (konfigurasi-nya menggunakan perintah crontab -e), namun sebagai bahan referensi kali ini kita akan membuat Cron Job Laravel pada OS Windows.

Baca juga cara membuat aplikasi web, web service & aplikasi android :  https://soft-gain.com/2019/10/17/laravel-aplikasi-inventory-barang-berbasis-web/

Goals – Membuat Cron Job Dengan Laravel Pada OS Windows

Pada artikel ini kita akan mencoba membuat dan memahami bagaimana cara men-otomatisasi sebuah task menggunakan laravel pada os windows. Kita akan mempelajari langkah demi langkah pembuatan task dengan laravel (untuk detail-nya bisa dilihat di-dokumentasi resminya : https://laravel.com/docs/7.x/scheduling#scheduling-queued-jobs), dan memanfaatkan fitur task scheduler pada windows sebagai agent untuk menjalankan otomatisasi script.

Materi

Pertama-tama masukan perintah berikut ini untuk membuat sebuah command baru :

php artisan make:command belajarMembuatCron

Maka secara otomatis akan ter-generate sebuah file baru belajarMembuatCron.php didalam folder Console/Commands, buka file tersebut dan isi seperti ini :

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;

class belajarMembuatCron extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'sg:belajar-membuat-cron';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Hanya ingin belajar membuat cron';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        echo 'Cron kita sudah jalan!';
        \Log::info('Cron kita sudah jalan!');
    }
}

Perlu diperhatikan, pada $signature adalah nama command yang akan kita gunakan saat hendak menjalankan perintah, pada $description kita isikan deskripsi task ini dijalankan untuk tujuan apa (penting juga untuk mengisi deskripsi saat kita bekerja secara tim, supaya teman kita tidak bingung command ini berfungsi untuk apa), pada function handle kita isikan script yang hendak di eksekusi saat command ini dijalankan (pada contoh ini kita hanya akan menampilkan pesan saja pada layar command line dan men-print string pada file laravel.log -> dengan perintah \Log::info(), pada case yang lebih serius bagian ini bisa diisikan script yang lebih complex).

Berikutnya ubah file kernel.php menjadi seperti ini :

<?php

namespace App\Console;

use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;

class Kernel extends ConsoleKernel
{
    /**
     * The Artisan commands provided by your application.
     *
     * @var array
     */
    protected $commands = [
        //
    ];

    /**
     * Define the application's command schedule.
     *
     * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
     * @return void
     */
    protected function schedule(Schedule $schedule)
    {
        // $schedule->command('inspire')
        //          ->hourly();
        $schedule->command('sg:belajar-membuat-cron')->everyMinute();
    }

    /**
     * Register the commands for the application.
     *
     * @return void
     */
    protected function commands()
    {
        $this->load(__DIR__.'/Commands');

        require base_path('routes/console.php');
    }
}

Kita akan menambahkan command yang baru saja kita buat pada fungsi schedule, dibagian ini :

$schedule->command('sg:belajar-membuat-cron')->everyMinute(); 

Dimana didalam method command kita mendeklarasikan perintah yang sudah kita buat dalam $signature sebelumnya lalu kita memanggil fungsi ->everyMinute(); yang artinya kita hendak menjalankan perintah ini setiap menit.

Setelah itu coba jalankan perintah yang baru saja kita buat seperti gambag dibawah ini :

tutorial laravel artisan command
Contoh Artisan Command

Jika pada file laravel.log juga ter-print seperti gambar dibawah ini, berarti untuk proses pembuatan perintah menggunakan laravel telah berhasil kita lakukan :

tutorial laravel artisan command
Hasil print \Log::info()

Berikutnya, kita akan mencoba menjalankan perintah diatas secara otomatis dengan memanfaatkan task scheduler pada windows. Pertama-tama kita perlu membuat sebuah batch file yang akan berisi script untuk men-eksekusi perintah php yang sudah kita buat sebelumnya.

Buka notepad biasa dan masukan code dibawah ini :

cd D:\xampp\htdocs\belajar-laravel
D:
php artisan schedule:run

Harap disesuaikan dengan dimana root project Anda disimpan (disini saya menyimpannya didalam d:/xampp/htdocs/belajar-laravel), lalu save file tersebut dengan ekstensi .bat (contoh : laravel-belajar-cron.bat). Untuk men-test file batch yang kita buat sudah benar atau belum tinggal di double click saja batch file yang barusan kita buat dan kita cek file laravel.log kita, jika sudah ter-print pesan sukses artinya kita telah berhasil dalam proses pembuatan batch file.

Selanjutnya kita akan men-kofigurasi task scheduler untuk dapat men-eksekusi batch file yang sudah kita buat sebelumnya, pertama buka task scheduler lalu pada bagian action, pilih create basic task :

Cron Job Laravel Windows
Create Basic Task

Isikan nama dan deskripsi untuk task yang akan kita buat lalu klik next :

Cron Job Laravel Windows
Pilih daily trigger

Pada Bagian diatas, pilih Daily dulu saja lalu klik next :

Cron Job Laravel Windows
Konfigurasi daily task

Pada bagian ini langsung klik next dulu saja :

Cron Job Laravel Windows
Pilih metode action

Pada bagian ini pilih start program karena kita akan menggunakan batch file yang sudah kita buat sebelumnya lalu klik next :

laravel cron task scheduler
Browse batch file

Pada bagian diatas pilih batch file (saya menaruh batch file yang sudah kita buat pada folder project agar mudah ditemukan, pada praktek-nya batch file bisa di taruh dimana saja dengan catatan tidak didalam folder yang membutuhkan permission khusus saat hendak di eksekusi) lalu klik next lalu finish :

Jika berhasil maka task yang baru saja kita buat akan muncul dalam Task scheduler Library :

laravel cron task scheduler
Berhasil dibuat

Silahkan double klik task yang sudah kita buat karena kita akan melakukan sedikit perubahan, dibagian tab general silahkan di check pada bagian Run With Highest Privileges :

laravel cron task scheduler
Run With Highest Privileges

Berikutnya buka pada bagian tab trigger lalu klik edit pada bagian task yang baru kita buat, silahkan disesuaikan dengan gambar dibawah untuk men-eksekusi task setiap satu menit :

laravel cron task scheduler
Run every one minutes

Untuk bagian diatas bisa disesuaikan sesuai kebutuhan mau dijalankan dengan interval seperti apa task yang sudah kita buat, klik ok.

Terakhir kita buka lagi menu Task scheduler Library, klik kanan task yang sudah kita buat lalu pilih run. Jika berhasil maka task yang sudah kita buat sebelumnya akan di-eksekusi setiap satu menit, seperti contoh dibawah ini :

laravel cron task scheduler
Berjalan dengan interval satu menit

Bisa dilihat diatas, pada file laravel.log kita telah berhasil menjalankan cron laravel dengan memanfaatkan task scheduler pada windows dengan interval per satu menit.

Penutup

Kita telah berhasil memanfaatkan task scheduler pada windows untuk menjalankan cron pada laravel, namun lagi ini bukanlah suatu hal yang akan sering kita jumpai, karena lumrahnya laravel itu sendiri di host pada os linux dan kita tinggal men-konfigurasi menggunakan perintah crontab -e untuk menjalankan cron laravel yang sudah kita buat. Mostly sama saja, hanya peran task scheduler yang digantikan oleh system automatic task bawaan linux. Kiranya demikian saja semoga dapat bermanfaat bagi rekan-rekan yang sedang mencari alternatif penggunaan cron laravel pada os windows, terima kasih.

Menyembunyikan Id Pada Url, Tutorial Laravel Obfuscation

tutorial laravel

Menyembunyikan Id Pada Url – Pada kesempatan kali ini kita akan mempraktekan cara pembuatan obfuscation (Menyembunyikan Id Pada Url) menggunakan laravel, artikel ini adalah kelanjutan dari artikel (https://soft-gain.com/2019/10/17/laravel-aplikasi-inventory-barang-berbasis-web/). Sebelum memulai pembahasan kita akan sedikit membahas tentang apa itu obfuscation, obfuscation sendiri adalah bagian dari cryptography, kata obfuscation sendiri berarti bingung atau dikaburkan, yang mana sesuai dengan tujuan peng-obfuscation itu sendiri adalah untuk membuat informasi internal dari aplikasi kita sulit dimengerti. Tutorial laravel obfuscation id ini sendiri dibuat dengan menggunakan
library hasids/hashids (https://hashids.org/).

Sesuai dengan tujuannya untuk meng-kaburkan informasi (informasi yang kita maksud disini adalah id atau primary key table pada database), obfuscation ini dibuat untuk tujuan keamanan data, dimana biasanya kita akan melihat sebuah request yang dikirimkan oleh client pada server dengan integer biasa (https://website.id/product/edit/17), dengan penggunaan library ini maka id dari primary key kita akan dibuat acak menjadi seperti (https://website/product/edit/XclMn), tentu dengan peng-acakan primary key seperti ini user tidak bisa dengan mudah menebak data ini memiliki id berapa, ada berapa banyak kira-kira data yang ada pada table ini, dan juga tidak bisa membuka sembarang data karena user tidak mengetahui string acak seperti apa yang harus dia masukan pada url address bar.

Baiklah langsung saja kita masuk pada pembahasannya, pertama silahkan install librarynya menggunakan perintah ini :

composer require hashids/hashids

Selanjutnya kita akan memanfaatkan file .env untuk menyimpan secret key kita, secret key ini sangat penting karena kita harus memiliki key ini jika hendak mengembalikan id yang sudah diacak menjadi seperti semula. Tambahkan potongan code dibawah ini :

MY_SECRET_SALT_KEY=softgain1234!@#$

Selanjutnya kita akan melakukan sedikit modifikasi pada bagian model, kali ini module yang akan kita jadikan contoh adalah module sg_barang, jadi silahkan buka model sg_barang.php dan tambahkan potongan code dibawah ini :

public function getIdAttribute(){
        $hashids = new \Hashids\Hashids( env('MY_SECRET_SALT_KEY','MySecretSalt') );

        return $hashids->encode($this->attributes['id']);
}

Pada potongan code diatas, bisa dilihat kalau kita memanfaatkan fitur laravel untuk meng-overwrite value dari database (fungsi getIdAttribute) dalam case ini yang kita overwrite adalah value id, didalamnya kita memanggil library hashids yang sudah di install sebelumnya lalu dengan perintah return $hashids->encode($this->attributes[‘id’]); maka id yang akan ditampilkan pada sisi front end adalah id yang sudah di acak stringnya. Kurang lebih seperti inilah contoh url yang sudah dilakukan pengacakan pada attribute id :

Menyembunyikan Id Pada Url
Hasil Obfuscation Id

Selanjutnya kita buka sg_barang controller dan tambahkan potongan source ini :

public function __construct(){
        $this->Hashids = new \Hashids\Hashids( env('MY_SECRET_SALT_KEY','MySecretSalt') );
}

Diatas adalah potongan saat kita memanggil library hashids.

$id = $this->Hashids->decode($id)[0];

Dan diatas adalah contoh saat kita mengembalikan id yang sudah diacak ke bentuk semula.

Dan karena kita juga sudah membuat aplikasi ini berbasis web service (https://soft-gain.com/2020/06/13/tutorial-laravel-membuat-aplikasi-web-service/), jangan lupa juga untuk memodifikasi pada sg_barang controller untuk bagian api controller-nya (sebetulnya, lebih efisien pengembangan dibuat berdasarkan pattern repository, sehingga ketika terjadi perubahan source kita tidak perlu melakukan modifikasi pada dua source seperti ini, namun mempertimbangkan tutorial ini untuk pemula seperti saya, akhirnya saya putuskan untuk membuatnya masing-masing agar lebih mudah dipahami).

Demikianlah pembuatan obfuscation id dengan menggunakan framework laravel, seperti biasa silahkan ambil full source-nya pada repo saya (https://github.com/ImmanuelJL/myinventory.git) gunakan cabang aplikasi-stok-barang, saya sendiri baru belakangan ini mengenal teknik peng-acakan id seperti ini, karena adanya permintaan yang tidak menginginkan mudahnya akses informasi antar sesama pengguna, pengalaman memanglah guru yang paling berharga, terima kasih.

Tutorial Laravel Import Excel ke Database

tutorial laravel

Tutorial Laravel Import Excel – Pada artikel kali ini kita akan membahas tentang import excel ke database menggunakan laravel. Setelah sebelumnya kita mencoba meng-export data dengan laravel (https://soft-gain.com/2020/06/10/tutorial-export-excel-laravel-aplikasi-inventory-part-6/), kali ini kita akan mencoba kebalikannya, yaitu import data dari excel ke database.

Pertama tambahkan baris ini pada file route kita :

Route::post('/barang/import', 'sg_barang@import');

Selanjutnya tambahkan fungsi import pada controller sg_barang :

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\sg_barang as model;
use Excel;
use Auth;

class sg_barang extends Controller
{
    public function index(){
    	$barangs = model::with('getUpdatedBy')->get();

    	return view('barang.table',compact('barangs'));
    }

    public function create(){
    	return view('barang.form');
    }

    public function store(Request $request){
    	model::create($request->all());

    	return redirect('barang');
    }

    public function show(){
    	//
    }

    public function edit($id){
    	$editForm = true;
    	$barangs = model::find($id);

    	return view('barang.form',compact('barangs','editForm'));
    }

    public function update(Request $request, $id){
    	$data = $request->except('_method', '_token');
    	model::where('id',$id)->update($data);

    	return redirect('barang');
    }

    public function destroy($id){
    	model::destroy($id);

    	return redirect('barang');
    }

    public function import(Request $request){ // <--- FUNGSI INI
        Excel::load($request->file('import')->getRealPath(), function ($reader){
            foreach ($reader->toArray() as $key => $row) {
                $data['nama_barang'] = (isset($row['nama_barang']) && $row['nama_barang']!='') ? $row['nama_barang'] : null;
                $data['jumlah_barang'] = (isset($row['jumlah_barang']) && $row['jumlah_barang']!='') ? $row['jumlah_barang'] : null;
                $data['keterangan'] = (isset($row['keterangan']) && $row['keterangan']!='') ? $row['keterangan'] : null;
                $data['updated_by'] = Auth::user()->id;
                model::create($data);
            }
        });

        return redirect('barang');
    }
}

Berikut ini adalah sedikit penjelasan pada fungsi import, pertama request yang dikirim dari client akan di handle oleh fungsi load, lalu dengan memanfaatkan anonymous kita simpan data yang sudah kita terima dari client ke dalam bentuk array dalam variabel $reader. Lalu kita akan melakukan looping pada variabel reader dan kita akan mengambil perbaris data berdasarkan nama pada header kolomnya, perlu diperhatikan penamaan pada kolom header akan diubah menjadi huruf kecil dan karakter spasi akan diganti dengan karakter underscore (contoh : Nama Barang = nama_barang). Lalu hasil looping tadi akan kita simpan pada database dan kita response kita kembalikan pada client.

Lalu tambahkan potongan source code ini pada file sg_barang/table.blade.php :

<a class="btn btn-success toggle-import-form" href="javascript:;">
                            Import from Excel
                        </a>
                        {!! Form::model('', ['url' => url('/barang/import'), 'method' => 'post', 'enctype'=>'multipart/form-data', 'id'=>'import-form']) !!}
                            {{ csrf_field() }}
                            </br>
                            <div class="form-group col-xs-12 col-lg-6">
                                <a class="btn btn-primary" href="{{ url('csv-template/import-template.csv') }}" download>
                                    Download Import Template
                                </a>
                            </div>
                            <div class="form-group col-xs-12 col-lg-12">
                                {{ Form::file('import', ['class' => 'form-control', 'required']) }}
                            </div>
                            <div class="form-group col-xs-12 col-lg-12">
                                <button type="submit" class="btn btn-primary">Submit</button>
                            </div>
{!! Form::close() !!}

Di file ini juga kita akan menambahkan sedikit animasi untuk menampilkan form import (ini di buat hanya untuk mempercantik tampilan saja, tidak ada pengaruhnya dengan fungsi import itu sendiri). Kita akan menambahkan potongan source ini pada bagian paling bawah dari file :

@push('scripts')
    <script type="text/javascript">
        $(document).ready(function() {
            $('#import-form').hide();

            $('.toggle-import-form').click(function(){
                $('#import-form').slideToggle();
            });
        });
    </script>
@endpush

Lalu pada file layouts/app.blade.php kita tambahkan potongan source code ini di bagian paling akhir setelah semua tag javascript di deklarasikan :

@stack('scripts')

Penggunaan dari @push dan @stack ini sendiri adalah untuk menempatkan beberapa blok konten dari script yang kita deklarasikan di dalam @push ke dalam bagian dimana @stack kita deklarasikan. Sebagai contoh pada file table.blade.php kita bisa menggunakan beberapa perintah jquery tanpa harus mendeklarasikan jquery pada file tersebut, hal itu bisa kita lakukan karena kita menaruh perintah jquery itu di dalam @push lalu @stack pada file app.blade.php kita tempatkan persis dibawah setelah library jquery kita deklarasikan.

Terakhir kita juga akan menambahkan sebuah folder baru dengan nama csv-template, yang di dalamnya akan kita taruh file csv yang akan kita gunakan sebagai template untuk import data (root-project/public/csv-template/import-template.csv). Dan seperti ini lah kurang lebih tampilan form untuk import excel yang sudah di buat :

Tutorial Laravel Import Excel
Import Excel

Untuk full source-nya seperti biasa bisa di ambil dari repo saya (https://github.com/ImmanuelJL/belajar-laravel), silahkan di ambil dari cabang aplikasi-stok-barang. Terima kasih.

Tutorial Laravel, Membuat Aplikasi Web Service

tutorial laravel

Tutorial laravel kali ini adalah kelanjutan dari tutorial sebelumnya yang mana kita sudah mencoba untuk menggunakan passport sebagai otentikasi user (https://soft-gain.com/2020/06/12/tutorial-laravel-rest-api-menggunakan-otentikasi-passport/), dimana kali ini kita akan mencoba membuat web service untuk aplikasi inventory yang sedang kita coba kembangkan. Langsung saja kita masuk ke dalam pembahasan pada artikel tutorial laravel, membuat aplikasi web service.

Pertama-tama kita akan membuat controller baru khusus untuk web service yang akan kita buat ini, controller yang akan kita buat adalah sg_transaksi, sg_barang dan sg_user, controller ini akan kita taruh di dalam folder baru bernama Api. Dan untuk testing tools nya kita akan gunakan postman, kalau belum ada silahkan di install terlebih dahulu postman-nya. Lalu silahkan ketik perintah berikut ini untuk meng-generate controller :

php artisan make:controller Api/sg_transaksi
php artisan make:controller Api/sg_barang
php artisan make:controller Api/sg_user

Isi dari sg_transaksi controller kurang lebih seperti ini :

<?php

namespace App\Http\Controllers\Api;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\sg_transaksi as model;
use App\sg_barang;
use Auth;

class sg_transaksi extends Controller
{
    public function index(){
    	$data = model::with('getNamaBarang','getCreatedBy','getUpdatedBy')->orderBy('id','desc')->get();
    	$success['data'] =  $data;
        
        return response()->json(['success' => $success], 200);
    }

    public function store(Request $request){
    	$validatedData = $request->validate([
	        'id_barang' => 'required|max:255',
	        'jenis_transaksi' => 'required',
	        'jumlah_barang' => 'required',
	    ]);

	    $request['created_by'] = Auth::user()->id;

    	model::create($request->all());

    	$this->trx = new \App\Http\Controllers\sg_transaksi;
    	$this->trx->updateSgBarang($request);

    	return response()->json(['success' => true], 200);
    }

    public function edit($id){
    	$data = model::find($id);
    	$success['data'] =  $data;
        
        return response()->json(['success' => $success], 200);
    }

    public function update(Request $request, $id){
    	$validatedData = $request->validate([
	        'id_barang' => 'required|max:255',
	        'jenis_transaksi' => 'required',
	        'jumlah_barang' => 'required',
	    ]);

	    $request['updated_by'] = Auth::user()->id;

	    $this->trx = new \App\Http\Controllers\sg_transaksi;
    	$this->trx->updateSgBarang($request, $id);

    	$data = $request->except('_method', '_token');
    	model::where('id',$id)->update($data);

    	return response()->json(['success' => true], 200);
    }

    public function delete($id){
    	$value = model::where('id',$id);
    	$sg_barang = sg_barang::where('id',$value->value('id_barang'));

        if( $value->first()->jenis_transaksi == 'Masuk' ){
            $sg_barang->update(["jumlah_barang"=>(int) $sg_barang->value('jumlah_barang') - (int) $value->first()->jumlah_barang]);
        }elseif( $value->first()->jenis_transaksi == 'Keluar' ){
            $sg_barang->update(["jumlah_barang"=>(int) $sg_barang->value('jumlah_barang') + (int) $value->first()->jumlah_barang]);
        }
    	model::destroy($id);
        
        return response()->json(['success' => true], 200);
    }
}

Untuk sg_barang controller seperti ini :

<?php

namespace App\Http\Controllers\Api;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\sg_barang as model;
use Auth;

class sg_barang extends Controller
{
    public function index(){
    	$data = model::with('getUpdatedBy')->get();
    	$success['data'] =  $data;
        
        return response()->json(['success' => $success], 200);
    }

    public function store(Request $request){
    	$validatedData = $request->validate([
	        'nama_barang' => 'required|max:255',
	        'jumlah_barang' => 'required',
	    ]);

	    $request['updated_by'] = Auth::user()->id;

    	model::create($request->all());

    	return response()->json(['success' => true], 200);
    }

    public function edit($id){
    	$data = model::find($id);
    	$success['data'] =  $data;
        
        return response()->json(['success' => $success], 200);
    }

    public function update(Request $request, $id){
    	$validatedData = $request->validate([
	        'nama_barang' => 'required|max:255',
	        'jumlah_barang' => 'required',
	    ]);

	    $request['updated_by'] = Auth::user()->id;

    	$data = $request->except('_method', '_token');
    	model::where('id',$id)->update($data);

    	return response()->json(['success' => true], 200);
    }

    public function delete($id){
    	model::destroy($id);
        
        return response()->json(['success' => true], 200);
    }
}

Untuk sg_user controller seperti ini :

<?php

namespace App\Http\Controllers\Api;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Hash;
use App\User as model;
use Auth;

class sg_user extends Controller
{
    public function index(){
    	$data = model::all();
    	$success['data'] =  $data;
        
        return response()->json(['success' => $success], 200);
    }

    public function store(Request $request){
    	$validatedData = $request->validate([
	        'name' => 'required|max:255',
	        'email' => 'email',
		    'password' => 'required|confirmed|min:6',
		    'role' => 'required',
	    ]);

    	model::create([
            'name' => $request->name,
            'email' => $request->email,
            'password' => Hash::make($request->password),
            'role' => $request->role,
        ]);

    	return response()->json(['success' => true], 200);
    }

    public function edit($id){
    	$data = model::find($id);
    	$success['data'] =  $data;
        
        return response()->json(['success' => $success], 200);
    }

    public function update(Request $request, $id){

    	if(isset($request->password) && isset($request->password_confirmation) && $request->password !== '' && $request->password_confirmation !== ''){
    		$validatedData = $request->validate([
		        'name' => 'required|max:255',
		        'email' => 'email',
			    'password' => 'required|confirmed|min:6',
			    'role' => 'required',
		    ]);
    	}else{
    		$validatedData = $request->validate([
		        'name' => 'required|max:255',
		        'email' => 'email',
			    'role' => 'required',
		    ]);
    	}

    	$data = $request->except('_method', '_token', 'password_confirmation');

    	if(isset($request->password) && isset($request->password_confirmation) && $request->password !== '' && $request->password_confirmation !== ''){
    		model::where('id',$id)->update([
	            'name' => $request->name,
	            'email' => $request->email,
	            'password' => Hash::make($request->password),
	            'role' => $request->role,
	        ]);
    	}else{
    		model::where('id',$id)->update([
	            'name' => $request->name,
	            'email' => $request->email,
	            'role' => $request->role,
	        ]);
    	}

    	return response()->json(['success' => true], 200);
    }

    public function delete($id){
    	model::destroy($id);
        
        return response()->json(['success' => true], 200);
    }
}

Terakhir kita akan tambah kan route nya pada api.php, kurang lebih jadi seperti ini :

<?php

use Illuminate\Http\Request;

/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| is assigned the "api" middleware group. Enjoy building your API!
|
*/

Route::post('login', 'Api\AuthController@login');

Route::group(['middleware' => 'auth:api'], function(){
    Route::post('barang', 'Api\sg_barang@index');
    Route::put('barang/store', 'Api\sg_barang@store');
    Route::post('barang/edit/{id}', 'Api\sg_barang@edit');
    Route::post('barang/update/{id}', 'Api\sg_barang@update');
    Route::delete('barang/delete/{id}', 'Api\sg_barang@delete');

    Route::post('transaksi', 'Api\sg_transaksi@index');
    Route::put('transaksi/store', 'Api\sg_transaksi@store');
    Route::post('transaksi/edit/{id}', 'Api\sg_transaksi@edit');
    Route::post('transaksi/update/{id}', 'Api\sg_transaksi@update');
    Route::delete('transaksi/delete/{id}', 'Api\sg_transaksi@delete');

    Route::group(['prefix' => '', 'middleware' => ['role']], function() {
	    Route::post('user', 'Api\sg_user@index');
	    Route::put('user/store', 'Api\sg_user@store');
	    Route::post('user/edit/{id}', 'Api\sg_user@edit');
	    Route::post('user/update/{id}', 'Api\sg_user@update');
	    Route::delete('user/delete/{id}', 'Api\sg_user@delete');
	});
});

Kita akan mencoba membahas beberapa perbedaan pada controller api ini dan non api. Pertama, return yang di kembalikan ke pada user atau client adalah berbentuk objek, dimana kali ini kita menggunakan json. Json sendiri adalah singkatan dari JavaScript Object Notation, bisa di artikan sebagai standarisasi format pertukaran data untuk memungkinkan terjadinya komunikasi antara mesin. Contoh yang kita implementasikan adalah seperti ini :

return response()->json(['success' => $success], 200);

Lalu untuk fungsi store dan update, di kita akan memanfaatkan fitur validasi bawaan dari laravel (https://laravel.com/docs/7.x/validation), dimana jika validasi yang kita terapkan ternyata tidak sesuai dengan data yang di kirimkan client, maka return nya akan di kembalikan dalam bentuk json pada client berikut dengan pesan error pada validasinya. Contohnya adalah pada bagian ini :

$validatedData = $request->validate([
    'nama_barang' => 'required|max:255',
    'jumlah_barang' => 'required',
]);

Sisanya, hampir tidak ada perbedaan antara controller api dan non api. Berikutnya kita akan coba melakukan pengujian menggunakan postman, silahkan di perhatikan gambar di bawah ini :

Index

Silahkan perhatikan bagian-bagian yang sudah saya highlight dengan warna merah, pertama silahkan di sesuaikan url yang akan di hit dengan postman dan juga sesuaikan http request method-nya. Lalu pindahkan pada bagian Headers dan isi kan sesuai parameter pada gambar, yang perlu menjadi perhatian adalah pada bagain Authorization, value nya harus di sesuaikan dengan token yang kita dapat ketika kita berhasil login, untuk detail lengkapnya silahkan baca kembali tutorial sebelumnya (https://soft-gain.com/2020/06/12/tutorial-laravel-rest-api-menggunakan-otentikasi-passport/), contoh pada aplikasi kita adalah :

Bearer token_string

Dan jika semua sudah terisi tinggal tekan send, jika menerima hasil seperti gambar di atas maka bisa di asumsikan kita telah berhasil membuat web service. Selanjutnya untuk store, edit, update dan delete juga hampir sama, hanya saja pada store dan update kita perlu mengisikan parameter pada tab body kurang lebih seperti ini :

Store

Demikian lah pembahasan kita pada kali ini, source full nya bisa di ambil di repo saya seperti biasa (https://github.com/ImmanuelJL/belajar-laravel), silahkan di ambil dari cabang aplikasi-stok-barang. Untuk postman collection nya bisa di download di sini (https://drive.google.com/file/d/1KlDQc62pYC9p0b27gnMn7gGTCkzceQ-0/view?usp=sharing), tinggal di download saja dan di import pada postman supaya bisa dapat semua collection request yang kita gunakan pada tutorial ini. Terima kasih.

Tutorial Laravel Api Passport, Otentikasi User Pada REST API

tutorial laravel

Pada kesempatan ini kita akan membahas tentang tutorial laravel rest api menggunakan passport sebagai otentikasi user. Apa itu rest api? rest api atau api atau restful api atau web service secara garis besar sama saja, merupakan state transfer protokol berbasis http, dan passport itu sendiri adalah otentikasi api default dari laravel yang di buat berdasarkan library League OAuth2 Server, jadi sebenarnya tidak menggunakan passport dan langsung menggunakan library oauth2 pun sah-sah saja. Baiklah tanpa berbasa-basi lagi, langsung saja kita masuk pada pembahasan Tutorial Laravel REST API, Menggunakan Otentikasi Passport.

By the way, artikel ini adalah kelanjutan dari artikel (https://soft-gain.com/2020/06/10/tutorial-export-excel-laravel-aplikasi-inventory-part-6/), dimana kita akan coba kembangkan aplikasi yang sudah kita buat sebelumnya menjadi serbuah web service.

Pertama-tama kita install terlebih dahulu library laravel/passport pada aplikasi kita, saya di sini menggunakan passport versi 7.5.1 karena latest version-nya sudah tidak support dengan versi laravel yang saya gunakan (laravel 5.8). Ketikan perintah ini pada terminal :

composer require laravel/passport:7.5.1

Lalu kita lakukan migasi untuk mendapatkan table yang akan kita gunakan untuk menampung token, gunakan perintah berikut ini :

php artisan migrate

Selanjutnya ketikan perintah ini :

php artisan passport:install

Mengacu pada dokumentasi resmi (https://laravel.com/docs/7.x/passport), perintah ini akan meng-generate keys yang akan kita gunakan untuk membuat access token nantinya, baik itu personal access ataupun password grant. Apa bedanya? personal access biasa di gunakan untuk 3rd party aplication yang hendak mengakses data dari server kita tanpa harus memasukan credentials user (dengan alasan security), jadi pengguna mempunyai access token masing-masing tanpa harus mengetahui credentials user. Sedangkan password grant biasa di gunakan oleh first party client (seperti pengembangan aplikasi berbasis andriod) karena pengguna memiliki credentials user yang valid, sumber (https://stackoverflow.com/questions/54275082/what-are-the-main-difference-between-personal-access-client-and-password-client).

Selanjutnya kita akan merubah sedikit model user, kurang lebih jadi seperti ini :

<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Laravel\Passport\HasApiTokens;

class User extends Authenticatable
{
    use HasApiTokens, Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password', 'role',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];

    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];
}

Berikutnya kita akan merubah AuthServiceProvider.php, kurang lebih jadi seperti ini :

<?php

namespace App\Providers;

use Illuminate\Support\Facades\Gate;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
use Laravel\Passport\Passport;

class AuthServiceProvider extends ServiceProvider
{
    /**
     * The policy mappings for the application.
     *
     * @var array
     */
    protected $policies = [
        // 'App\Model' => 'App\Policies\ModelPolicy',
    ];

    /**
     * Register any authentication / authorization services.
     *
     * @return void
     */
    public function boot()
    {
        $this->registerPolicies();
        Passport::routes();
        //
    }
}

Penambahan Passport::routes(); di atas menjadi penting, karena dengan method ini lah kita akan mendaftar kan routes yang akan di gunakan untuk meng-generate atau revoke access token.

Berikutnya kita akan merubah file config/auth.php, ubah pada bagian guards menjadi seperti ini :

'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],

        'api' => [
            'driver' => 'passport',
            'provider' => 'users',
            // 'hash' => false,
        ],
],

Berikutnya kita akan menambahkan router yang hendak kita gunakan untuk meng-handle request api yang masuk pada aplikasi kita. Di laravel versi 5.8 ini sudah di pisahkan route khusus untuk api, jadi tinggal buka saja file api.php dan isi tambahkan baris ini :

Route::post('login', 'Api\AuthController@login');

Selanjutnya kita akan membuat controller, masukan perintah berikut ini pada terminal :

php artisan make:controller Api/AuthController

Kita akan membuat controller dalam folder Api, jadi controller api kita akan pisahkan dengan controller untuk handle request non-api. Tambahkan fungsi login sehingga menjadi seperti ini :

<?php

namespace App\Http\Controllers\Api;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\User;
use Illuminate\Support\Facades\Auth;

class AuthController extends Controller
{
	public function login(){
        if(Auth::attempt(['email' => request('email'), 'password' => request('password')])){
            $user = Auth::user();
            $success['token'] =  $user->createToken('myinventory')->accessToken;

            return response()->json(['success' => $success], 200);
        }
        else{
            return response()->json(['error'=>'Unauthorised'], 401);
        }
    }
}

Jika sudah selesai tinggal kita test menggunakan postman, postman ini adalah tools gratis yang bisa kita gunakan untuk testing / develop web service. Masukan parameter dan url seperti gambar di bawah ini :

Login API

Jika kita mendapatkan response sukses maka kita telah berhasil membuat dan mengimplementasikan laravel passport sebagai otentikasi api kita. Token yang kita dapat ini lah yang akan kita gunakan sebagai validasi apakah pengguna berhak mengakses resource dari server kita atau tidak. Demikian, terima kasih.

Tutorial Export Excel Laravel, Aplikasi Inventory Part 6

tutorial laravel

Melanjutkan artikel sebelumnya (https://soft-gain.com/2020/06/07/kirim-email-menggunakan-laravel-dan-smtp-gmail/), berikut ini adalah tutorial export excel menggunakan laravel. Untuk bisa export atau import data dalam bentuk excel dengan laravel, kita akan menggunakan library laravel-excel/maatwebsite (https://github.com/Maatwebsite/Laravel-Excel).

Pertama-tama kita akan install terlebih dahulu library yang akan kita gunakan untuk meng-export data dari database ke dalam bentuk excel. Ketikan perintah berikut ini :

composer require "maatwebsite/excel:~2.1.0" 

NOTE : kita akan menggunakan versi 2.1, karena di latest version ada fungsi yang hendak kita pakai namun sudah tidak bisa di gunakan.

Selanjutnya kita tambahkan baris ini pada router kita :

Route::get('/transaksi/export', 'sg_transaksi@export');

Selanjutnya kita akan menambahkan fungsi ini pada controller sg_transaksi.php :

public function export(){
        $data = DB::table('sg_transaksi')->select('sg_barang.nama_barang','sg_transaksi.jenis_transaksi','sg_transaksi.jumlah_barang','a.name as created_by','b.name as updated_by','sg_transaksi.updated_at')->join('sg_barang','sg_barang.id','=','sg_transaksi.id_barang')->join('users as a','a.id','=','sg_transaksi.created_by')->leftJoin('users as b','b.id','=','sg_transaksi.updated_by')->get()->toArray();
        $data_array[] = array('Nama Barang', 'Jenis Transaksi', 'Jumlah Transaksi', 'Dibuat Oleh', 'Terakhir Ubah', 'Tanggal');

        foreach($data as $trx)
        {
            $data_array[] = array(
                'Nama Barang'  => $trx->nama_barang,
                'Jenis Transaksi'   => $trx->jenis_transaksi,
                'Jumlah Transaksi'    => $trx->jumlah_barang,
                'Dibuat Oleh'  => $trx->created_by,
                'Terakhir Ubah'   => $trx->updated_by,
                'Tanggal'   => date('d M Y',strtotime($trx->updated_at))
            );
        }

        Excel::create('export-to-excel', function($excel) use ($data_array) {
            $excel->setTitle('Transaksi Data');
            $excel->sheet('Transaksi Data', function($sheet) use ($data_array){
                $sheet->fromArray($data_array, null, 'A1', false, false);
            });
        })->export('csv');
    }

Jangan lupa juga untuk menambahkan library yang sudah kita install tadi :

use Excel;
use DB; // YANG INI SAYA TAMBAHKAN KARENA QUERY EXPORT SAYA TIDAK MENGGUNAKAN ELOQUENT TETAPI MENGGUNAKAN DB STATEMENT

Secara sederhana, fungsi export hanya berisi query dari table transaksi yang hasilnya kita jadikan array lalu kita memanggil fungsi create dari library excel (maatwebsite/laravel-excel) yang mana hasilnya kita kembalikan ke client dalam bentuk file. Saya akan mencoba menjabarkannya satu persatu.

Pada bagian ini kita akan meng-query data pada table transaksi, barang dan user :

$data = DB::table('sg_transaksi')->select('sg_barang.nama_barang','sg_transaksi.jenis_transaksi','sg_transaksi.jumlah_barang','a.name as created_by','b.name as updated_by','sg_transaksi.updated_at')->join('sg_barang','sg_barang.id','=','sg_transaksi.id_barang')->join('users as a','a.id','=','sg_transaksi.created_by')->leftJoin('users as b','b.id','=','sg_transaksi.updated_by')->get()->toArray();

Pada bagian ini kita memasukan array ke dalam variable data_array, array ini lah yang akan kita gunakan sebagai header dari data yang akan kita export :

$data_array[] = array('Nama Barang', 'Jenis Transaksi', 'Jumlah Transaksi', 'Dibuat Oleh', 'Terakhir Ubah', 'Tanggal');

Berikutnya kita masukan data hasil query kita sebelumnya ke dalam variable data_array :

foreach($data as $trx)
        {
            $data_array[] = array(
                'Nama Barang'  => $trx->nama_barang,
                'Jenis Transaksi'   => $trx->jenis_transaksi,
                'Jumlah Transaksi'    => $trx->jumlah_barang,
                'Dibuat Oleh'  => $trx->created_by,
                'Terakhir Ubah'   => $trx->updated_by,
                'Tanggal'   => date('d M Y',strtotime($trx->updated_at))
            );
        }

Terakhir kita panggil fungsi dari library laravel-excel dan kita buat file nya dalam bentuk csv :

Excel::create('export-to-excel', function($excel) use ($data_array) {
            $excel->setTitle('Transaksi Data');
            $excel->sheet('Transaksi Data', function($sheet) use ($data_array){
                $sheet->fromArray($data_array, null, 'A1', false, false);
            });
        })->export('csv');

Lalu terakhir kita tambahkan code berikut ini pada file table.blade.php pada folder view transaksi :

<a class="btn btn-success" href="{{ url('transaksi/export') }}">
   Export to Excel
</a>

Demikian lah tutorial export excel menggunakan laravel, seperti biasa full source nya bisa di ambil di repo saya (https://github.com/ImmanuelJL/belajar-laravel), cabang aplikasi-stok-barang (https://github.com/ImmanuelJL/belajar-laravel/tree/aplikasi-stok-barang). Terima kasih.

Belajar Konfigurasi Laravel, Penjelasan File .env

tutorial laravel

Belajar konfigurasi framework laravel – Pada kesempatan ini kita akan membahas / belajar bagaimana konfigurasi pada laravel. Laravel sendiri sudah menyiapkan konfigurasi nya pada satu file yaitu file .env, yang mana fitur ini di buat berdasarkan library dotenv (https://github.com/vlucas/phpdotenv). Membiasakan diri menggunakan enviromental configuration ini sendiri adalah hal yang baik menurut saya, selain memudahkan memang sebaiknya kita tidak menaruh credentials yang sifatnya sensitif langsung ke dalam source code.

File .env ini sendiri akan secara otomatis tergenerate ketika kita berhasil menginstall laravel pada komputer kita, untuk detail installasi laravel bisa di lihat di sini (https://soft-gain.com/2019/03/07/cara-install-laravel-5-pada-windows-xampp/). Tampilah default dari file .env kurang lebih seperti ini :

APP_ENV=local
APP_DEBUG=true
APP_KEY=SomeRandomString
APP_URL=http://localhost

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret

CACHE_DRIVER=file
SESSION_DRIVER=file
QUEUE_DRIVER=sync

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

MAIL_DRIVER=smtp
MAIL_HOST=mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null

Bisa di lihat di atas terdapat informasi credentials database, credentials pada email server, debug aplikasi dan lain-lain. Sebetulnya, secara keseluruhan konfigurasi laravel sendiri di simpan di salam folder config, dan di dalamnya di pisah-pisah lagi ke dalam bentuk file seperti database.php, app.php dan lain-lain. Untuk memudahkan di buat lah satu file ini yaitu .env, karena dengan adanya file ini kita hanya perlu membuka satu file ini saja tanpa merubah isi dari file yang ada di dalam folder config.

Kita sendiri juga bisa saja menambahkan variabel environment kita sendiri apabila di perlukan. Contoh, saya hendak menambahkan slug untuk url ke halaman admin, maka saya tambahkan baris ini pada file env :

ADMIN_PAGE=halaman-rahasia

Dan untuk memanggil nya bisa di gunakan perintah di bawah ini :

env('ADMIN_PAGE', 'default-value'); // ARGUMENT KE DUA BISA DI ISI KAN DEFAULT VALUE APABILA TERNYATA VARIABLE YANG DI MINTA TIDAK ADA PADA FILE .env

Perlu menjadi catatan juga untuk penulisan variable dalam file .env tidak boleh memakai spasi, namun apabila memaksakan untuk memakai spasi bisa dengan menambahkan tanda double quote dalam value nya. Contoh :

INGIN_PAKAI_SPASI="boleh tapi harus begini"

Di awal saya memakai laravel, saya juga sempat bertanya mengapa harus ribet-ribet pakai enviromental file? kenapa tidak langsung saja taruh di source code nya? Tapi setelah saya mencoba memakai, saya justru merasa memang benar cara ini lebih efektif. Saya membayangkan saya bekerja bersama si A, si B dan si C, jika konfigurasi nya di taruh langsung ke dalam source code, maka otomatis saat saya membutuhkan perubahan yang sudah di kerjakan si A, saya juga otomatis akan mendapatkan konfigurasi yang ada pada mesin si A. Saya harus manual merubah nya lagi satu persatu agar sesuai dengan mesin saya, barulah saya mulai bekerja. Begitupun kalau si B butuh source dari si A dan si C, bisa di bayangkan tercampur-campur seperti apa file configurasi yang di terima si B (dalam ilustrasi ini kami bekerja menggunakan GIT misalnya).

Jadi kesimpulannya, file konfigurasi ini memang sangat membantu, bahkan karena saya mengenal konsep enviromental configuration ini saya jadi terbiasa meng-aplikasikannya pada project-project lain walaupun project itu tidak saya kerjakan menggunakan laravel. Terima kasih.

Design Website Dengan Bootstrap, Aplikasi Inventory Part 4

tutorial laravel

Artikel cara design website dengan bootstrap ini merupakan kelanjutan dari artikel sebelumya (https://soft-gain.com/2020/05/30/tutorial-laravel-menggunakan-seeder-aplikasi-inventory-part-3/). Pada kesempatan kali ini kita akan coba menggunakan tempate binary admin (https://www.free-css.com/free-css-templates/page204/binary-admin) yang design website nya menggunakan bootstrap, template ini bisa kita dapatkan dengan gratis, saya memilih menggunakan template ini karena design nya yang simple dan mudah di aplikasikan menurut saya. Terlebih lagi template ini sudah mengusung tema responsive jadi kita tidak perlu repot lagi membuat versi mobile nya.

Tamplate ini juga menggunakan bootstrap, apa itu bootstrap? bootstrap adalah sebuah library CSS yang biasa di gunakan oleh front end developer untuk mempermudah pengerjaan di sisi front end / tampilan. Mengapa bisa memudahkan? karena dengan menggunakan bootstrap, developer tinggal memanggil kelas yang sudah di sediakan, seperti ingin membuat tombol, menu navigasi, table dan lain-lain. Bootstrap sendiri dengan konsep 12 grid column nya sudah mendukung untuk pembuatan website yang responsive. Untuk lebih detail nya bisa di lihat di official website nya (https://getbootstrap.com/).

Berikut ini adalah contoh penerapan template binary admin pada apikasi yang sudah kita buat sebelumnya :

Design Website Dengan Bootstrap
Halaman Login
Design Website Dengan Bootstrap
Halaman Table Barang
Design Website Dengan Bootstrap
Halaman Form Barang

Sebenarnya masih banyak sekali komponen yang saya temukan dalam pembuatan tampilan dengan template ini, di dalam nya ia juga menggunakan jquery sebagai library pengganti Js native, menggunakan font-awesome sebagai tool-kit pembuatan icon dan lain-lain.

Pada artikel kali ini saya tidak akan terlalu panjang lebar karena saya hanya memindahkan template yang sudah ada ke dalam projek yang sedang di kembangkan. Mungkin jika ada kesempatan saya akan membahas secara khusus bagaimana kebiasaan dan pengalaman saya dalam menggunakan bootstrap. Untuk full source nya seperti biasa bisa di ambil dari repo saya (https://github.com/ImmanuelJL/belajar-laravel), ambil dari cabang aplikasi stok barang. Terima kasih.