krisnaxyoga / krisna-crud-gen
Laravel Portable CRUD Engine â Single Source Schema for Admin UI + REST API.
Requires
- php: ^8.2
- illuminate/database: ^10.0|^11.0|^12.0|^13.0
- illuminate/http: ^10.0|^11.0|^12.0|^13.0
- illuminate/support: ^10.0|^11.0|^12.0|^13.0
Requires (Dev)
- orchestra/testbench: ^8.0|^9.0|^10.0
- phpunit/phpunit: ^10.0|^11.0
README
Single Source Schema â REST API + Admin UI otomatis untuk Laravel. Definisikan 1 file schema PHP, dapatkan REST API lengkap (Sanctum), validasi, dan (opsional) Admin Panel Inertia â tanpa menulis controller, route, atau tabel manual.
Fitur
- ðŊ Single Source Schema â 1 class mendefinisikan fields, validasi, UI props, & API.
- ⥠REST API otomatis â
index/show/store/update/destroy+ endpoint schema, per slug. - ð Aman by design â search/sort hanya kolom yang dideklarasikan; validasi & mass-assignment dibatasi schema.
- ð§Đ Type-safe & fluent â PHP 8 typed properties, enum, attribute, fluent chaining (autocomplete penuh).
- ðŠķ Ringan â hanya bergantung pada komponen
illuminate/*. - ð Safe-Eject â ubah schema menjadi Controller + FormRequest fisik kapan pun butuh custom logic ekstrem.
- ðïļ Admin Panel opsional â default API-only. Aktifkan saat install dan pilih tampilannya:
blade(server-side, tanpa build) atauvue/react/svelte(Inertia). - ðž Admin Panel ber-DaisyUI â komponen lengkap untuk keempat tampilan, CSS-nya sudah dikompilasi & ikut dibundel, jadi tidak wajib memasang Tailwind sendiri.
- ð ïļ Generator â
php artisan krisnaxyoga:crud Productuntuk scaffold schema (+ model & migration) dalam satu perintah.
Instalasi
Via Packagist (jika sudah dipublish)
composer require krisnaxyoga/krisna-crud-gen
Via VCS (langsung dari GitHub, tanpa Packagist)
Tambahkan di composer.json aplikasi:
{
"repositories": [
{ "type": "vcs", "url": "https://github.com/krisnaxyoga/krisna-crud-gen" }
],
"require": {
"krisnaxyoga/krisna-crud-gen": "^0.1"
}
}
composer update krisnaxyoga/krisna-crud-gen
Instalasi cepat
php artisan crud:install
Interaktif, dua pertanyaan:
Pasang Admin Panel juga? (tanpa ini, output hanya REST API) [yes/no]
âŊ Tampilan Admin Panel [blade]:
[0] blade
[1] vue
[2] react
[3] svelte
Jawab no â tetap seperti semula: hanya REST API, tanpa route admin, tanpa aset.
Non-interaktif:
php artisan crud:install --frontend=api # hanya REST API (paling ringan) php artisan crud:install --frontend=blade # Admin Panel server-side (tanpa npm/build) php artisan crud:install --frontend=vue # Admin Panel Inertia + Vue php artisan crud:install --frontend=react # Admin Panel Inertia + React php artisan crud:install --frontend=svelte # Admin Panel Inertia + Svelte php artisan crud:install --frontend=blade --theme=dracula # sekaligus set tema DaisyUI
Perintah ini men-set CRUD_ENGINE_FRONTEND di .env, mem-publish aset yang sesuai (termasuk CSS DaisyUI untuk semua mode Admin Panel), dan menampilkan langkah manual yang tersisa per mode.
Prasyarat REST API (Sanctum)
php artisan install:api
Tambahkan trait Laravel\Sanctum\HasApiTokens ke model User.
Publish konfigurasi (opsional)
php artisan vendor:publish --tag=crud-engine-config
Cara membuat CRUD
Cara 1 â Generator (krisnaxyoga:crud) ⥠direkomendasikan
Scaffold schema (opsional + model & migration) dalam satu perintah:
php artisan krisnaxyoga:crud Product --model --migration \
--fields="name:string, price:number, description:richtext, is_active:boolean"
Argumen & opsi:
| Bagian | Fungsi |
|---|---|
Product |
Nama resource (StudlyCase). Menghasilkan ProductResource & slug products. |
--fields="col:type,..." |
Definisi field. Tanpa ini â satu field teks name. |
--model |
Sekaligus buat model Eloquent App\Models\Product. |
--migration |
Buat model + migration. |
--force |
Timpa schema yang sudah ada. |
Menghasilkan app/CrudSchemas/ProductResource.php lengkap dengan field + import sesuai tipe. Kolom name otomatis searchable()->sortable().
Tipe --fields yang didukung: string, text, textarea, number, integer, decimal, email, password, boolean, select, date, datetime, file, image, richtext, belongsTo.
Langkah setelah generate:
# 1. Lengkapi kolom migration sesuai field, lalu: php artisan migrate # 2. Selesai â REST API /api/crud/products aktif. # Bila frontend != api, Admin Panel /admin/products juga aktif.
Alias lama
crud:makemasih berfungsi.
Cara 2 â Manual
1. Buat model + migration seperti biasa (php artisan make:model Product -m).
2. Buat schema di app/CrudSchemas/ProductResource.php:
<?php namespace App\CrudSchemas; use App\Models\Product; use Krisnaxyoga\CrudGen\Attributes\ApiResource; use Krisnaxyoga\CrudGen\Fields\{TextField, NumberField, SelectField}; use Krisnaxyoga\CrudGen\Resource; #[ApiResource(slug: 'products', perPage: 25)] class ProductResource extends Resource { public function model(): string { return Product::class; } public function fields(): array { return [ TextField::make('name')->required()->searchable()->sortable(), SelectField::make('status')->options(['draft' => 'Draft', 'published' => 'Published'])->required(), NumberField::make('price')->required()->min(0), ]; } }
3. Selesai. REST API langsung aktif (auto-discovery dari app/CrudSchemas):
| Method | Endpoint |
|---|---|
GET |
/api/crud/products/schema |
GET |
/api/crud/products â ?search= ?sort=-price ?per_page= ?page= |
POST |
/api/crud/products |
GET |
/api/crud/products/{id} |
PUT/PATCH |
/api/crud/products/{id} |
DELETE |
/api/crud/products/{id} |
Katalog Field
| Class | Tipe | Validasi dasar |
|---|---|---|
TextField |
text | string |
TextareaField |
textarea | string |
NumberField |
number | numeric |
EmailField |
email |
|
PasswordField |
password | string, min:8 |
BooleanField |
boolean | boolean |
SelectField |
select | string / array |
DateField |
date / datetime | date |
FileUploadField |
file | file / image |
RichTextField |
richtext | string (HTML) |
BelongsToField |
belongsTo | exists:{tabel},{kolom} |
Contoh fluent
TextField::make('title')->required()->max(200)->searchable()->sortable()->unique()->columnSpan(6); SelectField::make('role')->options(['admin' => 'Admin', 'user' => 'User'])->multiple(); NumberField::make('price')->min(0)->step(0.01); FileUploadField::make('image')->image()->disk('public')->directory('products')->maxKb(2048); BelongsToField::make('category_id')->relation(Category::class, 'name'); RichTextField::make('body');
Safe-Eject
Ketika butuh custom logic ekstrem, "lulus"-kan resource dari engine menjadi file fisik mandiri:
php artisan crud:eject products # generate controller + request + routes php artisan crud:eject products --force # timpa php artisan crud:eject products --purge # + hapus schema
Menghasilkan:
app/Http/Controllers/Crud/ProductController.phpâ CRUD lengkap (search/sort/paginate inline)app/Http/Requests/Crud/ProductRequest.phpâ rules create/update dari schema (termasukRule::unique()->ignore($id))routes/crud/products.php
Lalu require __DIR__ . '/crud/products.php'; di routes/api.php dan hapus schema-nya.
Konfigurasi
config/crud-engine.php:
return [ // api | blade | vue | react | svelte (route admin nonaktif saat 'api') 'frontend' => env('CRUD_ENGINE_FRONTEND', 'api'), 'api' => ['prefix' => 'api/crud', 'middleware' => ['api', 'auth:sanctum']], 'admin' => [ 'prefix' => 'admin', 'middleware' => ['web', 'auth'], 'theme' => env('CRUD_ENGINE_THEME', 'light'), // tema DaisyUI 'brand' => env('CRUD_ENGINE_BRAND', 'CRUD Engine'), ], 'schema_path' => app_path('CrudSchemas'), 'schema_namespace' => 'App\\CrudSchemas', ];
Admin Panel (opsional)
Package ini API-first. Admin Panel sepenuhnya opsional: default api, dan route admin hanya didaftarkan bila crud-engine.frontend bukan api. Tidak memilih Admin Panel = tidak ada route admin, tidak ada aset, tidak ada beban.
Bila dipilih, keempat tampilan memakai DaisyUI dengan komponen yang setara â bukan salah satu saja.
| Mode | Yang aktif | Build tool | Komponen dibundel |
|---|---|---|---|
api (default) |
Hanya REST API /api/crud |
â | â |
blade |
+ Admin Panel server-side | â tanpa npm | Blade views |
vue |
+ Admin Panel Inertia | â Vite | 12 komponen .vue |
react |
+ Admin Panel Inertia | â Vite | 12 komponen .jsx |
svelte |
+ Admin Panel Inertia | â Vite | 12 komponen .svelte |
Tiap mode Inertia mendapat: Layouts/AdminLayout, Pages/CrudEngine/{Dashboard,Index,Form}, dan Components/Fields/* (renderer + 7 field: input, textarea, select, toggle, date, file upload, rich text).
CSS: tidak perlu setup Tailwind
crud:install mem-publish public/vendor/crud-engine/admin.css â hasil kompilasi Tailwind v4 + DaisyUI v5 yang ikut terdistribusi bersama package. Panel langsung tampil benar, offline, tanpa npm install tailwindcss.
Sudah punya Tailwind + DaisyUI sendiri? Hapus baris <link> di resources/views/app.blade.php dan pastikan resources/js/** ikut dipindai konfigurasi Tailwind-mu.
Catatan: CSS bundel hanya memuat kelas yang dipakai komponen bawaan. Kalau kamu menambah kelas DaisyUI baru di komponen hasil publish, kelas itu perlu build Tailwind milikmu sendiri.
Tema
CRUD_ENGINE_THEME=dracula CRUD_ENGINE_BRAND="Panel Toko"
Tema yang ikut dibundel: light (default), dark, corporate, business, emerald, night, nord, dracula. Dipasang sebagai <html data-theme="âĶ">. Tema di luar daftar itu perlu build CSS sendiri (lihat Build ulang CSS).
Mode api
Tidak ada UI. Konsumsi kontrak GET /api/crud/{slug}/schema untuk membangun UI apa pun sendiri.
Mode blade
php artisan crud:install --frontend=blade
Dirender penuh di server â tanpa npm/build sama sekali. Buka /admin. Kustomisasi: php artisan vendor:publish --tag=crud-engine-views.
Mode vue / react / svelte
php artisan crud:install --frontend=react
Mem-publish komponen ke resources/js/**, membuat entry Vite yang sesuai (app.js untuk Vue/Svelte, app.jsx untuk React) dan resources/views/app.blade.php. Lengkapi langkah yang ditampilkan command:
| Mode | Dependensi npm |
|---|---|
vue |
vue @inertiajs/vue3 @vitejs/plugin-vue |
react |
react react-dom @inertiajs/react @vitejs/plugin-react |
svelte |
svelte @inertiajs/svelte @sveltejs/vite-plugin-svelte |
Lalu daftarkan plugin di vite.config.js, jalankan php artisan inertia:middleware, dan npm run build.
Komponen Svelte memakai sintaks Svelte 5 (runes). Untuk Svelte 4, sesuaikan
$props()/$derivedâ tiap komponen punya catatannya.
Mem-publish ulang komponen tanpa crud:install:
php artisan vendor:publish --tag=crud-engine-vue # atau -react / -svelte php artisan vendor:publish --tag=crud-engine-assets # CSS saja
Route admin:
/admin(dashboard),/admin/{slug}(tabel),/admin/{slug}/create,/admin/{slug}/{id}/edit. Halaman login spesifik aplikasi â sediakan sendiri.
Build ulang CSS (kontributor)
Hanya perlu bila mengubah template package atau menambah tema:
cd build npm install npm run build # -> resources/dist/admin.css npm run verify # cek semua komponen Vue/React/Svelte bisa dikompilasi
Requirements
- PHP 8.2+
- Laravel 10 / 11 / 12 / 13
laravel/sanctum(untuk REST API terproteksi Bearer)
Testing
composer install composer test # 51 tests cd build && npm install npm run verify # 36 komponen Vue/React/Svelte dikompilasi
CI (GitHub Actions) menjalankan suite PHP pada 8.2, 8.3, dan 8.4, plus job terpisah yang mengompilasi seluruh komponen Admin Panel dan memastikan resources/dist/admin.css tidak basi terhadap template.
Lisensi
MIT ÂĐ krisnaxyoga