You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
79 lines
2.2 KiB
PHP
79 lines
2.2 KiB
PHP
<?php
|
|
|
|
namespace BSR\Webservice\Formatter;
|
|
|
|
abstract class Formatter {
|
|
private static $formats = array();
|
|
|
|
/**
|
|
* @param array $formats New available formats, array(mimetype => 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);
|
|
}
|