Backend & DevOps2026-08-19 7 min read

eropadevcom/admin: Laravel Admin with JWT and Config-Driven CRUD

Open-source Laravel 13 admin package: clear benefits, JWT + web UI, config-driven Products CRUD, media and audit logs — with practical examples.

ED
EropaDev Tech Team
Backend Architect
#Laravel #PHP #Admin Panel #JWT #Packagist #Open Source #CRUD

Key benefits

JWT + Web admin in one package

Session UI for operators and JWT APIs for SPA/mobile — without stitching auth packages by hand.

Config-driven CRUD

New entity = PHP config file. You get list, form, validation, menu item and REST endpoint together.

Media without schema pollution

image/media fields store files in admin_media once. No duplicate path columns on every model.

Audit trail by default

created/updated/deleted/viewed with old/new values. Useful for support and compliance from day one.

Hooks instead of hardcoded ifs

Extend behavior with EntityHookRegistry, policies and lifecycle events — keep domain logic clean.

Ready for Laravel 13 / PHP 8.3

MIT package on Packagist with Pint, PHPStan and PHPUnit in the quality bar.

Most Laravel products need an admin panel early: users, roles, pages, uploads, logs, and an API for a mobile or SPA client. Teams usually rebuild this stack from scratch. Three sprints later the “temporary admin” becomes a private framework.

eropadevcom/admin is our open-source answer for Laravel 13+ / PHP 8.3+: web admin, JWT admin API, client auth, config-driven entities, media, i18n and activity logs in one MIT package.

Source: gitlab.com/package_eropadev/admin

Why teams choose it

  • Faster launch — install and seed, then work on product logic instead of login screens
  • One source of truth — fields, columns, roles and API visibility live in entity config
  • UI and API stay aligned — the same entity powers /admin/entities/{key} and /admin/api/entities/{key}
  • Safe extension — hooks/events/policies instead of forking controllers
  • Ops-friendly — activity logs and central media storage reduce support pain

Install in minutes

composer require eropadevcom/admin
php artisan admin:install
php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"
php artisan jwt:secret
php artisan db:seed --class="Eropadevcom\Admin\Database\Seeders\AdminTestSeeder"

Wire JWT + roles on your User model:

use Eropadevcom\Admin\Traits\HasJwtAuth;
use Eropadevcom\Admin\Traits\HasRoles;
use Tymon\JWTAuth\Contracts\JWTSubject;

class User extends Authenticatable implements JWTSubject
{
    use HasFactory, Notifiable, HasJwtAuth, HasRoles;
}

After that you already have:

  1. Web login at /admin/login
  2. Admin JWT at /admin/api/login
  3. Client JWT at /api/login and /api/register
  4. Built-in entities: users, roles, pages, menus, languages, settings, activity logs

Best example: Products CRUD from config

Copy config/eropadevcom/admin/example/entity.php to entities/products.php:

<?php

return [
    'label' => 'admin::entities.products.label',
    'model' => App\Models\Product::class,
    'roles' => ['admin'],
    'with' => ['category'],
    'order' => ['id' => 'desc'],
    'crud' => ['create' => true, 'edit' => true, 'delete' => true],
    'api' => ['enabled' => true],

    'fields' => [
        ['name' => 'name', 'type' => 'text', 'rules' => ['required', 'string', 'max:255']],
        ['name' => 'price', 'type' => 'number', 'rules' => ['required', 'numeric', 'min:0']],
        ['name' => 'is_active', 'type' => 'checkbox', 'rules' => ['nullable', 'boolean']],
        ['name' => 'cover', 'type' => 'image', 'rules' => ['nullable', 'image', 'max:5120']],
        [
            'name' => 'gallery',
            'type' => 'media',
            'multiple' => true,
            'kinds' => ['image', 'video'],
            'rules' => ['nullable', 'array'],
            'rules.*' => ['file', 'max:51200'],
        ],
    ],

    'relations' => [
        'tags' => [
            'type' => 'belongsToMany',
            'input' => 'tag_ids',
            'display' => 'name',
            'model' => App\Models\Tag::class,
        ],
    ],

    'columns' => [
        ['key' => 'id', 'label' => 'ID'],
        ['key' => 'name', 'label' => 'Name'],
        ['key' => 'price', 'label' => 'Price'],
        ['key' => 'is_active', 'label' => 'Active', 'type' => 'boolean'],
    ],
];

Add to menu:

['entity' => 'products'],

You immediately get:

  • UI: /admin/entities/products
  • API: /admin/api/entities/products

No custom controller. Validation rules stay next to the field definition.

Practical scenario

Marketplace MVP with catalog, CMS pages and Flutter app:

  1. Products/categories become entity configs in a day
  2. Operators work in /admin
  3. Flutter uses JWT + entity API
  4. Covers go through admin_media
  5. Price changes are visible in activity logs

Your time goes to checkout and pricing rules — not another homemade admin kit.

When to use it

Use eropadevcom/admin if you need a production admin fast, both browser UI and JWT API, CRUD that grows by config, plus media/i18n/roles/audit without five separate packages.

Latest release: v1.2.2 (MIT).

  • Packagist: https://packagist.org/packages/eropadevcom/admin
  • GitLab: https://gitlab.com/package_eropadev/admin
Published by EropaDev Engineering Team