friends-of-behat/variadic-extension
Installation:
composer require friends-of-behat/variadic-extension --dev
Add to behat.yml:
extensions:
FriendsOfBehat\VariadicExtension: ~
First Use Case: Replace repetitive step definitions like:
/**
* @When I have :count items
*/
public function iHaveOneItem() { ... }
/**
* @When I have :count items
*/
public function iHaveTwoItems($count) { ... }
With a single variadic method:
/**
* @When I have :count items
*/
public function iHaveItems($count, ...$additionalArgs) { ... }
Step Definition Consolidation:
Use variadic arguments (...$args) to handle dynamic argument counts:
/**
* @When I perform action :action on :target with :options
*/
public function performAction($action, $target, ...$options) {
if (empty($options)) {
// Handle minimal args
} else {
// Process additional args
}
}
Integration with Laravel:
public function __construct(private UserRepository $users) {}
app() helper in contexts:
$this->users = app(UserRepository::class);
Type Safety: Combine with PHP 7.4+ typed properties or return types:
public function calculateTotal(float ...$prices): float { ... }
public function processItems(...$items) {
if (count($items) < 1) {
throw new \InvalidArgumentException("At least one item required");
}
}
public function configure($name, ...$config) {
$defaults = ['timeout' => 30];
$merged = array_merge($defaults, $config);
}
Argument Order Sensitivity: Variadic args must be last in the method signature. This will fail:
// ❌ Wrong
public function example(...$args, $required) { ... }
Behat Step Matching:
@user When I have :count items
@Given/@When/@Then consistently to avoid conflicts.Performance:
$this->userService->process(...$args);
Enable Verbose Output:
behat --verbose
Reveals argument parsing details.
Check Step Registry:
behat --dry-run
Validates step definitions before execution.
Custom Argument Parsers:
Extend FriendsOfBehat\VariadicExtension\ArgumentParser for domain-specific types.
Laravel-Specific:
$this->app->bind(FeatureContext::class, function () {
return new FeatureContext(app(UserRepository::class));
});
$this->app['config']['behat.timeout'];
Testing:
$this->context->processItems(...['item1', 'item2']);
How can I help you explore Laravel packages today?