aegisora / is-callable-rule-guardian
Is Callable Rule Guardian provides a simple shortcut for callable validation using aegisora/guardian and aegisora/is-callable-rule
Package info
github.com/Aegisora/is-callable-rule-guardian
pkg:composer/aegisora/is-callable-rule-guardian
Requires
- php: >=7.4
- aegisora/guardian: ^1.0
- aegisora/is-callable-rule: ^1.0
Requires (Dev)
- phpstan/phpstan: ^2.1
- phpunit/phpunit: ^9.6
- squizlabs/php_codesniffer: ^4.0
README
Is Callable Rule Guardian provides a simple shortcut for callable validation using aegisora/guardian and aegisora/is-callable-rule.
It is designed for cases where you want to quickly check whether a value is callable, without manually building an IsCallableRule and a validation pipeline by hand.
This package is built on top of:
โจ Features
- ๐น Simple shortcut API for
IsCallableRule - ๐น Validates that a value is callable via
check() - ๐น Works with closures, invokable objects, function names and array callables
- ๐น Uses
aegisora/guardianinternally - ๐น Uses
aegisora/is-callable-ruleinternally - ๐น Supports a custom validation exception
- ๐น Keeps rule execution errors separated from validation errors
- ๐น Fully compatible with the Aegisora ecosystem
- ๐น Ready to use out of the box
๐ฆ Installation
composer require aegisora/is-callable-rule-guardian
๐ Core Concept
This package wraps the common callable validation flow:
$guardian->check( $value, IsCallableRule::create(), new ValueIsNotCallableException() );
into a dedicated shortcut class:
$isCallableRuleGuardian->check($value, new ValueIsNotCallableException());
Instead of manually creating an IsCallableRule and passing it to Guardian, you can use IsCallableRuleGuardian directly.
๐๏ธ Basic Usage
use Aegisora\Guardian\Guardian; use Aegisora\Guardian\Exceptions\GuardianValidationException; use Aegisora\RuleGuardians\IsCallableRule\IsCallableRuleGuardian; $guardian = new Guardian(); $isCallableRuleGuardian = new IsCallableRuleGuardian($guardian); try { $isCallableRuleGuardian->check($value); // $value is callable } catch (GuardianValidationException $exception) { // $value is not callable }
check() passes when $value is callable, and fails otherwise.
โ How the callable check works
A value is considered callable when it can be invoked as a function:
$isCallableRuleGuardian->check(static fn (): string => 'ok'); // passes (closure) $isCallableRuleGuardian->check('trim'); // passes (function name) $isCallableRuleGuardian->check([SomeClass::class, 'method']); // passes (static array callable) $isCallableRuleGuardian->check([new SomeClass(), 'method']); // passes (instance array callable) $isCallableRuleGuardian->check(1); // fails (int) $isCallableRuleGuardian->check('fooo'); // fails (non-callable string) $isCallableRuleGuardian->check([]); // fails (array) $isCallableRuleGuardian->check(new stdClass()); // fails (non-invokable object) $isCallableRuleGuardian->check(['UnknownClass', 'method']); // fails (invalid array callable)
An object is also callable when it implements the __invoke() magic method.
๐งฉ Usage with Custom Exception
You may provide your own exception for validation failure. It must be the last argument.
use Aegisora\Guardian\Guardian; use Aegisora\RuleGuardians\IsCallableRule\IsCallableRuleGuardian; use App\Exceptions\ValueIsNotCallableException; $guardian = new Guardian(); $isCallableRuleGuardian = new IsCallableRuleGuardian($guardian); $isCallableRuleGuardian->check( $value, new ValueIsNotCallableException() );
If the value is not callable, the provided exception will be thrown instead of GuardianValidationException.
This is useful when validation errors should have domain-specific meaning.
๐งช Example in Application Service
use Aegisora\RuleGuardians\IsCallableRule\IsCallableRuleGuardian; use App\Exceptions\InvalidHandlerException; final class HandlerRegistry { private IsCallableRuleGuardian $isCallableRuleGuardian; public function __construct( IsCallableRuleGuardian $isCallableRuleGuardian ) { $this->isCallableRuleGuardian = $isCallableRuleGuardian; } /** * @param mixed $handler */ public function register(string $name, $handler): void { $this->isCallableRuleGuardian->check( $handler, new InvalidHandlerException() ); // business logic for registering a callable handler } }
๐จ Exceptions
The package raises validation-related exceptions, all delegated to Guardian (the outcome of running the rule):
GuardianValidationException
Thrown when validation fails and no custom exception is provided.
The rule code for a failed callable check is is_callable_rule.
use Aegisora\Guardian\Exceptions\GuardianValidationException; try { $isCallableRuleGuardian->check($value); } catch (GuardianValidationException $exception) { echo $exception->getRuleCode(); // "is_callable_rule" }
Custom exception
When a custom exception is passed as the last argument, it is thrown instead of GuardianValidationException on validation failure.
use App\Exceptions\ValueIsNotCallableException; try { $isCallableRuleGuardian->check($value, new ValueIsNotCallableException()); } catch (ValueIsNotCallableException $exception) { // domain-specific handling }
GuardianExecutingRuleException
Thrown when the underlying rule fails to execute (raises a RuleException during validation), as opposed to simply reporting an invalid result.
The callable check accepts any value type and reports non-callable values as an invalid result, so this exception is not triggered by the input itself โ it is surfaced only if Guardian fails to execute the rule.
use Aegisora\Guardian\Exceptions\GuardianExecutingRuleException; try { $isCallableRuleGuardian->check($value); } catch (GuardianExecutingRuleException $exception) { // the rule could not be executed }
๐งฉ API
IsCallableRuleGuardian::check()
/** * @param mixed $value * @throws GuardianExecutingRuleException * @throws GuardianValidationException * @throws \Throwable */ public function check($value, ?\Throwable $exception = null): void
Validates that $value is callable.
Arguments:
$valueโ the value to validate$exceptionโ an optional custom\Throwableto be thrown on validation failure
The method returns void. It communicates results through exceptions only โ it returns nothing on success and throws on failure:
GuardianValidationExceptionโ the callable check failed and no custom exception was provided- the provided custom exception โ the check failed and a custom exception was passed
GuardianExecutingRuleExceptionโ the rule could not be executed
๐๏ธ Architecture
This package is a small shortcut layer over the Aegisora validation pipeline.
Flow:
IsCallableRuleGuardian::check()is called with a value and an optional exception- An
IsCallableRuleis created (create()) Guardianexecutes the rule against the value- If the check passes, execution continues normally
- If the check fails, the custom exception or
GuardianValidationExceptionis thrown - If the rule could not be executed,
GuardianExecutingRuleExceptionis thrown
Internal flow:
value โ IsCallableRuleGuardian โ Guardian โ IsCallableRule โ Result โ Exception
๐ Related Packages
- aegisora/guardian โ validation execution orchestrator
- aegisora/is-callable-rule โ is callable rule
- aegisora/rule-contract โ base rule contract and validation result architecture
โ๏ธ License
This package is open-source and licensed under the MIT License. See the LICENSE for details.
๐ฑ Contributing
Contributions are welcome and greatly appreciated!. See the CONTRIBUTING for details.
๐ Support
If you find this project useful, please consider giving it a star on GitHub!
It helps the project grow and motivates further development.