# 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](https://laravel.com/docs/11.x/passport)

1. Install menggunakan arahan di bawah: <div class="line align-center"><span style="color: rgb(0, 0, 0);">php artisan install:api</span><span style="color: #bfc7d5;"> </span><span style="color: #82aaff;">--passport</span></div><div class="line">  
    </div><div class="line">Anda akan ditanya sama ada ingin menggunakan UUID sebagai primary key. pilih 'No' jika anda ingin menggunakan auto increment sebagai primary key.</div>
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](https://ilmu.di.mbip.my/uploads/images/gallery/2024-07/scaled-1680-/yT0image.png)
3. Akhirnya, tambah guards di dalam file config/auth.php seperti contoh di bawah: [![image.png](https://ilmu.di.mbip.my/uploads/images/gallery/2024-07/scaled-1680-/LwKimage.png)](https://ilmu.di.mbip.my/uploads/images/gallery/2024-07/LwKimage.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-&gt;nilai == $dropdown-&gt;nilai)

sebagai contoh, katakan kita mempunyai table **Lokasi** yang menyimpan lokasi fail seperti di bawah:

<center id="bkmrk-skema-data-lokasiid-"><table border="0" width="70%"><tbody><tr><td width="30%">Skema</td><td>Data</td></tr><tr><td class="align-left">**Lokasi**  
id (int)  
nama (string)</td><td><table border="1" width="80%"><tbody><tr><td>id</td><td>nama</td></tr><tr><td>1</td><td>Rak A, Bilik Fail</td></tr><tr><td>2</td><td>Rak B, Bilik Fail</td></tr><tr><td>3</td><td>Rak A, Stor Fail</td></tr></tbody></table>

</td></tr></tbody></table>

</center>Di bawah pula table **Fail** yang menyimpan senarai fail beserta lokasinya:

<center id="bkmrk-skema-data-failid-%28i"><table border="0" width="70%"><tbody><tr><td width="30%">Skema</td><td>Data</td></tr><tr><td class="align-left">**Fail**  
id (int)  
no\_fail (string)  
tajuk\_fail(string)  
lokasi\_id(int)</td><td><table border="1" width="90%"><tbody><tr><td>id</td><td>no\_fail</td><td>tajuk\_fail</td><td>lokasi\_id</td></tr><tr><td>1</td><td>ABC/2023/001</td><td>Projek Simulasi</td><td>2</td></tr><tr><td>2</td><td>ABC/2023/002</td><td>Pembelian Alatganti</td><td>1</td></tr><tr><td>3</td><td>ABC/2024/001</td><td>Sistem POS</td><td>2</td></tr></tbody></table>

</td></tr></tbody></table>

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

[![image.png](https://ilmu.di.mbip.my/uploads/images/gallery/2024-07/scaled-1680-/XPQimage.png)](https://ilmu.di.mbip.my/uploads/images/gallery/2024-07/XPQimage.png)

# 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.

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

# 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',

];
```

<span style="color: rgb(0, 0, 0);">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:</span>

```
<?php
// lang/ms/registration.php

return [

    'welcome' => 'Selamat datang ke aplikasi kami!',
    'tajuk_daftar' => 'Pendaftaran Baru'

];
```

<span style="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);">untuk memaparkan teks tersebut di dalam page, gunakan arahan blade seperti di bawah:</span>

```
{{ __('registration.welcome') }}
```

<span style="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);">registration -&gt; adalah nama fail dalam folder 'lang'</span>

<span style="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);">welcome -&gt; adalah array key untuk teks yang hendak dipaparkan.</span>

<span style="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);">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.</span>

```
'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

# 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](http://pdfmake.org).

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 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:

<p class="callout info">php artisan make:middleware RoleMiddleware</p>

Ini akan create file `app/Http/Middleware/RoleMiddleware.php`.

##### 2. Edit Middleware Logic

Contoh `RoleMiddleware`:

> &lt;?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()-&gt;route('login');  
>  }
> 
>  // Check kalau role user termasuk dalam list roles yang dibenarkan  
>  if (! in\_array($user-&gt;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:

> -&gt;withMiddleware(function (Middleware $middleware) {  
>  $middleware-&gt;alias(\[  
>  'role' =&gt; \\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'\])-&gt;group(function () {  
>  Route::get('/admin', \[AdminController::class, 'index'\])-&gt;name('admin.dashboard');  
> });
> 
> Route::middleware(\['role:pengundi'\])-&gt;group(function () {  
>  Route::get('/pengundi/cabutan', \[PengundiController::class, 'cabutan'\])-&gt;name('pengundi.cabutan');  
> });
> 
> Route::middleware(\['role:datukbandar'\])-&gt;group(function () {  
>  Route::get('/datukbandar', \[DatukBandarController::class, 'dashboard'\])-&gt;name('datukbandar.dashboard');  
> });
> 
> // kalau ada route share by 2 role  
> Route::middleware(\['role:admin,datukbandar'\])-&gt;group(function () {  
>  Route::get('/laporan', \[ReportController::class, 'index'\]);  
> });