Skip to content

Apa aja sih yang baru? ​

Setiap perubahan itu pasti ada dan wajar, jadi kami harap kamu dapat menerima perubahan ini yaa.

Perubahan dengan versi terbau ​

  1. Minimal Laravel 11.x

    Karena Laravel 11.x berbeda secara signifikan dari versi sebelumnya, jadi kami memutuskan untuk menghentikan dukungan untuk Laravel 10. Versi terendah yang didukung saat ini adalah Laravel 11

  2. Memperbarui beberapa pustaka yang dibutuhkan:

    Dan yang dibutuhkan untuk proses pengembangan:

  3. Menghapus (opsional) App\Generators\GeneratorUtils kelas dan melakukan perubahan pada helper kelas, Disini untuk lebih lanjut

  4. Memperbaiki Bug dan Error

Untuk daftar perubahan terbaru dan lebih lengkap, silakan kunjungi GitHub Rilis

Cara memperbarui ​

  1. Jika kamu masih menggunakan Laravel 10.x, harap pertimbangkan untuk membaca Panduan peningkatan Laravel 11.x

  2. Ubah pustaka berikut pada composer.json

    json
    "require": {
         "laravel/framework to": "^11.0", 
    },
    "require-dev": {
         "nunomaduro/collision": "^8.1", 
         "evdigiina/generator": "^0.3.0",  
    }

Opsional, jika kamu menggunakannya

json
"require": {
     "spatie/laravel-permission": "^6.0", 
     "laravel/fortify": "^1.21"
},

Lalu jalankan perintah berikut

sh
composer update
  1. Publikasikan berkas terbaru

    sh
    php artisan generator:publish-utils
  2. Tambahkan kode berikut pada resources/views/layouts/sidebar.blade.php

    blade
     <ul class="menu">
         {{-- New code --}}
         @auth
             <li class="sidebar-item{{ request()->is('/') || request()->is('dashboard') ? ' active' : '' }}">
                 <a class="sidebar-link" href="/">
                     <i class="bi bi-speedometer"></i>
                     <span> {{ __('Dashboard') }}</span>
                 </a>
             </li>
         @endauth
    
         {{-- Your sidebar code --}}
         @foreach (config('generator.sidebars') as $sidebar)
             {{-- ... --}}
         @endforeach
    
         {{-- New code --}}
         @if (env('APP_ENV') === 'local')
             <li class="sidebar-title">{{ __('Generators') }}</li>
    
             <li class="sidebar-item{{ request()->is('generators/create') ? ' active' : '' }}">
                 <a class="sidebar-link" href="{{ route('generators.create') }}">
                     <i class="bi bi-fire"></i>
                     <span>{{ __('CRUD Generator') }}</span>
                 </a>
             </li>
    
             <li class="sidebar-item{{ request()->is('api-generators/create') ? ' active' : '' }}">
                 <a class="sidebar-link" href="/api-generators/create">
                     <i class="bi bi-rocket"></i>
                     <span>{{ __('API CRUD Generator') }}</span>
                 </a>
             </li>
    
             <li class="sidebar-item{{ request()->is('simple-generators/create') ? ' active' : '' }}">
                 <a class="sidebar-link" href="/simple-generators/create">
                     <i class="bi bi-droplet"></i>
                     <span>{{ __('Simple CRUD Generator') }}</span>
                     </a>
                 </li>
             @endif
    
         {{-- New code --}}
         @auth
             <li class="sidebar-title">Account</li>
    
             <li class="sidebar-item{{ request()->is('profile') ? ' active' : '' }}">
                 <a class="sidebar-link" href="{{ route('profile') }}">
                     <i class="bi bi-person-badge-fill"></i>
                     <span>{{ __('Profile') }}</span>
                 </a>
             </li>
    
             <li class="sidebar-item">
                 <a class="sidebar-link" href="{{ route('logout') }}" onclick="event.preventDefault(); document.getElementById('logout-form').submit();">
                     <i class="bi bi-door-open-fill"></i>
                     <span>{{ __('Logout') }}</span>
                 </a>
    
                 <form id="logout-form" action="{{ route('logout') }}" method="POST" class="d-none">
                     @csrf
                 </form>
             </li>
         @endauth
     </ul>
  3. Ubah kode pada resources/views/layouts/header.blade.php menjadi seperti dibawah ini

    blade
    <div class="collapse navbar-collapse" id="navbarSupportedContent">
        <ul class="navbar-nav ms-auto mb-lg-0">
            {{-- Your code --}}
        </ul>
    
        {{-- New code --}}
        @auth
            <div class="dropdown">
                <a href="#" data-bs-toggle="dropdown" aria-expanded="false">
                    <div class="user-menu d-flex">
                        <div class="user-name text-end me-3">
                            <h6 class="mb-0 text-gray-600">{{ auth()?->user()?->name }}</h6>
                            <p class="mb-0 text-sm text-gray-600">
                                {{ isset(auth()?->user()?->roles) ? implode(auth()?->user()?->roles?->map(fn ($role) => $role->name)->toArray()) : '-' }}
                            </p>
                        </div>
                        <div class="user-img d-flex align-items-center">
                            <div class="avatar avatar-md">
                                @if (auth()?->user()?->avatar == null)
                                    <img src="https://www.gravatar.com/avatar/{{ md5(strtolower(trim(auth()?->user()?->email))) }}&s=500" alt="Avatar">
                                @else
                                    <img src="{{ asset('storage/uploads/avatars/' . auth()?->user()?->avatar) }}" alt="Avatar">
                                @endif
                            </div>
                        </div>
                    </div>
                </a>
                
                <ul class="dropdown-menu dropdown-menu-end" aria-labelledby="dropdownMenuButton" style="min-width: 11rem;">
                    <li>
                        <h6 class="dropdown-header">{{ __('Hello') }}, {{ auth()?->user()?->name }}!</h6>
                    </li>
                    <li>
                        <a class="dropdown-item" href="{{ route('profile') }}"><i class="icon-mid bi bi-person-fill me-2"></i>{{ __('My Profile') }}</a>
                    </li>
                    <li>
                        <a class="dropdown-item" href="{{ route('logout') }}" onclick="event.preventDefault();document.getElementById('logout-form-nav').submit();">
                            <i class="bi bi-door-open-fill"></i>
                            {{ __('Logout') }}
                        </a>
    
                        <form id="logout-form-nav" action="{{ route('logout') }}" method="POST" class="d-none">
                            @csrf
                        </form>
                    </li>
                </ul>
            </div>
        @endauth
    </div>
  4. Buat file generator.cache di vendor/evdigiina/generator lalu copy kode di bawah ini

    json
    { "simple_version_publish_count": 0, "full_version_publish_count": 1 }

