Kumpulan trik berbahasa indonesia untuk menggunakan framework laravel.
Berisi: 19 trik.
Terakhir diupdate 04 Oktober 2021
Kirimkan pull request
untuk memberikan manfaat lebih banyak !
inspired by: LaravelDaily
- DB Models dan Eloquent (7 trik).
- Perintah
artisan
(1 trik). - Package (6 trik).
- Templating (1 trik).
- Basis Data (Database) (1 trik).
- Middleware(1 trik).
- Routing (1 trik).
- Lain - lain (1 trik).
⬆️ Ke Atas ➡️ Berikutnya (Perintah artisan
)
-
Cara mengubah format output
created_at
danupdated_at
lewat model -
Cara Mengubah format text
created_at
danupdated_at
menjaditgl_dibuat
dantgl_diupdate
lewat model -
Cara otomatis mengisi kolom created_at dan updated_at pada tabel pivot
-
Cara membuat
fillable
di seluruh fieldnya pada model dengan mudah
- created_at
Untuk mengubah format created_at
, tambahkan method berikut di dalam model:
public function getCreatedAtFormattedAttribute()
{
return $this->created_at->format('H:i d, M Y');
}
Method ini bisa digunakan dengan cara seperti ini : $entry->created_at_formatted
.
Dan akan menampilkan hasil seperti ini: 04:19 23, Aug 2020
.
- updated_at
Untuk mengubah format updated_at
, tambahkan method berikut di dalam model:
public function getUpdatedAtFormattedAttribute()
{
return $this->updated_at->format('H:i d, M Y');
}
Method ini bisa digunakan dengan cara seperti ini : $entry->updated_at_formatted
.
Dan akan menampilkan hasil seperti ini: 04:19 23, Aug 2020
.
Caranya sangat mudah
- created_at
Untuk created_at cukup menambahkan :
const CREATED_AT = 'tgl_dibuat';
- updated_at
dan untuk updated_at cukup menambahkan:
const UPDATED_AT = 'tgl_diupdate';
- where
Misalnya kita punya table users
dengan kolom id
, nama
dan kita mau menampilkan data users
yang id
nya 1, biasanya kita menuliskannya seperti ini:
$users = User::where('id', 1)->get();
atau kita mau menampilkan data berdasarkan nama
:
$users = User::where('nama', 'namauser')->get();
dan kita juga bisa menampilkan data berdasarkan id
dan nama
:
$users = User::where(['id'=> 1, 'nama' => 'namauser'])->get();
- whereKolom
Sebenarnya kita juga bisa menuliskannya seperti ini:
$users = User::whereId(1)->get();
atau:
$users = User::whereNama('namauser')->get();
dan:
$users = User::whereIdAndNama(1, 'namauser')->get();
- whereIn
Sintaks whereIn
:
whereIn(Coulumn_name, Array);
Contoh Penggunaan whereIn
User::whereIn('id', [1, 2, 3])->get();
permintaan di atas mencari id
yang valuenya 1
,2
,dan 3
.
- whereNotIn
Sintaks whereNotIn
:
whereNotIn(Coulumn_name, Array);
Contoh Penggunaan whereNotIn
User::whereNotIn('id', [1, 2, 3])->get();
permintaan di atas mencari id
yang valuenya bukan 1
,2
,dan 3
.
Sebelumnya, jika kita ingin mengisi tabel pivot. Kita bisa menggunakan method sync()
seperti contoh dibawah ini:
public function store() {
...
$user->roles()->sync([1, 2, 3]);
...
}
dengan cara diatas, hanya akan mengisi kolom user_id
dan role_id
pada tabel role_user
. Jika kita ingin menggunakan created_at
dan updated_at
pada tabel pivotnya yaitu role_user
, maka kita perlu menambahkan method ->withTimestamps()
pada relasi model User.php
seperti di bawah ini:
public function role()
{
return $this->belongsToMany(Role::class)->withTimestamps();
}
Misal anda mempunyai model User
lalu anda ingin mengambil data user dengan role 'admin' atau 'member'. Kita bisa saja menulis seperti ini
User::where('role', 'admin')->get();
User::where('role', 'member')->get();
Dengan QueryScope, penulisan where diatas akan lebih mudah dibaca oleh kita sebagai developer.
Pada model User, tambahkan fungsi seperti ini:
public function scopeIsAdmin($query) {
return $query->where('role', 'admin');
}
public function scopeIsMember($query) {
return $query->where('role', 'member');
}
Kita membuat fungsi diatas harus dengan prefix (awalan) "scope" lalu sisanya kita beri nama fungsi bebas dengan format sisanya 'PascalCase'
Lalu kita tinggal panggil seperti ini
User::isAdmin()->get();
User::isMember()->get();
Perlu diingat untuk pemanggilan fungsinya menggunaka format 'camelCase'.
Atau lebih kerennya kita bisa membuat queryscopenya dinamis.
public function scopeRole($query, $role) {
return $query->where('role', $role);
}
// Pemanggilan
User::role('admin')->get();
// Atau
User::role('member')->get();
Seperti kita tau, jika kita ingin menambahkan data baru menggunakan create
di eloquent, kita harus mendeklarasikan terlebih dahulu field apa saja yang dapat diisi data pada array $fillable
di modelnya. Jika kita ingin menambahkan property fillable
ke model, kita dapat menambahkan field dari table kita ke dalam array fillable di modelnya, seperti berikut:
protected $fillable = [
'nama', 'email', 'password', 'alamat', 'hobi'
];
Sebenarnya tidak ada masalah terhadap kode di atas, namun jika field dari tabelnya banyak dan kita memiliki kebutuhan untuk fieldnya dapat diisi semua, maka kita harus memasukkan seluruh fieldnya ke dalam array $fillable
dan itu membuat kode menjadi banyak dan tentunya tidak efektif, karena apa? Jika kita menambahkan field baru, kita harus menambahkan field baru tersebut ke dalam array $fillable
lagi.
Jadi untuk memangkas kode tersebut, kita dapat memanfaatkan fitur $guarded
pada model. Singkatnya $guarded
ini memiliki fungsi kebalikan dari $fillable
, jika $fillable
adalah list dari field yang dapat diisi data, $guarded
ini adalah list field yang tidak boleh diisi data. Jadi simplenya kita tinggal menggunakan fitur dari $guarded
ini lalu mengisinya dengan array kosong, yang artinya kita memberikan akses untuk seluruh masukan data ke dalam field dari model.
Untuk kodenya seperti di bawah ini :
protected $guarded = [];
⬆️ Ke Atas ➡️ Berikutnya (Package)
Untuk membuat model
, controller
,migration
, factory
, dan seeder
sekaligus cukup jalankan perintah untuk membuat model dengan tambahan -mcfs
, seperti berikut :
php artisan make:model User -mcfs
Jika kita ingin membuat controller
dengan resource (default method dari laravel). Gunakan perintah ini (dengan tambahan huruf r
):
php artisan make:model User -mcrfs
Atau di laravel versi 8 kita bisa menyingkatnya dengan flag -a
(yang berarti all). Maka kita akan membuat semuanya (model
, controller
,migration
, factory
, dan seeder
) sekaligus, dengan perintah yang sangat singkat, seperti di bawah ini :
php artisan make:model User -a
⬆️ Ke Atas ➡️ Berikutnya (Templating)
- Install Spatie Role Permission
- Cara Menggunakan Role
- Cara Menggunakan Permission
- Cara Menggunakan Permission Via Role
- Cara Menggunakan Spatie di Blade
- Cara Menggunakan Spatie di Middleware
- Install package
composer require spatie/laravel-permission
- edit app/config.php
'providers' => [
// ...
Spatie\Permission\PermissionServiceProvider::class,
];
- publish migration di terminal
php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"
- clear config & cache
php artisan optimize:clear
or
php artisan config:clear
- terakhir jalankan migration
php artisan migrate
- membuat role
use Spatie\Permission\Models\Role;
$role = Role::create(['name' => 'writer']);
- Menambahkan role kepada user
$user->assignRole($role);
- Menghapus role pada user
$user->revokeRoleTo($role); //$role = nama rolenya apa
- Menambahkan Permission
// Tambah permission ke user
$user->givePermissionTo('edit articles');
// Tambah permission melalui role
$user->assignRole('writer');
$role->givePermissionTo('edit articles');
// Tambahkan role sekaligus
$user->givePermissionTo('edit articles', 'delete articles');
// Tambahkan role sekaligus menggunakan array
$user->givePermissionTo(['edit articles', 'delete articles']);
- Menghapus Permission
// Hapus permissioin dari user
$user->revokePermissionTo('edit articles');
// Hapus dan tamabah sekaligus (update)
$user->syncPermissions(['edit articles', 'delete articles']);
- Mengecek Apakah User Mempunyai Permissioin
$user->hasPermissionTo('edit articles');
// Cek use mengguakan id
$user->hasPermissionTo('1');
$user->hasPermissionTo(Permission::find(1)->id);
$user->hasPermissionTo($somePermission->id);
// Periksa user yang mempunya beberapa permission
$user->hasAnyPermission(['edit articles', 'publish articles', 'unpublish articles']);
// alterntif lain
$user->hasAllPermissions(['edit articles', 'publish articles', 'unpublish articles']);
// Periksa user yang mempunya beberapa permission menggunakan integer
$user->hasAnyPermission(['edit articles', 1, 5]);
- Menerapkan Role ke User manapun
$user->assignRole('writer');
// Memberikan role lebih dari satu
$user->assignRole('writer', 'admin');
// alternatif lain menggunakan array
$user->assignRole(['writer', 'admin']);
- Menghapus Role dari User
$user->removeRole('writer');
- Update Role dari User
// Semua role saat ini akan di hapus dari use dan di gantikan dari array yang di berikan
$user->syncRoles(['writer', 'admin']);
- Memeriksa User mempunyai Role, biasanya di gunakan untuk validasi
// Semua role saat ini akan di hapus dari use dan di gantikan dari array yang di berikan
$user->syncRoles(['writer', 'admin']);
// Memeriksa user yang mempunyai beberapa role
$user->hasAnyRole(['writer', 'reader']);
// atau
$user->hasAnyRole('writer', 'reader');
// Cek jika user punya semua role
$user->hasAllRoles(Role::all());
- Permission pada Blade
@can('edit articles')
//
@endcan
// atau
@if(auth()->user()->can('edit articles') && $some_other_condition)
//
@endif
// Bisa juga menggunakan @can, @cannot, @canany, dan @guest
- Role pada Blade
// Persiksa sebuah role
@role('writer')
Saya seorang penulis!
@else
Saya bukan penulis
@endrole
// bisa juga menggunakan ini
@hasrole('writer')
Saya seorang penulis!
@else
Saya bukan penulis
@endhasrole
// Cek beberapa Role
@hasanyrole($collectionOfRoles)
Saya punya satu atau lebih dari satu role
@else
Saya tidak punya role...
@endhasanyrole
// atau
@hasanyrole('writer|admin')
Saya penulis atau admin atau keudannya!
@else
Saya tidak punya role...
@endhasanyrole
// Cek Semua Role
@hasallroles($collectionOfRoles)
Saya punya semua role!!
@else
Saya tidak memiliki semua role...
@endhasallroles
// atau
@hasallroles('writer|admin')
Saya penulis dan juga admin!!
@else
Saya tidak memiliki semua role...
@endhasallroles
// Alternatif lain, @unlessrole
@unlessrole('does not have this role')
Saya tidak punya role
@else
Saya punya role
@endunlessrole
- Tambahkan Kodingan di bawah ini pada app/Http/Kernel.php
protected $routeMiddleware = [
// ...
'role' => \Spatie\Permission\Middlewares\RoleMiddleware::class,
'permission' => \Spatie\Permission\Middlewares\PermissionMiddleware::class,
'role_or_permission' => \Spatie\Permission\Middlewares\RoleOrPermissionMiddleware::class,
];
- Cara memvalidasi Route
Route::group(['middleware' => ['role:super-admin']], function () {
//
});
Route::group(['middleware' => ['permission:publish articles']], function () {
//
});
Route::group(['middleware' => ['role:super-admin','permission:publish articles']], function () {
//
});
Route::group(['middleware' => ['role_or_permission:super-admin|edit articles']], function () {
//
});
Route::group(['middleware' => ['role_or_permission:publish articles']], function () {
//
});
- Memvalidasi Route lebih dari satu role atau permission menggunakan | (pipa) karakter
Route::group(['middleware' => ['role:super-admin|writer']], function () {
//
});
Route::group(['middleware' => ['permission:publish articles|edit articles']], function () {
//
});
Route::group(['middleware' => ['role_or_permission:super-admin|edit articles']], function () {
//
});
- Memvalidasi Middleware di Controller
public function __construct()
{
$this->middleware(['role:super-admin','permission:publish articles|edit articles']);
}
public function __construct()
{
$this->middleware(['role_or_permission:super-admin|edit articles']);
}
⬆️ Ke Atas ➡️ Berikutnya (Basis Data / Database)
- Sebuah fungsi untuk mengubah string html menjadi string pdf menggunakan wkhtmltopdf. Fungsi ini tidak menggunakan file sementara apa pun dan tidak bergantung pada plugin. untuk info update silahkan lihat meertensm/HtmlToPdf
function toPdf($html, $landscape = false)
{
$wkhtmltopdf = '/usr/local/bin/wkhtmltopdf';
// manfaatkan variables laravel's environment
// $wkhtmltopdf = env('WKHTMLTOPDF');
$descriptorspec = [
0 => ['pipe', 'r'], // stdin
1 => ['pipe', 'w'], // stdout
2 => ['pipe', 'w'] // stderr
];
//Hapus DYLD_LIBRARY_PAth sebagai solusi errors ketika bekerja di system operasi MAC menggunakan MAMP
$process = proc_open('unset DYLD_LIBRARY_PATH ;' . $wkhtmltopdf . ' ' . ( $landscape ? '-O landscape' : '' ) . ' -q - -', $descriptorspec, $pipes);
// kirim HTML di stdin
fwrite($pipes[0], $html);
fclose($pipes[0]);
// Baca hasilnya
$pdf = stream_get_contents($pipes[1]);
$errors = stream_get_contents($pipes[2]);
// Tutup Prosesnya
fclose($pipes[1]);
$return_value = proc_close($process);
if ($errors){
dd($errors);
}else{
header('Content-Type: application/pdf');
echo $pdf;
}
}
Ke Atas ➡️ Berikutnya (Middleware)
-
biasa di gunakan untuk aplikasi menengah ke atas
-
cara pemasangan :
- Tambahkan baris kode ini, di dalam file
.env
.
DB_CONNECTION2=mysql
DB_HOST2=127.0.0.1
DB_PORT2=3306
DB_DATABASE2=database ke 2
DB_USERNAME2=root
DB_PASSWORD2=password kamu
- Di dalam file
config/database.php
tambahkan baris kode berikut:
'mysql2' => [
'driver' => 'mysql',
'url' => env('DATABASE_URL'),
'host' => env('DB_HOST2', '127.0.0.1'),
'port' => env('DB_PORT2', '3306'),
'database' => env('DB_DATABASE2', 'forge'),
'username' => env('DB_USERNAME2', 'forge'),
'password' => env('DB_PASSWORD2', ''),
'unix_socket' => env('DB_SOCKET2', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'prefix_indexes' => true,
'strict' => true,
'engine' => null,
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]) : [],
],
- Untuk default databasenya adalah
firstdb
, jika ingin menggunakan database ke dua ubah connection yang ada di migration
public function up()
{
Schema::connection(mysql2)->create('users', function (Blueprint $table) { // <= perhatikan connection nya
$table->id();
$table->string('name');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
}
- Jalankan migration satu persatu
php artisan migrate --database=mysql
php artisan migrate --database=mysql2
- selesai
⬆️ Ke Atas ➡️ Berikutnya (Routing)
-
Membuat class middleware menggunakan artisan
php artisan make:middleware Report
-
Tambahkan Class middleware tadi ke dalam middlewareGroups yang ada di kernel.php
protected $middlewareGroups = [ 'api' => [ 'report' => \App\Http\Middleware\Report::class, ] ];
-
Masuk Ke Web.php. dan Tambahkan Route middleware Group
Route::middleware('report', 'throttle:1,1440')->group(function () { Route::post('laporan', "Dashboard\ReportController@store")->name('laporan'); }); //'report' -> nama middleware yg sudah terdaftar di kernel //'throttle' -> library untuk Rate Limit //'1,1440' -> 1 kali validasi dalam 24 jam/1440 menit
Cara Merubah pesan error throttle
Masuk ke Exceptions/Handler.php
, masukkan kondisi di dalam function render.
Contoh:
if ($exception instanceof ThrottleRequestsException) {
return response()->json(abort(429, 'Upaya Hari Ini Sudah Habis'));
}else {
return parent::render($request, $exception);
}
⬆️ Ke Atas ➡️ Berikutnya (Lain -lain)
Untuk mencari data berdasarkan id / kolom lain pada suatu table kita bisa menggunakan route model binding yang disediakan laravel. Misalnya :
//Route
Route::get('book/{book}', 'BookController@show');
//Controller
class BookController {
public function show (Book $book){
return $book;
}
}
Kode diatas akan menampilkan data buku sesuai dengan id yang dituliskan sebagai parameternya.
Kita juga bisa mencari data berdasarkan kolom yang lain misalnya kolom slug dengan mengubah route menjadi :
//Route => tambahkan {:nama_kolom} setelah nama model book
Route::get('book/{book:slug}', 'BookController@show');
//Controller => akan menampilkan data berdasarkan slugnya tanpa query where
class BookController {
public function show (Book $book){
return $book;
}
}
Cara ini akan mempersingkat kode dibandingkan harus melakukan query where terlebih dahulu sebelum menampilkan data.
⬆️ Ke Atas
- if-else
Penulisan singkat if-else yaitu:
$role = 0;
echo $role == 0 ? 'Admin' : 'Pengunjung';
- if-elseif-else
Hindari penulisan seperti ini:
$role = 0;
echo $role == 0 ? 'admin' : $role == 1 ? 'guru' : 'santri';
Jika mengikuti penulisan di atas maka akan muncul pesan error
Unparenthesized a ? b : c ? d : e is deprecated. Use either (a ? b : c) ? d : e or a ? b : (c ? d : e)
Yang benar adalah seperti ini:
$role = 0;
echo $role == 0 ? 'admin' : ($role == 1 ? 'guru' : 'santri');