Installation
composer require coder-at-heart/object-models
Register the service provider in config/app.php under providers:
CoderAtHeart\ObjectModels\ObjectModelsServiceProvider::class,
Basic Usage
Define a model class extending CoderAtHeart\ObjectModels\ObjectModel:
use CoderAtHeart\ObjectModels\ObjectModel;
class UserModel extends ObjectModel
{
protected $schema = [
'id' => 'integer',
'name' => 'string',
'email' => 'string',
'is_active' => 'boolean',
];
}
First Use Case: Parsing JSON
$json = '{"id": 1, "name": "John", "email": "john@example.com"}';
$user = UserModel::fromJson($json);
echo $user->name; // Outputs: John
Key Files to Explore
src/ObjectModel.php: Core class with schema validation, casting, and control logic.src/ObjectModelsServiceProvider.php: Service provider for package registration.tests/: Unit tests demonstrating usage patterns.integer, string, boolean, array, object).
protected $schema = [
'posts' => 'array',
'metadata' => 'object',
];
protected $schema = [
'user.address.city' => 'string',
'user.address.zip' => 'integer',
];
$data = ['id' => '123', 'is_active' => 'yes'];
$user = UserModel::fromArray($data);
// $user->id is integer, $user->is_active is boolean
protected $schema = [
'is_active' => ['type' => 'boolean', 'default' => true],
];
protected $rules = [
'email' => 'required|email',
'age' => 'integer|min:18',
];
validate() or cast() methods for custom logic:
protected function castIsActive($value)
{
return strtolower($value) === 'true';
}
class User extends Model
{
public function toApiResponse()
{
return UserModel::fromArray($this->toArray());
}
}
$requestData = $request->all();
$userModel = UserModel::fromArray($requestData);
if ($userModel->isValid()) {
// Proceed with valid data
}
$jsonArray = '[{"id": 1}, {"id": 2}]';
$users = UserModel::collectionFromJson($jsonArray);
foreach ($users as $user) {
echo $user->id;
}
// Fails: 'Name' !== 'name'
$data = ['Name' => 'John'];
$user = UserModel::fromArray($data); // Throws exception
user.friends containing user).$model->errors() for validation failures:
$user = UserModel::fromArray(['email' => 'invalid']);
if ($user->hasErrors()) {
dd($user->errors());
}
dumpSchema() to inspect schema:
$user = new UserModel();
$user->dumpSchema(); // Outputs schema structure
config/object-models.php (if provided in future updates).fromArray()/fromJson(), not on instantiation. Initialize with empty data to defer validation:
$user = new UserModel(['id' => null]); // No validation until data is set
CoderAtHeart\ObjectModels\Casters\CasterInterface for custom types:
class DateCaster implements CasterInterface
{
public function cast($value, $type)
{
return \Carbon\Carbon::parse($value);
}
}
Register in ObjectModel:
protected $customCasters = [
'date' => DateCaster::class,
];
protected function beforeValidate()
{
// Pre-validation logic
}
protected function afterCast()
{
// Post-casting logic
}
ObjectModel instances for repeated operations:
$user = new UserModel();
foreach ($jsonArray as $data) {
$user->fromArray($data);
// Use $user->data
}
$user = new UserModel(['validate' => false]);
$user->fromArray($data);
How can I help you explore Laravel packages today?