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;
  }
}