Laravel

Membangunkan Authentication Server menggunakan Laravel/Passport

Install aplikasi Laravel seperti biasa. Kemudian, rujuk dokumentasi Laravel/Passport di https://laravel.com/docs/11.x/passport

  1. Install menggunakan arahan di bawah:
    php artisan install:api --passport

    Anda akan ditanya sama ada ingin menggunakan UUID sebagai primary key. pilih 'No' jika anda ingin menggunakan auto increment sebagai primary key.
  2. 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:

    image.png

  3. Akhirnya, tambah guards di dalam file config/auth.php seperti contoh di bawah: image.png

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)
id nama
1 Rak A, Bilik Fail
2 Rak B, Bilik Fail
3 Rak A, Stor Fail

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)
id no_fail tajuk_fail lokasi_id
1 ABC/2023/001 Projek Simulasi 2
2 ABC/2023/002 Pembelian Alatganti 1
3 ABC/2024/001 Sistem POS 2

Katakan kita ingin mengemaskini data id=2 untuk table Fail. Berikut adalah contoh kod blade untuk borang kemaskini tersebut:

image.png

Localization - Bahasa

rujukan : https://laravel.com/docs/11.x/localization#publishing-the-language-files

Localization - Bahasa

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. 

untuk menukar bahasa semasa pengguna membuat pilihan, gunakan 

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); 
// ... 
});


Localization - Bahasa

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

Janaan Laporan

PDF

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.

Janaan Laporan

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');

 

 

Janaan Laporan

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 lain
use 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']);
});