7 Hal Best Practice Di Laravel Yang Harus Kamu Ketahui
Setiap pengembang web memiliki gayanya sendiri dalam menulis kode. Sama halnya jika kita bekerja menggunakan kerangka Laravel di mana semuanya sudah ada tetapi biasanya kita menyalahgunakan terminologi di sini. Tidak masalah jika menyangkut gaya yang berbeda, tetapi kita harus memastikan bahwa kode kita mengikuti gaya yang baik. Ini berarti bahwa kode kita harus dapat diskalakan, dapat dipelihara, dan dapat diuji.
Apa yang membuat kode kita menjadi buruk atau baik? Nah, karena PHP adalah bahasa OOP, maka kita harus mengikuti prinsip OOP seperti prinsip SOLID dan mempertimbangkan untuk menggunakan mekanisme OOP seperti pewarisan, abstrak, dan sebagainya. Selain itu, Laravel memiliki komunitas besar yang terkadang ada beberapa konvensi yang dibuat komunitas tersebut. Jadi pengembang Laravel lain yang juga mengikuti konvensi dapat dengan mudah memahami kode kami dengan lebih baik dan lebih cepat. Dalam artikel ini, saya akan menunjukkan kepada Anda 7 praktik terbaik di Laravel berdasarkan prinsip OOP & beberapa konvensi komunitas Laravel.
Model Gemuk, Pengendali Kurus
Jika kita memiliki pembuat kueri yang cukup rumit atau SQL mentah, kita harus memindahkan kueri ini ke Model atau Repositori.
<?php
public function index()
{
$partners = Partner::where('email_verified_at', '!=', null)
->with(['products' => function ($q) {
$q->whereDate('created_at', now());
}])
->get();
return view('index', ['partners' => $partners]);
}
<?php
public function index()
{
return view('index', ['partners' => $this->partner->newProducts()]);
}
class Partner extends Model
{
public function newProducts()
{
return $this->where('email_verified_at', '!=', null)
->with(['products' => function ($q) {
$q->whereDate('created_at', now());
}])
->get();
}
}
Logika Bisnis di Kelas Layanan
Terkait dengan poin 1 di atas di mana kita harus memiliki pengontrol kurus, maka kita harus memindahkan semua logika bisnis di kelas layanan yang terpisah. Jadi pengontrol seharusnya hanya memiliki satu tanggung jawab, dan mudah-mudahan, kami dapat menggunakan kembali layanan ini di pengontrol lain.
<?php
public function store(Request $request)
{
$user = User::create();
$user->update(['last_login' => now()]);
dispatch(new UserCreated($user));
// ...
}
<?php
public function store(Request $request)
{
$this->userService->create($request);
....
}
class UserService
{
public function create($request)
{
// ...
}
}
Kueri Fasih atas SQL mentah
Query menggunakan Eloquent lebih mudah dibaca, aman dari SQL Injection, dan mudah dirawat.
<?php
SELECT *
FROM `articles`
WHERE EXISTS (SELECT *
FROM `users`
WHERE `articles`.`user_id` = `users`.`id`
AND EXISTS (SELECT *
FROM `profiles`
WHERE `profiles`.`user_id` = `users`.`id`)
AND `users`.`deleted_at` IS NULL)
AND `verified` = '1'
AND `active` = '1'
ORDER BY `created_at` DESC
<?php
Article::has('user.profile')->verified()->latest()->get();
KERING (Jangan Ulangi Sendiri)
Nah, kita harus mempertimbangkan untuk memindahkan logika/bagian komponen yang dapat digunakan kembali di tempat yang terpisah. Dalam templating blade, kita dapat menggunakan komponen untuk menggunakan kembali bagian front-end. Di server, kita dapat memindahkan logika ke kelas layanan yang terpisah, cakupan yang fasih, atau bahkan membuat paket kita sendiri.
<!DOCTYPE html>
<html>
<head>
<title>DRY</title>
</head>
<body>
<h1>Custom Calendar</h1>
<x-custom-calendar>
</body>
</html>
Jangan jalankan kueri di templat Blade
Meskipun mengeksekusi kueri di blade dimungkinkan, itu bukan hal terbaik untuk dilakukan.
Buruk. Ini akan menyebabkan masalah N+1.
@foreach (User::all() as $user)
{{ $user->email }}
@endforeach
Bagus.
$users = User::all(); // Server Query@foreach ($users as $user)
{{ $user->email }}
@endforeach
Gunakan Transaksi DB
Jika kita memiliki beberapa logika/query yang rumit dan panjang, maka kita harus mempertimbangkan untuk menggunakan transaksi DB. Dengan menggunakan fitur ini, kita dapat dengan mudah memutar kembali DB jika diperlukan untuk memastikan bahwa data kita tidak disimpan ke dalam DB, sehingga kami yakin data kami dapat diandalkan.
<?php
public function store(Request $request)
{
DB::beginTransaction();
$user = User::create();
$response = app('service')->create($user);
if (!$response) {
DB::rollback();
return;
}
// ...
DB::commit();
}
Jangan Hardcode Teks
Kita tidak boleh meng-hardcode teks apa pun di dalam kode/pengontrol kita. Jadi nantinya akan mudah untuk dipelihara dan ditingkatkan. Kita dapat menggunakan terjemahan jika kita ingin menampilkan pesan kepada pengguna, const dalam model/kelas untuk menetapkan nilai apa pun atau file konfigurasi untuk menyimpan konfigurasi kita.
trans('user.created'); // 'User Successfully Created'
$types = Product::TYPES; // Const in a Class/Model