1% Lebih baik dengan Laravel

Wayan Jimmy
(Jimboy Labs) Kerobokan
Prinzio

Sedang Belajar

Laravel & PHP
ReactJS
Node

Framework yang pernah dipakai

Kesalahan saya

  1. Gaya kode tidak konsisten
  2. Sering membuat class yang gendut (Contoh: Controller dengan 15 method didalamnya)
  3. Menggunakan pattern yang kurang sesuai

Belajar dari kesalahan

Pengalaman adalah guru terbaik

Perbaiki Kesalahan #1

1
2<?php
3
4// Good
5$result = $object instanceof Model
6 ? $object->name
7 : 'A default value';
8
9$name = $isFoo ? 'foo' : 'bar';
10
11// Bad
12$result = $object instanceof Model ?
13 $object->name :
14 'A default value';
15
1
2<?php
3
4// good
5Route::get('/', 'HomeController@index');
6Route::get('open-source', 'OpenSourceController@index');
7
8//bad
9Route::get('', 'HomeController@index');
10Route::get('/open-source', 'OpenSourceController@index');
11

Perbaiki Kesalahan #2

Ketika kode mulai besar dan kompleks

mulai pecah menjadi beberapa kode kecil

Simpan Semua Models dalam folder Models

Gunakan Aturan 7 Standard REST action di Controller

Resource

  • Index
  • Show
  • Create
  • Store
  • Edit
  • Update
  • Destroy

API Resource

  • Index
  • Show
  • Create
  • Store
  • Edit
  • Update
  • Destroy
1
2php artisan make:controller ProductsController --resource
3php artisan make:controller ProductsController --api
4

Perbaiki Kesalahan #3

Jangan menggunakan pattern karena terlihat keren

namun dari masalah apa yang akan dipecahkan

Lebih baik menerapkan cara-cara yang lebih mudah dan sederhana

Gunakan Jobs

Kode yang berulang di controller dapat dipecah menjadi sebuah Job

1
2<?php // app/Jobs/CloseOrder.php
3
4namespace App\Jobs;
5
6use App\Models\Order;
7
8class CloseOrder
9{
10 protected $order;
11
12 public function __construct(Order $order, $delay)
13 {
14 $this->order = $order;
15 $this->delay($delay);
16 }
17
18 public function handle()
19 {
20 if ($this->order->paid_at) {
21 return;
22 }
23
24 DB::transaction(function() {
25 // ...
26 });
27 }
28}
29
1
2<?php
3
4use App\Jobs\CloseOrder;
5
6dispatch(new CloseOrder($order, $delay = 500));
7

Gunakan Query Object

Query filter untuk menampilkan list bisa sangat panjang

1
2<?php
3
4namespace App\Http\Controllers;
5
6use App\Models\Stock;
7
8class StocksController extends Controller
9{
10 public function index()
11 {
12 $keyword = request('search');
13
14 $stocks = Stock::query()
15 ->with('product', 'product.category', 'branch')
16 ->leftJoin('products', function ($join) {
17 $join->on('stocks.product_id', 'products.id');
18 })
19 ->leftJoin('branches', function ($join) {
20 $join->on('stocks.branch_id', 'branches.id');
21 })
22 ->when($keyword, function ($query) use($keyword) {
23 return $query
24 ->where('stock', 'like', "%{$keyword}%")
25 ->orWhere('product_name', 'ilike', "%{$keyword}%")
26 ->orWhere('branch_name', 'ilike', "%{$keyword}%");
27 })
28 ->selectRaw('stocks.*, products.name as product_name, branches.name as branch_name')
29 ->paginate(request('per_page'));
30
31 return response()->json(compact('stocks'));
32 }
33}
34
1
2<?php // app/Queries/SearchStocks.php
3
4namespace App\Queries;
5
6use App\Models\Stock;
7use Illuminate\Contracts\Pagination\Paginator;
8
9final class SearchStocks
10{
11 public static function get($perPage = 20): Paginator
12 {
13 $keyword = request('search');
14
15 return Stock::query()
16 ->with('product', 'product.category', 'branch')
17 ->leftJoin('products', function ($join) {
18 $join->on('stocks.product_id', 'products.id');
19 })
20 ->leftJoin('branches', function ($join) {
21 $join->on('stocks.branch_id', 'branches.id');
22 })
23 ->when($keyword, function ($query) use($keyword) {
24 return $query
25 ->where('stock', 'like', "%{$keyword}%")
26 ->orWhere('product_name', 'ilike', "%{$keyword}%")
27 ->orWhere('branch_name', 'ilike', "%{$keyword}%");
28 })
29 ->selectRaw('stocks.*, products.name as product_name, branches.name as branch_name')
30 ->paginate($perPage);
31 }
32}
33
1
2<?php
3
4use App\Queries\SearchStocks;
5
6class StocksController extends Controller
7{
8 public function index()
9 {
10 $stocks = SearchStocks::get();
11
12 return response()->json(compact('stocks'));
13 }
14}
15

Belajar sedikit saja tetapi setiap hari

Membaca projek sumber terbuka