I founded a class for a stack of objects and closures, but my server is not running php 5.6 yet. And I was wondering how I can convert ...$parameters , because I canβt fix it by replacing everything with call_user_func_array() , then the buildCoreClosure() method will cause errors, for example, because closing is not an array ...
class Stack { protected $method; protected $container; protected $layers = []; public function __construct(Container $container = null, $method = null) { $this->container = $container ?: new Container; $this->method = $method ?: 'handle'; } public function addLayer($class, $inner = true) { return $inner ? array_unshift($this->layers, $class) : array_push($this->layers, $class); } public function addInnerLayer($class) { return $this->addLayer($class); } public function addOuterLayer($class) { return $this->addLayer($class, false); } protected function buildCoreClosure($object) { return function(...$arguments) use ($object) { $callable = $object instanceof Closure ? $object : [$object, $this->method]; return $callable(...$arguments); }; } protected function buildLayerClosure($layer, Closure $next) { return function(...$arguments) use ($layer, $next) { return $layer->execute(...array_merge($arguments, [$next])); }; } public function peel($object, array $parameters = []) { $next = $this->buildCoreClosure($object); foreach($this->layers as $layer) { $layer = $this->container->get($layer); $next = $this->buildLayerClosure($layer, $next); } return $next(...$parameters); } }
source share