|
<?php |
|
|
|
use Orno\Http\JsonResponse; |
|
use Proton\Application; |
|
use Stack\Builder; |
|
use Symfony\Component\HttpFoundation\Request; |
|
use Symfony\Component\HttpKernel\HttpKernelInterface; |
|
|
|
include('vendor/autoload.php'); |
|
|
|
class A { |
|
public function run() |
|
{ |
|
return new JsonResponse(['foo' => 'bar', 'class' => __CLASS__]); |
|
} |
|
} |
|
|
|
class B { |
|
public function run() |
|
{ |
|
return new JsonResponse(['bar' => 'foo', 'class' => __CLASS__]); |
|
} |
|
} |
|
|
|
class C { |
|
public function run() |
|
{ |
|
return new JsonResponse(['foobar' => 'barfoo', 'class' => __CLASS__]); |
|
} |
|
} |
|
|
|
class ApiVersionMiddleware implements HttpKernelInterface |
|
{ |
|
protected $app; |
|
|
|
public function __construct(HttpKernelInterface $app) |
|
{ |
|
$this->app = $app; |
|
} |
|
|
|
public function handle(Request $request, $type = self::MASTER_REQUEST, $catch = true) |
|
{ |
|
$version = $request->headers->get('Accept', '1.0'); |
|
|
|
$refObject = new \ReflectionObject($request); |
|
$refProperty = $refObject->getProperty('pathInfo'); |
|
$refProperty->setAccessible(true); |
|
$refProperty->setValue($request, sprintf('/%s%s', $version, $request->getPathInfo())); |
|
|
|
return $this->app->handle($request, $type, $catch); |
|
} |
|
} |
|
|
|
$proton = new Application(); |
|
|
|
$container = $proton->getContainer(); |
|
$container->add('A', function () { return new A(); }); |
|
$container->add('B', function () { return new B(); }); |
|
$container->add('C', function () { return new C(); }); |
|
|
|
$router = $proton->getRouter(); |
|
$router->addRoute('GET', '/1.0/foo', 'A::run'); // version 1.0 of API |
|
$router->addRoute('GET', '/2.0/foo', 'B::run'); // version 2.0 of API |
|
$router->addRoute('GET', '/{version:[0-9].[0-9]}/bar', 'C::run'); // all API versions |
|
|
|
$stack = new Builder(); |
|
$stack->push('ApiVersionMiddleware'); |
|
$stackedApp = $stack->resolve($proton); |
|
$response = $stackedApp->handle(Request::createFromGlobals($_GET, $_POST, array(), $_COOKIE, $_FILES, $_SERVER)); |
|
$response->send(); |