INFO

Ubah simple_version_publish_count atau full_version_publish_count menjadi 1 sesuaikan dengan versi yang kamu gunakan

  1. Ubah config/generator.php dari image.path menjadi image.disk

    php
    "image" => [
        /**
         * Path for store the image.
         *
         * available options:
         * 1. public
         * 2. storage
        */
        "path" => "storage", 
    ]
    php
    "image" => [
        /**
         * Image storage location
         *
         * Available options:
         * 1. public
         * 2. storage
         * 3. S3
        */
        "disk" => "storage", 
        // ... another configuration
    ]

    Untuk informasi tambahan tentang perubahan ini, buka di sini

  2. Jika kamu mendapation masalah berikut setelah membuat modul baru, silakan baca dokumentasi mengenai Middleware Laravel 11 baru di Controller di sini

    Error middleware

    Jika kamu tidak memerlukan Middleware, cukup hapus komentar pada kode tersebut atau gunakan gaya Middleware Laravel 10 di bawah ini.

    php
     // comment code below
     public static function middleware(): array
     {
         return [
             // 'auth',
    
             // TODO: uncomment this code if you are using spatie permission
             // new Middleware('permission:permission_name view', only: ['index', 'show']),
             // new Middleware('permission:permission_name create', only: ['create', 'store']),
             // new Middleware('permission:permission_name edit', only: ['edit', 'update']),
             // new Middleware('permission:permission_name delete', only: ['destroy']),
         ];
     }

    Ubah menjadi Laravel 10 Middleware seperti di bawah ini

    php
    public function __construct()
    {
        $this->middleware('permission:permission_name view')->only('index', 'show');
        $this->middleware('permission:permission_name create')->only('create', 'store');
        $this->middleware('permission:permission_name edit')->only('edit', 'update');
        $this->middleware('permission:permission_name delete')->only('destroy');
    }

    Dari

    php
    use Illuminate\Routing\Controllers\{HasMiddleware, Middleware}; 
    
    class YourController extends Controller implements HasMiddleware
    {
        //...
    }

    Menjadi

    php
    // use Illuminate\Routing\Controllers\{HasMiddleware, Middleware};
    
    class YourController extends Controller
    { 
        //...
    }

    Jangan lupa hapus atau berikan komentar pada kode use Illuminate\Routing\Controllers\{HasMiddleware, Middleware};

Fitur Terbaru 🔥 ​

Fitur terbaru yang ditambahkan pada versi Generator ^0.3.x:

  1. (beta) Generator dapat membuat kelas Seeder dan Factory

  2. (beta) CRUD API Generator 🚀

    Sekarang kamu dapat membuat API yang cepat dan mudah menggunakan CRUD API Generator

  3. Single Form

    Buat CRUD dalam satu halaman dan Form. Fitur ini ideal untuk membuat halaman seperti pengaturan, profil web, dan fitur lainnya yang hanya memiliki 1 data saja.

  4. Menambahkan kelas terbaru ImageService

    Kelas ini digunakan untuk melakukan unggah gambar dan manipulasi gambar menggunakan Intervention Image

  5. Menambahkan opsi baru ke konfigurasi generator.image.disk, yang sebelumnya adalah generator.image.path, kini kamu dapat menggunakan opsi public, storage, atau s3. Berikut ini contohnya

