Package Data | |
---|---|
Maintainer Username: | jarektkaczyk |
Maintainer Contact: | jarek@softonsofa.com (Jarek Tkaczyk) |
Package Create Date: | 2015-11-17 |
Package Last Update: | 2023-07-20 |
Home Page: | http://softonsofa.com |
Language: | PHP |
License: | MIT |
Last Refreshed: | 2024-11-11 03:00:11 |
Package Statistics | |
---|---|
Total Downloads: | 1,850,606 |
Monthly Downloads: | 10,875 |
Daily Downloads: | 119 |
Total Stars: | 65 |
Total Watchers: | 3 |
Total Forks: | 73 |
Total Open Issues: | 8 |
Hooks system for the Eloquent ORM (Laravel 5.2).
Hooks are available for the following methods:
Model::getAttribute
Model::setAttribute
Model::save
Model::toArray
Model::replicate
Model::isDirty
Model::__isset
Model::__unset
and all methods available on the Illuminate\Database\Eloquent\Builder
class.
Clone the repo or pull as composer dependency:
composer require sofa/hookable:~5.2
In order to register a hook you use static method hook
on the model: example.
Important Due to the fact that PHP will not let you bind a Closure
to your model's instance if it is created in a static context (for example model's boot
method), you need to hack it a little bit, in that the closure is created in an object context.
For example see the above example along with the class that encloses our closures in an instance scope that is being used there.
Signature for the hook closure is following:
function (Closure $next, mixed $payload, Sofa\Hookable\Contracts\ArgumentBag $args)
Hooks are resolved via Sofa\Hookable\Pipeline
in the same order they were registered (except for setAttribute
where the order is reversed), and each is called unless you return early:
// example hook on getAttribute method:
function ($next, $value, $args)
{
if (/* your condition */) {
// return early
return 'some value'; // or the $value
}
else if (/* other condition */) {
// you may want to mutate the value
$value = strtolower($value);
}
// finally continue calling other hooks
return $next($value, $args);
}
All contributions are welcome, PRs must be tested and PSR-2 compliant.