Beste ITScripters,
Een tijdje terug heb ik een class gevonden om verschillende objecten te stapelen als "layers". Echter wil ik deze nu toepassen in een project van mij alleen werkt dit niet voor PHP 5.5 door de ...$parameter beargumentatie.
Zijn er mensen die hiermee kunnen helpen want call_user_func_array() werkt bijvoorbeeld niet bij Closures...
PHP
<?php
class Stack
{
/**
* Method to call on the decoracted class.
*
* @var string
*/
protected $method;
/**
* Container.
*/
protected $container;
/**
* Middleware layers.
*
* @var array
*/
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);
}
}
Toon Meer