Laravel Best Practice

Environment variable

Gunakan file .env untuk menyimpan beberapa informasi penting dan memanggilnya melalui fungsi env. Kita tidak dibenarkan membuat atau meletakkan informasi penting di dalam controller dan model apalagi sampai push ke Git.

Contoh Baik :

// .env 

API_HOST=https://example.com/api
API_USERNAME=myuser
API_PASSWORD=secret

// memanggil value dari file app/config.php

return [
    ...
    'api_host' => env('API_HOST', 'https://defaultdomain.com')
    'api_username' => env('API_USER', 'defaultuser')
    'api_password' => env('API_USER', 'defaultpassword')
    ...
]

Contoh Buruk :

define('API_HOST', 'https://defaultdomain.com');
define('API_USERNAME', 'defaultuser');
define('API_PASSWORD', 'defaultpassword');

class DomainController extends Controller
{
    public function index()
    {
      $api_username   
    }
}

Package Configuration

Disarankan menggunakan snake_case untuk penamaan file configuration, kurang lebih contohnya seperti berikut ini :

Contoh Baik :

config/my_config.php

Contoh Buruk :

config/MyConfig.php

Kemudian gunakan juga index file config menggunakan snake_case, kurang lebih seperti berikut ini :

Contoh Baik :

return [
    'my_api' => [
        'domain' => env('API_DOMAIN'),
        'secret' => env('API_SECRET'),
    ]
]

Contoh Buruk :

return [
    'MyApi' => [
        'DOMAIN' => env('API_DOMAIN'),
        'SECRET' => env('API_SECRET'),
    ]
]

Fat models, skinny controllers

Letakkan semua logika terkait DB ke dalam model Eloquent atau ke dalam kelas Repositori jika Anda menggunakan Query Builder atau query Sql.

Contoh Buruk :

public function index()
{
    $clients = Client::verified()
        ->with(['orders' => function ($q) {
            $q->where('created_at', '>', Carbon::today()->subWeek());
        }])
        ->get();

    return view('index', ['clients' => $clients]);
}

Contoh Baik :

// app/Http/Controllers/ClientController.php

public function index()
{
    return view('index', ['clients' => $this->client->getWithNewOrders()]);
}


// app/Models/Client.php

class Client extends Model
{
    public function getWithNewOrders()
    {
        return $this->verified()
            ->with(['orders' => function ($q) {
                $q->where('created_at', '>', Carbon::today()->subWeek());
            }])
            ->get();
    }
}

Naming Conventions

Pada bagian ini kita akan belajar tentang Naming Conventions atau penamaan yang benar sesuai dengan mengikuti umumnya dari para komunitas Laravel di seluruh Dunia.

Controllers

Nama controller umumnya dimulai dengan kata benda dalam bentuk tunggal (singular) kemudian diikuti dengan kata, kurang lebih contonya seperti berikut ini :

Contoh Baik :

class ArticleController extends Controller
{
    ...
}

Contoh Buruk :

class ArticlesController extends Controller
{
    ...
}
class wp_articlesController extends Controller
{
    ...
}
class Article extends Controller
{
    ...
}

Gunakan penamaan nama method/function dari Resources Controller kurang lebih seperti berikut ini :

Contoh Baik :

class ArticleController extends Controller
{
    public function index()
    {
        // list articles
    }
 
    public function create()
    {
        // show create form
    } 

    public function store(Request $request)
    {
        // handle the form POST
    } 

    public function show($id)
    {
        // show a single article
    } 

    public function edit($id)
    {
        // show edit page
    } 

    public function update(Request $request, $id)
    {
        // handle show edit page POST
    } 

    public function destroy($id)
    {
        // delete a article
    } 
}

Validation

Contoh Buruk :

public function store(Request $request)
{
    $request->validate([
        'title' => 'required|unique:posts|max:255',
        'body' => 'required',
        'publish_at' => 'nullable|date',
    ]);

    ....
}

Contoh Baik :

public function store(PostRequest $request)
{    
    ....
}

class PostRequest extends Request
{
    public function rules()
    {
        return [
            'title' => 'required|unique:posts|max:255',
            'body' => 'required',
            'publish_at' => 'nullable|date',
        ];
    }
}

Naming Conventions

