public function __construct(array $settings = [])
{
$this->startTime = microtime(true);
$this->container = \Scalr::getContainer();
$this->container->api->settings = new \ArrayObject(array_merge(static::getDefaultSettings(), $settings));
/* @var $apiContainer \Scalr\DependencyInjection\ApiContainer */
$this->container->api->setShared('environment', function ($apiContainer) {
return new AppEnvironment(!empty($apiContainer->settings['environment.mock']) ? $apiContainer->settings['environment.mock'] : null);
});
$this->container->api->setShared('router', function ($apiContainer) {
return new Router();
});
$this->container->api->setShared('request', function ($apiContainer) {
return new Request($apiContainer->environment);
});
$this->container->api->setShared('response', function ($apiContainer) {
return new Response('', 200, ["content-type" => "application/json; charset=utf-8"]);
});
$this->container->api->set('controller', function ($apiContainer, array $params = null) {
$serviceid = 'controller' . (!empty($params[0]) ? '.' . str_replace('\\', '_', ltrim($params[0], '\\')) : '');
if (!$apiContainer->initialized($serviceid)) {
$apiContainer->setShared($serviceid, function ($apiContainer) use($params) {
$controllerClass = $params[0];
$abstractController = 'Scalr\\Api\\Rest\\Controller\\AbstractController';
if (!is_readable(SRCPATH . '/' . str_replace('\\', '/', $controllerClass) . '.php')) {
$this->notFound();
}
if (!class_exists($controllerClass) || !is_subclass_of($controllerClass, $abstractController)) {
throw new \InvalidArgumentException(sprintf("Controller must be subclass of the '%s' class. '%s' is given.", $abstractController, $controllerClass));
}
/* @var $controller \Scalr\Api\Rest\Controller\AbstractController */
$controller = new $controllerClass();
$controller->setContainer($apiContainer->getContainer());
$controller->setApplication($this);
return $controller;
});
}
return $apiContainer->get($serviceid);
});
}