nayjest/builder
Fluent builder library for PHP that helps assemble complex objects step by step. Chainable API supports configurable construction flows and optional validation to keep setup readable and maintainable, useful for DTOs, services, and more.
Installation:
composer require nayjest/builder
No service provider or facade needed—just autoload the Nayjest\Builder\Builder class.
First Use Case: Build a simple configuration array or object:
use Nayjest\Builder\Builder;
$config = (new Builder())
->set('database', 'mysql')
->set('host', 'localhost')
->set('port', 3306)
->get();
// Returns: ['database' => 'mysql', 'host' => 'localhost', 'port' => 3306]
Where to Look First:
Builder::set(), Builder::get(), and method chaining.Fluent Configuration Composition:
$user = (new Builder())
->set('name', 'John Doe')
->set('roles', ['admin', 'user'])
->set('active', true)
->get();
Nested Structures:
$apiConfig = (new Builder())
->set('base_uri', 'https://api.example.com')
->set('headers', (new Builder())
->set('Accept', 'application/json')
->set('Authorization', 'Bearer token')
->get()
)
->get();
Laravel Integration:
$this->app->bind('config.builder', function () {
return new Builder();
});
$settings = app('config.builder')
->set('theme', request('theme', 'default'))
->set('locale', app()->getLocale())
->get();
Object Construction:
class User {
public $name;
public $email;
}
$user = (new Builder())
->setObject(new User())
->set('name', 'Jane Smith')
->set('email', '[email protected]')
->getObject();
Reusable Builders:
class UserBuilder extends Builder {
public function withDefaultRoles() {
return $this->set('roles', ['user']);
}
}
$admin = (new UserBuilder())
->withDefaultRoles()
->set('roles', ['admin'])
->get();
Immutable State:
Builder::get() returns a copy of the internal array. Modify the result without affecting the builder:
$data = (new Builder())->set('key', 'value')->get();
$data['key'] = 'new_value'; // Original builder remains unchanged.
Object Mutation:
setObject() modifies the passed object by reference. Avoid unexpected side effects:
$user = new User();
(new Builder())->setObject($user)->set('name', 'Alice');
// $user->name is now 'Alice' (modified in-place).
No Deep Cloning:
set('headers', (new Builder())->...)) are not deeply cloned on get(). Use clone explicitly if needed.Last Release Age:
Inspect State:
$builder = (new Builder())->set('key', 'value');
var_dump($builder->getInternal()); // Debug raw state.
Method Chaining Validation:
$this for fluent chaining. Override if extending:
class CustomBuilder extends Builder {
public function customMethod() {
$this->set('custom', true);
return $this; // Critical for chaining!
}
}
Custom Setters:
class QueryBuilder extends Builder {
public function where($field, $value) {
$this->set("where.$field", $value);
return $this;
}
}
$query = (new QueryBuilder())
->where('status', 'active')
->get();
// Returns: ['where.status' => 'active']
Validation Hooks:
class ValidatedBuilder extends Builder {
public function get() {
if (!$this->has('required_field')) {
throw new \RuntimeException('Missing required field!');
}
return parent::get();
}
}
Laravel Service Provider Integration:
$this->app->extend('config.builder', function ($builder) {
$builder->set('app.env', env('APP_ENV'));
return $builder;
});
How can I help you explore Laravel packages today?