Pada bagian ini kita akan belajar tentang Naming Conventions atau penamaan yang benar sesuai dengan mengikuti umumnya dari para komunitas Laravel di seluruh Dunia.

Controllers

Nama controller umumnya dimulai dengan kata benda dalam bentuk tunggal (singular) kemudian diikuti dengan kata, kurang lebih contonya seperti berikut ini :

Contoh Baik :

class ArticleController extends Controller
{
    ...
}

Contoh Buruk :

class ArticlesController extends Controller
{
    ...
}
class wp_articlesController extends Controller
{
    ...
}
class Article extends Controller
{
    ...
}

Gunakan penamaan nama method/function dari Resources Controller kurang lebih seperti berikut ini :

Contoh Baik :

class ArticleController extends Controller
{
    public function index()
    {
        // list articles
    }
 
    public function create()
    {
        // show create form
    } 

    public function store(Request $request)
    {
        // handle the form POST
    } 

    public function show($id)
    {
        // show a single article
    } 

    public function edit($id)
    {
        // show edit page
    } 

    public function update(Request $request, $id)
    {
        // handle show edit page POST
    } 

    public function destroy($id)
    {
        // delete a article
    } 
}

Contoh Buruk :

class ArticleController extends Controller
{
    public function list()
    {
        // list articles
    } 

    public function create_or_save()
    {
        // show create form then handle save
    } 

    public function show_edit($id)
    {
        // show a single article then show edit page
    } 

    public function delete($id)
    {
        // delete a article
    } 
}

Model

Nama model harus dalam bentuk tunggal (singular) dengan huruf pertama dalam huruf besar, contohnya seperti berikut ini :

Contoh Baik :

class Flight extends Model
{
    ...
}

Contoh Buruk :

class Flights extends Model
{
    ...
}
class flight extends Model
{
    ...
}


Method Relationship hasOne atau belongsTo harus dalam bentuk tunggal (singular), contohnya seperti berikut ini :

Contoh Baik :

class User extends Model
{
    public function phone()
    {
        return $this->hasOne('App\Phone');
    }
}

Contoh Buruk :

class User extends Model
{
    public function phones()
    {
        return $this->hasOne('App\Phone');
    }
}

Kemudian method untuk Relationship selain diatas harus ditulis dengan jamak (plural), kurang lebih seperti berikut ini :

Contoh Baik :

class Post extends Model
{
    public function comments()
    {
        return $this->hasMany('App\Comment');
    }
}

Contoh Buruk :

class Post extends Model
{
    public function comment()
    {
        return $this->hasMany('App\Comment');
    }
}

Dan untuk properti yang ada di dalam Model harus ditulis menggunakan snake_case, kurang lebih seperti berikut ini :

Contoh Baik :

$user->created_at

Contoh Buruk :

$user->createdAt

Penamaan method di dalam Model diharuskan menggunakan camelCase, kurang lebih seperti berikut ini :

Contoh Baik :

class User extends Model
{
    public function scopePopular($query)
    {
        return $query->where('votes', '>', 100);
    }
}

Contoh Buruk :

class User extends Model
{
    public function scope_popular($query)
    {
        return $query->where('votes', '>', 100);
    }
}

Functions

Secara default Laravel sudah memiliki banyak sekali fungsi helper yang sangat berguna, akan tetapi kita juga bisa membuat helper kita sendiri di Laravel. Dan berikut ini contoh membuat helper yang baik sesuai dengan Best Practices.

Contoh Baik :

project_folder/app/helper.php
project_folder/app/Http/helper.php

Contoh Buruk :

project_folder/functions.php

Kemudian untuk load sebuah function kita dapat menggunakan Composer autoload, kurang lebih seperti berikut ini :

Contoh Baik :

// file composer.json

...
"autoload": {
    "files": [
        "app/helpers.php"
    ],
...

Contoh Buruk :

// file app/Http/Controllers/HomeController.php

class HomeController.php
{
    function index()
    {
        require_once(app_path("helpers.php"));
    }
}

Dan untuk function helper kita harus memberikan kondisi pengecekan sebelum menentukannya. Kurang lebih seperti berikut ini :

Contoh Baik :

if (! function_exists('my_custom_helper')) {
    function my_custom_helper($key, $default = null) {
        // ...
    }
}

Contoh Buruk :

function my_custom_helper($key, $default = null) {
    // ...
}