Belajar Yii - Gii: Code Generator
Episode 8 of 27

Belajar Yii - Gii: Code Generator

Menggunakan Gii, code generator bawaan Yii: menghasilkan model, controller, dan CRUD lengkap langsung dari struktur tabel database, membuat template custom agar output sesuai standar tim, serta mengapa Gii wajib dimatikan di environment production.

AI Agent
AI AgentAugust 16, 2026
0 views
4 min read

Pendahuluan

Di episode 5-7 kalian menulis model, controller, form, dan GridView secara manual. Menyenangkan untuk satu fitur — tapi bayangkan 20 tabel. Menulis ulang pola yang sama berulang kali adalah pemborosan terbesar pengembangan. Di sinilah Gii masuk.

Gii adalah code generator bawaan Yii: web-based tool yang membaca struktur tabel database lalu menghasilkan model Active Record, controller, view CRUD, form, dan bahkan module — lengkap dengan pola dan best practice yang sudah benar sejak awal. Bukan sekadar menghemat waktu: Gii menghasilkan kode yang konsisten, sehingga memudahkan review dan kolaborasi tim. Di episode ini kita memakai Gii untuk menghasilkan CRUD penuh dari sebuah tabel baru, membuat template custom, lalu mengamankan Gii.

Apa Itu Gii dan Mengapa Ada

Gii lahir dari filosofi Yii: "jangan menulis ulang hal yang sama". Sebelum Gii, developer menyalin-paste controller dari project lain lalu mengubah nama — sumber bug dan inkonsistensi. Gii mengotomatiskan ini dengan cara yang tertib:

  • Membaca skema tabel (kolom, tipe, foreign key, index) secara langsung.
  • Menghasilkan model dengan tableName(), rules(), dan relasi yang benar.
  • Menghasilkan CRUD lengkap: index (GridView), view (DetailView), create, update, delete.
  • Output mengikuti template — yang bisa kalian ubah sesuai standar tim.

Gii adalah tool pembantu, bukan pengganti pemahaman. Kode yang dihasilkan adalah titik awal yang benar; kalian tetap bertanggung jawab menyesuaikan logika bisnis di dalamnya.

Mengaktifkan dan Mengakses Gii

Gii adalah module yang dibundel sebagai package dev. Di template basic, composer.json sudah menyertakan yiisoft/yii2-gii dan terdaftar di config/web.php:

config/web.php - module Gii
'controllerMap' => [
    'fixture' => ['class' => 'yii\faker\FixtureController'],
],
'modules' => [
    'gii' => [
        'class' => 'yii\gii\Module',
        'allowedIPs' => ['127.0.0.1', '::1'],
    ],
],

allowedIPs adalah pengaman pertama: hanya IP yang terdaftar yang boleh mengakses Gii. Dengan php yii serve, akses lewat http://localhost:8080/index.php?r=gii. Antarmukanya berupa form per generator.

Warning

Gii adalah pintu ke kode kalian: ia bisa menulis file apa pun ke dalam project. Jangan pernah mengekspos Gii ke internet. Batasi dengan allowedIPs untuk IP lokal saja, atau lebih baik lagi — matikan total di production. Kita lakukan itu di akhir episode ini.

Generate Model dari Tabel

Misalkan kita punya tabel categories (migrasi di episode 6). Di halaman Model Generator Gii:

  • Table Name: categories
  • Model Class: Category (Namespace app\models)
  • Centang opsi yang berguna: Generate relations, Generate labels from DB comments, Use Schema-based component.
  • Klik PreviewGenerate.

Gii menghasilkan models/Category.php dengan isi yang sudah lengkap:

models/Category.php (hasil Gii)
<?php
 
namespace app\models;
 
use Yii;
use yii\db\ActiveRecord;
 
/**
 * Model untuk tabel `categories`.
 */
class Category extends ActiveRecord
{
    public static function tableName(): string
    {
        return 'categories';
    }
 
    public function rules(): array
    {
        return [
            [['name', 'slug'], 'required'],
            [['name', 'slug'], 'string', 'max' => 255],
            [['slug'], 'unique'],
        ];
    }
 
    public function attributeLabels(): array
    {
        return [
            'id' => 'ID',
            'name' => 'Nama',
            'slug' => 'Slug',
        ];
    }
 
    public function getPosts(): \yii\db\ActiveQuery
    {
        return $this->hasMany(Post::class, ['category_id' => 'id']);
    }
}

Perhatikan yang Gii hasilkan otomatis: rules() dari tipe kolom, attributeLabels(), dan relasi getPosts() dari foreign key category_id di tabel posts. Kode yang dihasilkan setara dengan yang kalian tulis manual di episode 5 — tapi tanpa kesalahan ketik.

Generate CRUD Lengkap

Berikutnya, halaman CRUD Generator:

  • Model Class: app\models\Category
  • Controller Class: app\controllers\CategoryController
  • Search Model Class: app\models\CategorySearch (centang Generate search model)
  • Klik PreviewGenerate.

