vormiaphp/vormia
Vormia is a lightweight PHP/Laravel package offering a simple foundation for building apps with clean structure and reusable components. It focuses on straightforward setup and developer-friendly conventions for organizing code and speeding up common tasks.
Installation:
composer require vormiaphp/vormia
php artisan vormia:install
--stack=livewire|inertia for CI).routes/api.php and app/Notifications.Run Migrations:
php artisan migrate
User Model Setup (Critical):
Add traits to app/Models/User.php:
use Vormia\Vormia\Traits\Model\HasSlugs;
use Vormia\Vormia\Traits\Model\HasUserMeta;
use Vormia\Vormia\Traits\Model\HasRolesPermissions;
class User extends Authenticatable
{
use HasSlugs, HasUserMeta, HasRolesPermissions;
}
First Use Case:
// Create a user with meta data
$user = User::create([
'name' => 'John Doe',
'email' => 'john@example.com',
'password' => bcrypt('password'),
]);
$user->setMeta('preferences', ['theme' => 'dark']);
$user->assignRole('admin'); // Requires HasRolesPermissions
docs/INSTALLATION.md (Laravel 12/Livewire 4 specific)vendor/vormiaphp/vormia/src/Vormia/Vormia/Traits/ (Core functionality)vendor/vormiaphp/vormia/src/Vormia/Vormia/Middleware/ (Role/Permission checks)app/Jobs/Vrm/ and app/Jobs/V1/ (Post-installation)// Assign roles to user
$user->assignRole('editor');
$user->assignRole('moderator');
// Check permissions
if ($user->can('edit_posts')) {
// Grant access
}
// Middleware (auto-registered)
Route::middleware(['role:admin'])->group(function () {
// Admin-only routes
});
use Vormia\Vormia\Facades\MediaForge;
// Upload and process image
$path = $request->file('avatar')->store('avatars');
$processed = MediaForge::make($path)
->resize(200, 200)
->watermark('logo.png', 0.2)
->save();
// Store processed path in user meta
$user->setMeta('avatar_processed', $processed);
// Send notification
$user->notify(new Vrm\WelcomeNotification($user));
// Queue delayed notification
Vrm\WelcomeNotification::dispatch($user)->delay(now()->addHours(1));
// Protected API route (auto-handled by `api-auth` middleware)
Route::middleware(['api-auth'])->get('/user', function (Request $request) {
return $request->user();
});
Form Handling:
use Vormia\Vormia\Livewire\Forms\VrmForm;
public function mount() {
$this->form = new VrmForm([
'name' => '',
'email' => '',
]);
}
public function rules() {
return [
'name' => 'required|string|max:255',
'email' => 'required|email',
];
}
Livewire Components:
Vormia\Vormia\Livewire\Components\VrmComponent for shared functionality.VrmTable for data grids with built-in pagination/sorting.Page Components:
// Inertia Controller
public function show(User $user) {
return Inertia::render('Users/Show', [
'user' => $user->load('roles', 'meta'),
]);
}
Shared Logic:
Vormia\Vormia\Services\VrmService for cross-cutting concerns (e.g., role checks).meta table (key-value pairs).
$user->setMeta('analytics', ['last_visit' => now()]);
HasSlugs trait.
$post = Post::create(['title' => 'Hello World']);
// $post->slug = 'hello-world' (auto-generated)
Missing Traits:
Call to undefined method App\Models\User::setMeta()HasSlugs, HasUserMeta, HasRolesPermissions) are added to User model.API Authentication:
401 Unauthorized on API routesHasApiTokens trait to User model and run php artisan install:api during installation.Livewire JS Dependencies:
$ is not defined (jQuery missing)npm install if using Livewire stack (installer should handle this, but verify resources/js/app.js includes Vormia imports).Meta Data Serialization:
json_encode()/json_decode() manually or rely on Vormia’s built-in serialization:
$user->setMeta('settings', ['theme' => 'dark', 'notifications' => true]);
$settings = $user->getMeta('settings', []); // Returns decoded array
Middleware Order:
role middleware not workingauth:sanctum in app/Http/Kernel.php:
'api' => [
\Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
'throttle:api',
\Vormia\Vormia\Middleware\ApiAuth::class,
\Vormia\Vormia\Middleware\Role::class, // <-- Must come after auth
],
Log Middleware Decisions:
// In app/Http/Middleware/Role.php (override Vormia's middleware)
public function handle($request, Closure $next) {
\Log::info('Role check for user: ' . $request->user()->id);
return $next($request);
}
Check Meta Data:
// Dump all meta for a model
\Log::debug('User meta:', $user->meta);
Validate Roles/Permissions:
// Debug role assignments
\Log::debug('User roles:', $user->roles->pluck('name'));
Environment Variables:
.env keys (e.g., APP_URL, FILESYSTEM_DISK).php artisan vendor:publish --provider="Vormia\Vormia\VormiaServiceProvider" --tag="config"
File System:
public disk for uploads. Override in config/vormia.php:
'disk' => 's3',
'path' => 'vormia/uploads',
Notification Channels:
Vormia\Vormia\Notifications\Channels\VrmChannel for custom channels.Custom Roles/Permissions:
// Extend Vormia's role system
use Vormia\Vormia\Contracts\Role;
class CustomRole implements Role {
public function getPermissions() {
return ['custom:permission'];
}
}
Media Processing:
// Add custom image filter
MediaForge::extend('custom', function ($image) {
return $image->sepia();
});
Livewire Components:
// Create reusable Livewire component
class VrmUserTable extends VrmComponent {
public function render() {
return view('livewire.vrm-user-table', [
'users' => User::with('roles')->paginate(10),
]);
}
}
API Resources:
// Extend Vormia's API responses
class ExtendedUserResource extends \Vormia\Vormia\Http\Resources\UserResource {
How can I help you explore Laravel packages today?