Hallo zusammen
Hooks finde ich manchmal ganz nützlich, deshalb habe ich mir mal überlegt und ein Beispiel gemacht wie es etwa ausschauen könnte so im groben.
Ich habe mich mal vor kurzer Zeit mit Wordpress rumgeschlagen, aber mit diesem Spagthi Code machte es einfach keinen Spass, aber wenigstens fand ich die Actions und Filters gut, aber irgendwie schlecht umgesetzt.
Es war nämlich echt mühsam, immer wieder Doku schauen was reinkommt und was raus muss.
Deshalb habe ich mir überlegt ein Hook sollte eine Klasse sein, damit man genau nachvollziehen kann was abgeht. Und man kann eben auch die "response" daten auf deren Richtigkeit prüfen.
Doch was meint Ihr zu Hooks? Hier mal meinen groben Ansatz:
Hooks finde ich manchmal ganz nützlich, deshalb habe ich mir mal überlegt und ein Beispiel gemacht wie es etwa ausschauen könnte so im groben.
Ich habe mich mal vor kurzer Zeit mit Wordpress rumgeschlagen, aber mit diesem Spagthi Code machte es einfach keinen Spass, aber wenigstens fand ich die Actions und Filters gut, aber irgendwie schlecht umgesetzt.
Es war nämlich echt mühsam, immer wieder Doku schauen was reinkommt und was raus muss.
Deshalb habe ich mir überlegt ein Hook sollte eine Klasse sein, damit man genau nachvollziehen kann was abgeht. Und man kann eben auch die "response" daten auf deren Richtigkeit prüfen.
Doch was meint Ihr zu Hooks? Hier mal meinen groben Ansatz:
PHP-Code:
// interfaces
interface HookInterface { public function response(); }
interface HooksInterface { } // todo
// hooks manager
class Hooks implements HooksInterface
{
/**
* @var array The registered hook handlers.
*/
private $handlers = [];
/**
* Register a hook handler.
*
* @param string The hook class name.
* @param callable|string Any callable or a class name, which gets resolved by the DIC.
* @param int The priority. Highest get called last.
* @return void
*/
public function listen(string $hook, $handler, int $priority = 0): void
{
$this->handlers[$hook][$priority][] = $handler;
}
/**
* Fire a hook and call the handlers.
*
* @param HookInterface
* @return mixed The hook response.
*/
public function fire(HookInterface $hook)
{
$hookClass = get_class($hook);
// Just return the hook response if no hook handler is set.
if (!isset($this->handlers[$hookClass])) {
return $hook->response();
}
// Sort handlers by its priority. Highest last.
ksort($this->handlers[$hookClass]);
// Merge into one array depth.
$handlers = call_user_func_array('array_merge', $this->handlers[$hookClass]);
// Call each handler
foreach($handlers as $handler) {
call_user_func_array($handler, [$hook]);
}
return $hook->response();
}
}
// hooks manager
$hooks = new Hooks();
// register hook listeners
$hooks->listen(ArticleTitleHook::class, function(ArticleTitleHook $hook) {
// do something.
$hook->title = 'Yellow Flower';
return $hook;
});
// hook example
class ArticleTitleHook implements HookInterface
{
public $title;
private $fallbackTitle;
public function __construct(string $title, string $fallbackTitle = '')
{
$this->title = $title;
$this->fallbackTitle = $fallbackTitle;
}
public function response()
{
return is_string($this->title) ? $this->title : $this->fallbackTitle;
}
}
// fire hook example.
class Article
{
private $hooks;
private $title = '';
public function setHooks(HooksInterface $hooks): void
{
$this->hooks = $hooks;
}
public function setTitle(string $title): void
{
$this->title = $title;
}
public function getTitle(): string
{
return $this->hooks->fire(new ArticleTitleHook($this->title));
}
}
$article = new Article();
$article->setHooks($hooks);
$article->setTitle('Flower');
echo $article->getTitle();
Kommentar