Example Extension
The Waiter's built-in landing page resolver is implemented as an extension, and illustrates how an extension should be written:
<?php namespace Extensions; use \Waiter\WaiterClient; use \Waiter\Hook; class LandingPageResolver extends WaiterExtension { private $config = array(); public function __construct(WaiterClient $waiterClient, $extensionConfig) { $this->config = $extensionConfig; $waiterClient->getHooks()->on(Hook::BEFORE_TEMPLATE_RENDER, [$this, "resolveStartingTemplate"]); } public function resolveStartingTemplate($hookObject) { $response = $hookObject["response"]; $twig = $hookObject["twig"]; $landingPages = $this->config['landingPages']; $wireframe = isset($response['data']) && isset($response['data']['wireframe']) ? $response['data']['wireframe'] : null; if (isset($wireframe)) { $this->renderTemplate('pages-' . $wireframe . '-index', $twig, $response); } else if ($this->hasSubtitles($response)) { header('Content-type: text/vtt'); $this->renderTemplate($landingPages['subtitles'], $twig, $response); } else if ($this->isOEmbedResponse($response)) { //to get around oembed template for picture. Right now multiple recipe extension doesn't work in chain. // as there is an extension for image already in place, oembed extension doesn't have any effect. $this->renderTemplate($landingPages['oembed'], $twig, $response); } } private function hasSubtitles($response) { return isset($response['data']) && isset($response['data']['subtitles']); } private function isOEmbedResponse($response) { $remainingPath = isset($response['data']['resolution']['remainingPath']) ? $response['data']['resolution']['remainingPath'] : ''; return strpos($remainingPath, 'oembed') > 0; } private function renderTemplate($template, $twig, $response) { echo $twig->render($template, $response); exit; } }