3neti / laravel-model-input
A package to enable assigning inputs to Eloquent Models
v1.1.0
2026-04-10 00:46 UTC
Requires
- propaganistas/laravel-phone: ^6.0
- spatie/laravel-data: ^4.17
Requires (Dev)
- orchestra/testbench: ^10.3
- pestphp/pest: ^3.8
README
A Laravel package that enables dynamic, validated inputs attached to Eloquent models.
Features:
- attach arbitrary named inputs to any model (polymorphic)
- enforce validation rules per input type (via enum-driven rules)
- normalize mobile numbers (via laravel-phone)
- dynamic getters/setters via magic accessors
- query models by input (e.g., find by mobile)
- DTO support for structured responses
This package serves as a flexible input layer within the x-change ecosystem.
โจ Core Concept
Instead of adding many columns to a model, you can attach typed inputs:
- mobile
- signature
- address
- bank_account
- etc.
Each input:
- is stored in a separate
inputstable - is validated using rules defined per input type
- can be accessed like a normal attribute
๐ฆ Installation
composer require 3neti/laravel-model-input
โ๏ธ Configuration
Publish config (optional):
php artisan vendor:publish --tag=config
๐งฑ Database Migrations
This package uses:
loadMigrationsFrom()
Run:
php artisan migrate
๐ง Usage
Add trait to your model
use LBHurtado\ModelInput\Traits\HasInputs; class User extends Model { use HasInputs; }
Set input
$user->setInput('mobile', '09171234567');
or using enum:
use LBHurtado\ModelInput\Enums\InputType; $user->setInput(InputType::MOBILE, '09171234567');
Force set (skip validation)
$user->forceSetInput('mobile', '09171234567');
Access input like attribute
$user->mobile; $user->signature;
Validate input
$user->isValidInput('email', 'test@example.com');
Query by input
User::findByMobile('09171234567'); User::findByInput('mobile', '09171234567');
Supports:
- normalized matching
- partial matching
- flexible formats
Direct access
$user->input('mobile');
๐ฑ Mobile Normalization
Mobile inputs are automatically normalized to:
E.164 format (without "+")
Examples:
- 0917xxxxxxx
- +63917xxxxxxx
- 63917xxxxxxx
All resolve to the same stored value.
๐งฉ Input Types
Defined via enum:
InputType::MOBILE InputType::EMAIL InputType::SIGNATURE InputType::OTP ...
Each input type has validation rules defined in config:
model-input.rules.mobile
๐งพ Schema
inputs
- id
- model_type
- model_id
- name
- value
- timestamps
๐งฑ Traits
HasInputsโ core functionality- dynamic getters/setters
- validation and normalization
๐งช Testing
- Testbench
- SQLite in-memory
- test-only migrations under
tests/database/migrations
๐งญ Architecture Role
In x-change ecosystem:
- contact โ identity
- model-input โ dynamic attributes layer
- cash โ value
- voucher โ instruction
- wallet โ ledger
๐ Design Principles
- avoid schema explosion
- strongly typed inputs via enum
- validation-first design
- flexible querying
- normalization of sensitive fields (e.g., mobile)
๐ Future Enhancements
- input history versioning
- encryption support
- indexing optimizations
- event hooks
๐งพ License
Proprietary