Pertanyaan ini muncul ketika saya sedang membuat sebuah web builder (SaaS), bagaimana caranya menampilkan seluruh list google font, dan ketika kita memilih font tersebut, maka font di website kita juga akan otomatis menjadi seperti font yang telah kita pilih.
dan berikut langkah-langkah yang saya kerjakan.
Buat Tabel Database (Migration)
php artisan make:migration create_fonts_table
Edit file migration:
// database/migrations/xxxx_xx_xx_create_fonts_table.php
public function up()
{
Schema::create('fonts', function (Blueprint $table) {
$table->id();
$table->string('family');
$table->string('category')->nullable();
$table->json('variants')->nullable();
$table->json('subsets')->nullable();
$table->string('version')->nullable();
$table->string('lastModified')->nullable();
$table->timestamps();
});
}
Lalu jalankan:
php artisan migrate
Buat Model:
php artisan make:model Font
Ambil Data dari Google Fonts API
Buat command khusus untuk ambil data dan simpan ke DB:
php artisan make:command SyncGoogleFonts
Isi file app/Console/Commands/SyncGoogleFonts.php
:
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Http;
use App\Models\Font;
class SyncGoogleFonts extends Command
{
protected $signature = 'fonts:sync';
protected $description = 'Sync all Google Fonts and save to database';
public function handle()
{
$apiKey = env('GOOGLE_FONTS_API_KEY'); // Simpan API Key di .env
$url = "https://www.googleapis.com/webfonts/v1/webfonts?key={$apiKey}&sort=popularity";
$this->info('Mengambil data font dari Google Fonts API...');
$response = Http::get($url);
if ($response->successful()) {
$fonts = $response->json()['items'];
foreach ($fonts as $font) {
Font::updateOrCreate(
['family' => $font['family']],
[
'category' => $font['category'] ?? null,
'variants' => $font['variants'] ?? [],
'subsets' => $font['subsets'] ?? [],
'version' => $font['version'] ?? null,
'lastModified' => $font['lastModified'] ?? null,
]
);
}
$this->info("Berhasil menyimpan " . count($fonts) . " fonts ke database.");
} else {
$this->error('Gagal mengambil data dari API.');
}
}
}
update model Font, pada app/Models/Font.php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Font extends Model
{
use HasFactory;
protected $fillable = [
'family',
'category',
'variants',
'subsets',
'version',
'lastModified',
];
// Jika variants dan subsets adalah array/json, tambahkan cast
protected $casts = [
'variants' => 'array',
'subsets' => 'array',
];
}
Tambahkan API Key di .env
GOOGLE_FONTS_API_KEY=your_real_api_key_here
Jalankan Command:
php artisan fonts:sync
- Font akan langsung tersimpan ke tabel
fonts
di database!
Contoh Isi Tabel:
id | family | category | variants | subsets | lastModified | version |
1 | Roboto | sans-serif | [“regular”,”700″] | [“latin”,”cyrillic”] | 2023-12-01 | v29 |
2 | Lato | sans-serif | [“300″,”regular”] | [“latin”] | 2023-11-10 | v22 |
untuk menampilkan datanya, kita akan buat dengan cara seperti berikut:
Ambil Data Font di Controller
// app/Http/Controllers/FontController.php
use App\Models\Font;
public function index()
{
$fonts = Font::all(); // atau pakai paginate/sort sesuai kebutuhan
$selectedFont = $request->get('font', 'Poppins');
return view('fonts.index', compact('fonts', 'selectedFont'));
}
Tampilkan di Blade View (resources/views/fonts/index.blade.php)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Font Selector</title>
{{-- Load Google Fonts jika ada selected font --}}
@if($selectedFont)
<link href="https://fonts.googleapis.com/css2?family={{ str_replace(' ', '+', $selectedFont) }}&display=swap" rel="stylesheet">
<style>
body {
font-family: '{{ $selectedFont }}', sans-serif;
}
</style>
@endif
</head>
<body>
<h2>Font Selector (Laravel Blade)</h2>
<form method="GET" action="{{ route('fonts.index') }}">
<label for="fontSelect">Pilih Font:</label>
<select name="font" id="fontSelect" onchange="this.form.submit()">
@foreach($fonts as $font)
<option value="{{ $font->family }}" {{ $selectedFont == $font->family ? 'selected' : '' }}>
{{ $font->family }}
</option>
@endforeach
</select>
</form>
<p style="margin-top: 2rem;">
Ini adalah teks preview dengan font: <strong>{{ $selectedFont }}</strong>
</p>
</body>
</html>
Hasil:
- Font list ditampilkan dari database.
- User pilih font → halaman reload otomatis (
onchange="submit()"
). - Font langsung diterapkan via Google Fonts +
font-family
di<style>
.