krisnaxyoga/krisna-crud-gen

Laravel Portable CRUD Engine — Single Source Schema for Admin UI + REST API.

Maintainers

Package info

github.com/krisnaxyoga/krisna-crud-gen

pkg:composer/krisnaxyoga/krisna-crud-gen

Transparency log

Statistics

Installs: 19

Dependents: 0

Suggesters: 0

Stars: 0

Open Issues: 0

0.8.1 2026-08-08 02:11 UTC

This package is auto-updated.

Last update: 2026-08-08 05:04:22 UTC


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.

tests PHP Laravel License

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) atau vue/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 Product untuk 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:make masih 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 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 (termasuk Rule::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