Laravel Best Practices


Laravel Best Practices

Halo teman-teman semuanya, pada kesempatan kali ini kita akan belajar tips untuk mengimplementasikan Best Practices di Laravel untuk meningkatkan kualitas aplikasi yang dibangun sehingga menjadi lebih efisien, maintenable, scalable dan memiliki pola yang benar. Beberapa materi yang akan dibahas antara lain :

  • Environment
  • Configuration
  • Naming Conventions
  • Database Conventions
  • Testing

Bagian 1 - Environment

Local Environment

Ada beberapa cara yang bagus untuk bisa menjalankan Laravel di local environment, seperti :

Kita bebas memilih menggunakan local environment yang sesuai dengan kebutuhan kita dan tim, selama beberapa kondisi berikut terpenuhi :

  • Kita harus bisa menduplikasi server production atau mendekati sepesifikasinya, seperti veri dari PHP yang digunakan, Extention yang diinstall dan versi dari MySQL.
  • File .env tidak harus dimasukkan ke repository pengembangan.
  • Jangan lupa update file README.md untuk memberikan beberapa penjelasan tentang aplikasi yang dibangun, misalnya cara untuk installasi, membuat database dan yang lainnya. Sehingga jika ada pengembang baru mereka dapat mengikutinya dengan benar.

Staging Environment

Staging Server digunakan untuk menguji sebuah aplikasi atau website yang memiliki spesifikasi yang hampir sama dengan server production. Staging dilakukan sebelum aplikasi benar-benar di push ke versi production. Ini digunakan agar mencegah adanya bug saat di production.

Disarankan menggunakan CI/CD atau Continue Integration dan Continue Development untuk menjalankan Test aplikasi secara otomatis saat kita melakukan perubahan pada repository dan akan otomatis push ke production. Kita bisa menggunakan Travis CI, Jenkins atau Gitlab CI/CD.

Production Environment

Dalam production aplikasi kita harus benar-benar bersih dari bug. Dan kita bisa set APP_KEY dari project Laravel dengan perintah berikut ini :

php artisan key:generate 

Laravel menggunakan key untuk semua cookie yang dienkripsi, termasuk session cookie, sebelum memberikannya ke browser pengguna, dan menggunakannya untuk mendekripsi cookie yang dibaca dari browser.

Hal ini mencegah pengguna membuat perubahan pada cookie mereka dan memberikan permission kusus kepada dirinya sendiri atau meniru pengguna lain dalam aplikasi. Encrypted Cookie adalah fitur keamanan penting di Laravel.

Bagian 2 - Configuration

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 :

// config/myconfig.php

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

Contoh Buruk :

// config/myconfig.php

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

Bagian 3 - 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 Controller, 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) {
    // ...
}

Routes

Jika menggunakan resources kita harus menggunakan jamak (plural) dan semuanya harus menggunakan huruf kecil. Kurang lebih seperti berikut ini :

Contoh Baik :

Route::get('/users', 'UserController@index');
Route::resource('photos', 'PhotoController');

Contoh Buruk :

Route::get('/user', 'UserController@index');
Route::get('/UsersList', 'UserController@index');
Route::resource('PHOTO', 'PhotoController');

Dan untuk nama dari route diharuskan menggunakan notasi dot atau menggunakan snake_case. Kurang lebih seperti berikut ini :

Contoh Baik :

Route::get('/user', 'UserController@active')->name('users.show_active');

Contoh Buruk :

Route::get('/user', 'UserController@active')->name('users.show-active');
Route::get('/user', 'UserController@active')->name('show-active-users');

Variables

Secara umum untuk penamaan variable harus dalam camelCase. Kurang lebih seperti beirkut ini :

Contoh Baik :

$articlesWithAuthor

Contoh Buruk :

$articles_with_author

Dan untuk nama dari Collections harus deskriptif dan dalam bentuk jamak (plural). Kurang lebih seperti berikut ini :

Contoh Baik :

$activeUsers = User::active()->get()

Contoh Buruk :

$users = User::active()->get()
$user = User::active()->get()
$User = User::active()->get()

Kemudian untuk objek tunggal harus deskriptif dan dalam bentuk tunggal (singular). Kurang lebih seperti berikut ini :

Contoh Baik :

$activeUser = User::active()->first()

Contoh Buruk :

$users = User::active()->first()

Views

Dan untuk penamaan sebuah blade view diharuskan menggunakan snake_case. Kurang lebih seperti berikut ini :

Contoh Baik :

show_filtered.blade.php

Contoh Buruk :

showFiltered.blade.php
show-filtered.blade.php

Bagian 4 - Database Conventions

Berikut ini beberapa Best Practices yang bisa kita terapkan untuk penamaan table dan field. Nama table harus dalam bentuk jamak (plural) dan semua menggunakan huruf kecil. Kurang lebih seperti berikut ini :

Contoh Baik :

class CreateFlightsTable extends Migration
{
    public function up()
    {
        Schema::create('flights', function (Blueprint $table) {
    }
}

Contoh Buruk :

class CreateFlightsTable extends Migration
{
    public function up()
    {
        Schema::create('flight', function (Blueprint $table) {
    }
}
class CreateUsersTable extends Migration
{
    public function up()
    {
        Schema::create('MyUsers', function (Blueprint $table) {
    }
}

Dan untuk penamaan pivot table harus dengan tunggal (singular). Kurang lebih seperti berikut ini :

Contoh Baik :

post_user
article_user
photo_post

Contoh Buruk :

posts_users
user_articles
post_photos

Kemudian untuk nama column harus menggunakan snake_case tanpa menambahkan nama model. Kurang lebih seperti berikut ini :

Contoh Baik :

username
title
thumb_url

Contoh Buruk :

UserName
_title
ThumbUrl
post_title

Kemudian untuk nama column Foreign Keys harus dengan nama model tunggal (singular) dan diikuti dengan _id. Kurang lebih seperti berikut ini :

Contoh Baik :

user_id

Contoh Buruk :

userid
siteid
Memberid
TransactionID

Dan untuk penamaan Primary Keys yang baik menggunakan id. Kurang lebih contohnya seperti berikut ini :

Contoh Baik :

id

Contoh Buruk :

ID
pdid
guid

Bagian 5 - Testing

Untuk method yang digunakan di dalam class harus dimulai dengan kata test dan diikuti nama dengan camelCase. Kurang lebih seperti berikut ini :

Contoh Baik :

class ExampleTest extends TestCase
{
    public function testBasicTest()
    {
        // kode test disini
    }
}

Contoh Buruk :

class ExampleTest extends TestCase
{
    public function test_basic_test()
    {
        // kode test disini
    }
}

Sampai disini pembahasan tentang Implementasi Best Practices di Laravel. Artikel ini akan terus diperbarui jika ada update Best Practice dari komunitas Laravel diseluruh Dunia.

Sumber : https://www.laravelbestpractices.com/


Fika Ridaul Maulayya
Full-Stack Developer, Content Creator and CO-Founder SantriKoding.com

Suka dengan tulisan di SantriKoding? Kamu bisa memberikan dukungan dengan berdonasi atau bagikan konten ini di sosial media. Terima kasih atas dukungan Anda!

KEBIJAKAN KOMENTAR

Saat memberikan komenatar silahkan memberikan informasi lengkap tentang error, seperti: screenshot, link kode, dll. Baca aturan komentar kami