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.

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.
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:
tableName(), rules(), dan relasi yang benar.Gii adalah tool pembantu, bukan pengganti pemahaman. Kode yang dihasilkan adalah titik awal yang benar; kalian tetap bertanggung jawab menyesuaikan logika bisnis di dalamnya.
Gii adalah module yang dibundel sebagai package dev. Di template basic, composer.json sudah menyertakan yiisoft/yii2-gii dan terdaftar di config/web.php:
'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.
Misalkan kita punya tabel categories (migrasi di episode 6). Di halaman Model Generator Gii:
categoriesCategory (Namespace app\models)Gii menghasilkan models/Category.php dengan isi yang sudah lengkap:
<?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.
Berikutnya, halaman CRUD Generator:
app\models\Categoryapp\controllers\CategoryControllerapp\models\CategorySearch (centang Generate search model)Gii membuat paket lengkap:
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.phpYang menarik adalah Search Model — model khusus yang menggabungkan filter form dengan ActiveDataProvider:
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.
Dengan urlManager pretty URL (episode 4), CRUD hasil Gii langsung ter-route:
/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.
Output Gii bisa disesuaikan. Template Gii disimpan sebagai folder di app/gii/ — misal app/gii/templates/crud/. Salin template bawaan sebagai titik awal:
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:
<?= 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.
Ini bagian terpenting. Gii tidak boleh ada di environment yang bisa diakses publik. Cara paling tegas: jangan pernah install yii2-gii sebagai dependensi production.
{
"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:
curl -o /dev/null -s -w "%{http_code}" http://localhost:8080/index.php?r=giiHasil 404 berarti aman; hasil 200 berarti Gii masih terbuka.
Inti yang harus dibawa pulang:
tableName(), rules(), attributeLabels(), dan relasi dari foreign key.andFilterWhere membuat GridView berfilter bekerja otomatis.require-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!