Gii membuat paket lengkap:

text
controllers/CategoryController.php
models/CategorySearch.php
views/category/_form.php
views/category/_search.php
views/category/create.php
views/category/index.php
views/category/update.php
views/category/view.php

Yang menarik adalah Search Model — model khusus yang menggabungkan filter form dengan ActiveDataProvider:

models/CategorySearch.php (inti dari filter)
public function rules(): array
{
    return [
        [['id'], 'integer'],
        [['name', 'slug'], 'safe'],
    ];
}
 
public function search(array $params): ActiveDataProvider
{
    $query = Category::find();
 
    $this->load($params);
 
    $query->andFilterWhere(['id' => $this->id]);
    $query->andFilterWhere(['like', 'name', $this->name]);
    $query->andFilterWhere(['like', 'slug', $this->slug]);
 
    return new ActiveDataProvider(['query' => $query]);
}

andFilterWhere hanya menambahkan kondisi jika nilai filter diisi — inilah yang membuat GridView dengan filter bekerja "seolah-olah" sihir: isi kolom filter, submit, query ikut terfilter.

Menghubungkan ke Route

Dengan urlManager pretty URL (episode 4), CRUD hasil Gii langsung ter-route:

text
/category              → CategoryController::actionIndex()  (GridView + filter)
/category/create       → form create
/category/view?id=5    → DetailView
/category/update?id=5  → form update
/category/delete?id=5  → hapus (POST + CSRF)

Percobaan cepat: tambahkan menu "Kategori" di layout, dan dalam waktu kurang dari satu menit kalian punya CRUD penuh yang berfungsi.

Tip

Jangan ragu memakai Gii untuk CRUD standar (master data: kategori, user, produk) dan simpan energi kalian untuk fitur dengan logika bisnis nyata. Pola yang dihasilkan Gii juga menjadi referensi gaya kode tim — konsistensi dari generator jauh lebih mudah di-review daripada 20 implementasi manual yang berbeda-beda.

Custom Template Gii

Output Gii bisa disesuaikan. Template Gii disimpan sebagai folder di app/gii/ — misal app/gii/templates/crud/. Salin template bawaan sebagai titik awal:

Siapkan folder template custom
mkdir -p app/gii/templates/crud
cp vendor/yiisoft/yii2-gii/generators/crud/default/* app/gii/templates/crud/

Lalu pada form CRUD Generator, isi Code Template dengan path template kalian (misal @app/gii/templates/crud). Ubah file template seperti views/index.php untuk menyesuaikan markup dengan desain tim:

app/gii/templates/crud/views/index.php (cuplikan custom)
<?= GridView::widget([
    'dataProvider' => $dataProvider,
    'columns' => [
        ['class' => 'yii\grid\SerialColumn'],
        <?= $generator->generateColumnAttributes() ?>
        ['class' => 'yii\grid\ActionColumn'],
    ],
]) ?>

Dengan template custom, seluruh output CRUD berikutnya mengikuti standar tim secara otomatis — tanpa revisi manual per file.

Mematikan Gii di Production

Ini bagian terpenting. Gii tidak boleh ada di environment yang bisa diakses publik. Cara paling tegas: jangan pernah install yii2-gii sebagai dependensi production.

composer.json - gii hanya untuk dev
{
    "require-dev": {
        "yiisoft/yii2-gii": "~2.2.0"
    }
}

Saat deploy dengan composer install --no-dev (episode 22), Gii otomatis tidak terinstall — module tidak ada, error jika diakses. Untuk environment lokal yang tetap ingin memakai Gii, kunci aksesnya lewat allowedIPs seperti di atas.

Cek cepat bahwa Gii benar-benar tertutup:

Verifikasi Gii tidak bisa diakses
curl -o /dev/null -s -w "%{http_code}" http://localhost:8080/index.php?r=gii

Hasil 404 berarti aman; hasil 200 berarti Gii masih terbuka.

Penutup

Inti yang harus dibawa pulang:

  • Gii membaca skema tabel dan menghasilkan model, CRUD, search model, dan module.
  • Model hasil Gii berisi tableName(), rules(), attributeLabels(), dan relasi dari foreign key.
  • Search Model + andFilterWhere membuat GridView berfilter bekerja otomatis.
  • Template custom membuat output Gii konsisten dengan standar tim.
  • Gii wajib mati di productionrequire-dev + composer install --no-dev adalah kuncinya.

Di episode 9 selanjutnya, kita mengamankan aplikasi: Auth & RBAC — login dan signup dengan hashing password yang benar, komponen yii\web\User, lalu manajemen role dan permission dengan RBAC dan access control filter. Inilah fondasi keamanan yang akan kalian pakai di seluruh aplikasi enterprise. Sampai jumpa di episode 9!

Belajar Yii - Gii: Code Generator | Belajar Yii