Laravel
- Membangunkan Authentication Server menggunakan Laravel/Passport
- Selected - paparkan default value pada dropdown
- Localization - Bahasa
- Janaan Laporan
- Middleware
Membangunkan Authentication Server menggunakan Laravel/Passport
Install aplikasi Laravel seperti biasa. Kemudian, rujuk dokumentasi Laravel/Passport di https://laravel.com/docs/11.x/passport
- Install menggunakan arahan di bawah:
php artisan install:api --passportAnda akan ditanya sama ada ingin menggunakan UUID sebagai primary key. pilih 'No' jika anda ingin menggunakan auto increment sebagai primary key.
- Buka model User di App\Models\User.php, pada ruang "import", tambah baris "use Laravel\Passport\HasApiTokens;" manakala dalam class, tambah "HasApiTokens" seperti di bawah:
- Akhirnya, tambah guards di dalam file config/auth.php seperti contoh di bawah:
Sekiranya encryption keys belum dibuat, laksanakan arahan "php artisan passport:keys". Jika terdapat error "Encryption keys already exist. Use the --force option to overwrite them.", abaikan langkah ini. Encryption key telah dijana semasa proses instalasi.
Untuk menambah aplikasi yang akan menjadi "client" atau menggunakan User dalam sistem ini, laksanakan arahan "php artisan passport:client". Simpan Client ID dan Client Secret di dalam env aplikasi client.
bangunkan laman Daftar dan Login di dalam sistem ini.
Selected - paparkan default value pada dropdown
Untuk memaparkan default value dropdown pada borang di dalam view, gunakan arahan
@selected($borang->nilai == $dropdown->nilai)
sebagai contoh, katakan kita mempunyai table Lokasi yang menyimpan lokasi fail seperti di bawah:
| Skema | Data | ||||||||
| Lokasi id (int) nama (string) |
|
Di bawah pula table Fail yang menyimpan senarai fail beserta lokasinya:
| Skema | Data | ||||||||||||||||
| Fail id (int) no_fail (string) tajuk_fail(string) lokasi_id(int) |
|
Katakan kita ingin mengemaskini data id=2 untuk table Fail. Berikut adalah contoh kod blade untuk borang kemaskini tersebut:
Localization - Bahasa
rujukan : https://laravel.com/docs/11.x/localization#publishing-the-language-files
Setup localization
Untuk membolehkan aplikasi laravel menggunakan pelabagi bahasa, kita boleh memasang package localization menggunakan arahan php artisan di bawah:
php artisan lang:publish
Tetapan bahasa default disimpan di fail config/app.php. Walau bagaimanapun, anda boleh menukar tetapan ini di dalam fail .env menggunakan variable APP_LOCALE=ms untuk menjadikan bahasa melayu sebagai bahasa default.
App::setLocale($locale);
di bawah adalah contoh code pada routes/web.php
use Illuminate\Support\Facades\App;
Route::get('/greeting/{locale}', function (string $locale) {
if (! in_array($locale, ['en', 'es', 'fr'])) {
abort(400);
}
App::setLocale($locale);
// ...
});
Membuat kamus bahasa
untuk contoh ini, kita akan menggunakan kaedah pertama, iaitu menggunkan fail terjemahan.
lihat ke direktori lang, anda akan melihat 1 folder bernama 'en'. folder ini adalah folder asal dari Laravel. di dalam folder ini, terdapat beberapa fail yang mengandungi teks. anda boleh mengasingkan nama fail mengikut penggunaan untuk memudahkan rujukan. sebagai contoh, buat fail 'registration.php' untuk meletakkan semua teks berkaitan page Pendaftaran.
letakkan teks anda dalam bentuk array seperti di bawah:
<?php
// lang/en/registration.php
return [
'welcome' => 'Welcome to our application!',
'tajuk_daftar' => 'New Registration',
];
untuk membuat fail bahasa melayu, buat folder 'ms' di dalam folder 'lang', dan pastikan semua fail di dalam folder 'en' ada dalam folder 'ms'. dalam contoh ini, edit fail 'registration.php' dan tukar teks yang terlibat seperti di bawah:
<?php
// lang/ms/registration.php
return [
'welcome' => 'Selamat datang ke aplikasi kami!',
'tajuk_daftar' => 'Pendaftaran Baru'
];
untuk memaparkan teks tersebut di dalam page, gunakan arahan blade seperti di bawah:
{{ __('registration.welcome') }}
registration -> adalah nama fail dalam folder 'lang'
welcome -> adalah array key untuk teks yang hendak dipaparkan.
sekiranya teks anda mempunyai parameter, anda boleh menggunakan placeholder yang didahului dengan tanda ':'. sebagai contoh, :nama untuk teks yang memaparkan nama pengguna. berikut adalah contoh penggunaan.
'welcome' => 'Welcome, :name',
cara menggunakannya adalah seperti berikut:
echo __('registration.welcome', ['name' => 'dayle']);
sila ambil maklum, jika anda placholder anda menggunakan semua huruf besar, atau huruf pertama adalah huruf besar, laravel akan auto convert nilai yang anda hantar mengikut format tersebut. sebagai contoh(perhatikan placeholder dan comment):
'welcome' => 'Welcome, :NAME', // Welcome, DAYLE
'goodbye' => 'Goodbye, :Name', // Goodbye, Dayle
Janaan Laporan
cara nak guna plugin untuk jana laporan dalam bentuk pdf dll
untuk menjana cetakan laporan dalam bentuk PDF, ada beberapa plugin yang boleh digunakan. dalam laravel, boleh gunakan package barryvdh/laravel-dompdf atau setasign/fpdf. Jika prefer javascript, boleh juga gunakan PDFMake.
Perbezaan ketiga-tiga package ini adalah:
DOMPDF : pdf dijana daripada blade(html). walau bagaimanapun, hanya simple css sahaja yang boleh digunakan untuk susunan output.
FPDF : output perlu disusun menggunakan fungsi.
PDFMake : output diletakkan dalam blade sebagai Javascript.
barryvdh/laravel-dompdf
install package menggunakan command ini:
composer require barryvdh/laravel-dompdf
dalam controller, jangan lupa include DomPDF. kemudian load data macam kita biasa buat untuk view. Perbezaannya kat sini, kita panggil PDF::loadView('nama_blade', [data]) instead of view().
use Barryvdh\DomPDF\Facade\Pdf;
class ReportController extends Controller{ public function download() { $data = [ 'title' => 'Laporan Bulanan', 'date' => date('d/m/Y'), 'content' => 'Ini contoh report PDF.' ];
$pdf = Pdf::loadView('pdf.report', $data);
return $pdf->download('laporan.pdf'); // download // return $pdf->stream('laporan.pdf'); // terus buka dalam browser }}
untuk gambar dalam output tu, guna public_path('img/logo.png');
tapi kalau kita nak guna asset, kena enable dulu option isRemoteEnabled untuk remote. kat bawah ni contoh code untuk enable gambar guna asset();
// apply option masa create instance $pdf = \PDF::setOptions([ 'isRemoteEnabled' => true, 'defaultFont' => 'sans-serif' ])->loadHTML($pdfView) ->setPaper('a4', 'portrait');
setasign/fpdf
install package guna composer:
composer require setasign/fpdf
dalam controller, kena buat satu-satu line output macam kat bawah
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;use setasign\Fpdi\Fpdi; // kalau nak guna FPDI untuk import pdf lainuse FPDF;
class PdfController extends Controller{ public function generate() { $pdf = new \FPDF(); $pdf->AddPage(); $pdf->SetFont('Arial', 'B', 16);
// Title $pdf->Cell(0, 10, 'Hello dari Laravel + FPDF!', 0, 1, 'C');
// Normal text $pdf->SetFont('Arial', '', 12); $pdf->Cell(0, 10, 'Ini contoh content dalam PDF.', 0, 1);
// Output to browser $pdf->Output('I', 'contoh.pdf'); exit; }}
lepas create objek FPDF(), tambah page dulu guna AddPage(). untuk next page, kita kene panggil AddPage() lagi.
panggil Cell() untuk add baris dalam pdf tu.
untuk output, panggil Output().
Middleware
dalam contoh ni, kita ada buat middleware untuk semak peranan berdasarkan column 'role' pada table users.
1. Create Middleware
Guna artisan:
php artisan make:middleware RoleMiddleware
Ini akan create file app/Http/Middleware/RoleMiddleware.php.
2. Edit Middleware Logic
Contoh RoleMiddleware:
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
use Illuminate\Support\Facades\Auth;class RoleMiddleware
{
/**
* Handle an incoming request.
*
* @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
*/
public function handle(Request $request, Closure $next, ...$roles): Response
{
$user = Auth::user();if (! $user) {
return redirect()->route('login');
}// Check kalau role user termasuk dalam list roles yang dibenarkan
if (! in_array($user->role, $roles)) {
abort(403, 'Unauthorized access');
}return $next($request);
}
}
guna ...$roles (spread operator), so masa panggil middleware boleh letak lebih dari satu role. contoh dalam routes pada point 4.
return $next($request); tu utk proceed kalau semuanya ok.
3. Register Middleware
Dalam Laravel 11, middleware global dan route middleware daftar dalam bootstrap/app.php, bukan lagi app/Http/Kernel.php (Kernel dah minimal).
So buka bootstrap/app.php, cari bahagian:
->withMiddleware(function (Middleware $middleware) {
$middleware->alias([
'role' => \App\Http\Middleware\RoleMiddleware::class,
]);
})
4. Guna Middleware Dalam Route
Sekarang route boleh protect ikut role:
use Illuminate\Support\Facades\Route;
Route::middleware(['role:admin'])->group(function () {
Route::get('/admin', [AdminController::class, 'index'])->name('admin.dashboard');
});Route::middleware(['role:pengundi'])->group(function () {
Route::get('/pengundi/cabutan', [PengundiController::class, 'cabutan'])->name('pengundi.cabutan');
});Route::middleware(['role:datukbandar'])->group(function () {
Route::get('/datukbandar', [DatukBandarController::class, 'dashboard'])->name('datukbandar.dashboard');
});// kalau ada route share by 2 role
Route::middleware(['role:admin,datukbandar'])->group(function () {
Route::get('/laporan', [ReportController::class, 'index']);
});