class) */ protected static function registerFormats(array $formats) { foreach($formats as $f) { self::$formats[$f] = get_called_class(); } } /** * @return Formatter The formatter to use for this request */ public static function getFormatter() { self::loadFormatters(); $format = self::getFormatFromHeader(); return new $format(); } /** * Load all formatters in the current directory */ private static function loadFormatters() { preg_match('/(.+)\\\([a-zA-Z0-9]+)/', get_called_class(), $parts); $us = $parts[2]; $namespace = $parts[1]; $base = __DIR__.'/'; $ext = '.php'; $files = glob(sprintf('%s%s%s', $base, '*', $ext)); foreach($files as $f) { $c = str_replace(array($base, $ext), '', $f); if($c !== $us) { $c = $namespace.'\\'.$c; call_user_func(array($c, 'init')); } } } /** * @return string The class name to instantiate in accord to the Accept header */ private static function getFormatFromHeader() { //TODO this is ugly return 'BSR\Webservice\Formatter\Json'; if(isset($_SERVER['HTTP_ACCEPT'])) { $formats = array_map(function($f) { $parts = explode(';', $f); $parts[1] = (isset($parts[1]) ? (float) preg_replace('/[^0-9\.]/', '', $parts[1]) : 1.0) * 100; return $parts; }, explode(',', $_SERVER['HTTP_ACCEPT'])); usort($formats, function($a, $b) { return $b[1] - $a[1]; }); foreach($formats as $f) { if(isset(self::$formats[$f[0]])) { return self::$formats[$f[0]]; } } } return 'BSR\Webservice\Formatter\Json'; } /** * Output the content for the given data * @param array $data */ abstract public function render($data); }