Make javoscript/laravel-macroable-models compatible with PHP 8.2
This commit is contained in:
@@ -144,7 +144,8 @@
|
||||
"Ramsey\\Uuid\\": "overrides/ramsey/uuid/src/",
|
||||
"Rap2hpoutre\\LaravelLogViewer\\": "overrides/rap2hpoutre/laravel-log-viewer/src/Rap2hpoutre/LaravelLogViewer/",
|
||||
"Symfony\\Component\\Console\\Descriptor\\": "overrides/symfony/console/Descriptor",
|
||||
"Symfony\\Component\\CssSelector\\XPath\\Extension\\": "overrides/symfony/css-selector/XPath/Extension/"
|
||||
"Symfony\\Component\\CssSelector\\XPath\\Extension\\": "overrides/symfony/css-selector/XPath/Extension/",
|
||||
"Javoscript\\MacroableModels\\": "overrides/javoscript/laravel-macroable-models/src/"
|
||||
},
|
||||
"exclude-from-classmap": [
|
||||
"vendor/axn/laravel-laroute/src/Routes/Collection.php",
|
||||
@@ -253,7 +254,7 @@
|
||||
"vendor/symfony/finder/Iterator/SortableIterator.php",
|
||||
"vendor/symfony/css-selector/XPath/Extension/NodeExtension.php",
|
||||
"vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/NameSync.php",
|
||||
"vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer.php"
|
||||
"vendor/javoscript/laravel-macroable-models/src/MacroableModels.php"
|
||||
]
|
||||
},
|
||||
"autoload-dev": {
|
||||
|
||||
@@ -0,0 +1,95 @@
|
||||
<?php
|
||||
|
||||
namespace Javoscript\MacroableModels;
|
||||
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class MacroableModels
|
||||
{
|
||||
private $macros = [];
|
||||
|
||||
public function getAllMacros()
|
||||
{
|
||||
return $this->macros;
|
||||
}
|
||||
|
||||
public function addMacro(String $model, String $name, \Closure $closure)
|
||||
{
|
||||
$this->checkModelSubclass($model);
|
||||
|
||||
if (! isset($this->macros[$name])) $this->macros[$name] = [];
|
||||
$this->macros[$name][$model] = $closure;
|
||||
$this->syncMacros($name);
|
||||
}
|
||||
|
||||
public function removeMacro($model, String $name)
|
||||
{
|
||||
$this->checkModelSubclass($model);
|
||||
|
||||
if (isset($this->macros[$name]) && isset($this->macros[$name][$model])) {
|
||||
unset($this->macros[$name][$model]);
|
||||
if (count($this->macros[$name]) == 0) {
|
||||
unset($this->macros[$name]);
|
||||
} else {
|
||||
$this->syncMacros($name);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public function modelHasMacro($model, $name)
|
||||
{
|
||||
$this->checkModelSubclass($model);
|
||||
return (isset($this->macros[$name]) && isset($this->macros[$name][$model]));
|
||||
}
|
||||
|
||||
public function modelsThatImplement($name)
|
||||
{
|
||||
if (! isset($this->macros[$name])) return [];
|
||||
return array_keys($this->macros[$name]);
|
||||
}
|
||||
|
||||
public function macrosForModel($model)
|
||||
{
|
||||
$this->checkModelSubclass($model);
|
||||
|
||||
$macros = [];
|
||||
|
||||
foreach($this->macros as $macro => $models) {
|
||||
if (in_array($model, array_keys($models))) {
|
||||
$params = (new \ReflectionFunction($this->macros[$macro][$model]))->getParameters();
|
||||
$macros[$macro] = [
|
||||
'name' => $macro,
|
||||
'parameters' => $params,
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
return $macros;
|
||||
}
|
||||
|
||||
private function syncMacros($name)
|
||||
{
|
||||
$models = $this->macros[$name];
|
||||
Builder::macro($name, function(...$args) use ($name, $models){
|
||||
$class = get_class($this->getModel());
|
||||
|
||||
if (! isset($models[$class])) {
|
||||
throw new \BadMethodCallException("Call to undefined method {$class}::{$name}()");
|
||||
}
|
||||
|
||||
$closure = \Closure::bind($models[$class], $this->getModel());
|
||||
return call_user_func($closure, ...$args);
|
||||
});
|
||||
}
|
||||
|
||||
private function checkModelSubclass(String $model)
|
||||
{
|
||||
if (! is_subclass_of($model, Model::class)) {
|
||||
throw new \InvalidArgumentException('$model must be a subclass of Illuminate\\Database\\Eloquent\\Model');
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user