Installation
composer require respect/parameter
Add to composer.json under require-dev if only for testing.
Basic Usage
use Respect\Parameter\Parameter;
use Respect\Parameter\Exception\ParameterException;
$container = new DI\Container(); // PSR-11 compatible container
$parameter = new Parameter($container);
try {
$service = $parameter->resolve('MyService'); // Resolves by type
} catch (ParameterException $e) {
// Handle missing/incorrect resolution
}
First Use Case Resolve a constructor dependency in a Laravel service provider:
public function register()
{
$this->app->bind(MyClass::class, function ($app) {
$parameter = new Parameter($app);
return new MyClass(
$parameter->resolve(MyDependency::class)
);
});
}
Constructor Injection
class MyService {
public function __construct(
private MyDependency $dependency,
private AnotherDependency $another
) {}
}
// Resolve via:
$service = $parameter->resolve(MyService::class);
Method Injection
$service = $parameter->resolve(MyService::class);
$service->doSomething(
$parameter->resolve(RequiredParam::class)
);
Laravel Service Container Integration
// In a controller/middleware:
$this->parameter->resolve(AuthService::class)->check();
$parameter->resolve('App\Services\AuthService');
$parameter->resolve(LoggerInterface::class); // Resolves concrete implementation
$parameter->resolve(OptionalService::class, false); // Returns null if missing
// In PHPUnit tests:
$mockContainer = $this->createMock(ContainerInterface::class);
$mockContainer->method('get')->willReturn(new MockService());
$parameter = new Parameter($mockContainer);
$result = $parameter->resolve(MockService::class);
$this->assertInstanceOf(MockService::class, $result);
Circular Dependencies
Non-PSR-11 Containers
Psr\Container\ContainerInterface.Illuminate\Container\Container) with a PSR-11 adapter.Type Hinting Mismatches
Performance Overhead
resolve() for the same type may trigger redundant lookups.app()->make() already does this).Enable Debug Mode
$parameter = new Parameter($container, Parameter::DEBUG);
Logs resolution attempts to stderr.
Check Container Contents
if ($container->has(MyService::class)) {
// Proceed with resolution
}
Custom Resolvers Override resolution logic via a decorator:
$parameter = new Parameter($container);
$parameter->setResolver(function ($type) {
return new CustomResolver($type);
});
Parameter Objects
Use Respect\Parameter\ParameterObject for immutable parameter configurations:
$paramObj = new ParameterObject($container, MyService::class);
$service = $paramObj->resolve();
Laravel-Specific Tip
Bind the package to Laravel’s container in AppServiceProvider:
$this->app->singleton(Parameter::class, function ($app) {
return new Parameter($app);
});
Then inject Parameter directly into classes:
public function __construct(private Parameter $parameter) {}
How can I help you explore Laravel packages today?