andrew-gos/class-builder
PHP library to construct objects from arrays or scalars using constructor reflection. Supports interfaces/abstracts via AvailableInheritors, conditional building with BuildIf checkers, typed arrays, variadics, and union/intersection parameter types.
composer require andrew-gos/class-builder
use AndrewGos\ClassBuilder\ClassBuilder;
$builder = new ClassBuilder();
$object = $builder->build(YourClass::class, ['param1' => 'value1']);
class User {
public function __construct(
private string $name,
private int $age
) {}
}
$user = $builder->build(User::class, [
'name' => 'John Doe',
'age' => 30
]);
Attribute/: For customization options like @Field, @ArrayType, etc.Checker/: For conditional object building logic.// Standard constructor mapping
$order = $builder->build(Order::class, [
'customer_id' => 1,
'items' => [['product_id' => 101, 'quantity' => 2]]
]);
#[AvailableInheritors([AdminUser::class, GuestUser::class])]
interface User {}
$builder->build(User::class, ['role' => 'admin']); // Returns AdminUser
class Cart {
public function __construct(
#[ArrayType('Product')] private array $products
) {}
}
$cart = $builder->build(Cart::class, [
'products' => [
['id' => 1, 'name' => 'Laptop'],
['id' => 2, 'name' => 'Phone']
]
]);
#[CanBeBuiltFromScalar]
class Id {
public function __construct(private int $value) {}
}
$id = $builder->build(Id::class, 42); // Direct scalar input
class Profile {
public function __construct(
#[Field('full_name')] private string $name
) {}
}
$profile = $builder->build(Profile::class, [
'full_name' => 'Alice Smith'
]);
ClassBuilder as a singleton in Laravel's service container:
$app->singleton(ClassBuilder::class, fn() => new ClassBuilder());
FormRequest classes to validate and build objects:
public function build(array $data) {
return resolve(ClassBuilder::class)->build(YourModel::class, $data);
}
return response()->json($builder->build(UserResource::class, $userData));
Type Mismatches:
InvalidArgumentException.BuildIf with custom CheckerInterface implementations to validate data before building.Circular Dependencies:
User has Address, Address has User) will fail.null placeholders.Attribute Overrides:
@Field or @ArrayType must be applied to constructor parameters, not properties.Performance with Large Arrays:
#[ArrayType(User::class)]) can be slow for large datasets.ArrayType constraints.$builder = new ClassBuilder(verbose: true); // Logs building steps
ReflectionClass to verify parameter names/types if builds fail silently:
$reflection = new ReflectionClass(YourClass::class);
print_r($reflection->getConstructor()->getParameters());
Custom Checkers:
Implement CheckerInterface for dynamic validation:
class MinAgeChecker implements CheckerInterface {
public function check(array $data): bool {
return $data['age'] >= 18;
}
}
Apply with @BuildIf(new MinAgeChecker()).
Post-Build Hooks:
Extend ClassBuilder to add callbacks after object creation:
$builder->afterBuild(fn($object) => $this->logObject($object));
Custom Type Builders:
Override ClassBuilder::buildType() to handle unsupported types (e.g., custom collections).
ClassBuilder is registered as a singleton, ensure it’s not overridden by multiple bindings.config/class-builder.php:
'default_checkers' => [
'min_age' => \App\Checkers\MinAgeChecker::class,
],
Load via:
$builder = new ClassBuilder(config('class-builder'));
$builder->buildBatch(User::class, $usersData);
How can I help you explore Laravel packages today?