php
"image" => [
    /**
     * Image storage location
     *
     * Available options:
     * 1. public
     * 2. storage
     * 3. S3
     *
     * change path to disk
    */
    "disk" => "storage", 
    
    // other configuration codes.
]

Untuk menggunakan opsi s3, kamu harus membaca dokumentasi terkait di sini

Dan jika kamu menggunakan opsi storage, pastikan kamu menjalankan perintah berikut

sh
php artisan storage:link

Jika ingin melihat konfigurasi terbarunya ada di bawah ini yaa:

php
return [
    /**
     * If any input file(image) as default will use options below.
     */
    "image" => [  
        /**
         * Path for store the image.
         *
         * Available options:
         * 1. public
         * 2. storage
         * 3. S3
         */
        "disk" => "storage",  

        /**
         * Will be used if image is nullable and default value is null.
         */
        "default" => "https://via.placeholder.com/350?text=No+Image+Avaiable",  

        /**
         * Crop the uploaded image using intervention image.
         */
        "crop" => true,  

        /**
         * When set to true the uploaded image aspect ratio will still original.
         */
        "aspect_ratio" => true,  

        /**
         * Crop image size.
         */
        "width" => 500,  
        "height" => 500,  
    ],

    "format" => [  
        /**
         * Will be used to first year on select, if any column type year.
         */
        "first_year" => 1970,  

        /**
         * If any date column type will cast and display used this format, but for input date still will used Y-m-d format.
         *
         * another most common format:
         * - M d Y
         * - d F Y
         * - Y m d
         */
        "date" => "Y-m-d",  

        /**
         * If any input type month will cast and display used this format.
         */
        "month" => "Y/m",  

        /**
         * If any input type time will cast and display used this format.
         */
        "time" => "H:i",  

        /**
         * If any datetime column type or datetime-local on input, will cast and display used this format.
         */
        "datetime" => "Y-m-d H:i:s",  

        /**
         * Limit string on index view for any column type text or long text.
         */
        "limit_text" => 100,  
    ],

    /**
     * It will be used for generator to manage and showing menus on sidebar views.
     *
     * Example:
     * [
     *   'header' => 'Main',
     *
     *   // All permissions in menus[] and submenus[]
     *   'permissions' => ['test view'],
     *
     *   menus' => [
     *       [
     *          'title' => 'Main Data',
     *          'icon' => '<i class="bi bi-collection-fill"></i>',
     *          'route' => null,
     *
     *          // permission always null when isset submenus
     *          'permission' => null,
     *
     *          // All permissions on submenus[] and will empty[] when submenus equals to []
     *          'permissions' => ['test view'],
     *
     *          'submenus' => [
     *                 [
     *                     'title' => 'Tests',
     *                     'route' => '/tests',
     *                     'permission' => 'test view'
     *                  ]
     *               ],
     *           ],
     *       ],
     *  ],
     *
     * This code below always changes when you use a generator, and maybe you must format the code.
     */
    "sidebars" => [  
        [ 
            "header" => "Main",  
            "permissions" => ["test view"],  
            "menus" => [  
                [  
                    "title" => "Main Data",  
                    "icon" => '<i class="bi bi-collection-fill"></i>',  
                    "route" => null,  
                    "permission" => null,  
                    "permissions" => ["test view"],  
                    "submenus" => [  
                        [  
                            "title" => "Tests",  
                            "route" => "/tests",  
                            "permission" => "test view",  
                        ],  
                    ],  
                ],  
            ],  
        ],  
        [  
            "header" => "Users",  
            "permissions" => ["user view", "role & permission view"],  
            "menus" => [  
                [  
                    "title" => "Users",  
                    "icon" => '<i class="bi bi-people-fill"></i>',  
                    "route" => "/users",  
                    "permission" => "user view",  
                    "permissions" => [],  
                    "submenus" => [],  
                ],  
                [  
                    "title" => "Roles & permissions",  
                    "icon" => '<i class="bi bi-person-check-fill"></i>',  
                    "route" => "/roles",  
                    "permission" => "role & permission view",  
                    "permissions" => [],  
                    "submenus" => [],  
                ],  
            ],  
        ],  
    ],  
];  
  1. Dokumentasi terbaru 📖

    Kami kesulitan ketika membuat dokumentasi untuk banyak versi dan bahasa menggunakan MkDocs, oleh karena itu kami memutuskan untuk membuat dokumentasi baru menggunakan Vitepress.