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/