Skip to content

Instantly share code, notes, and snippets.

@teresko
Created November 21, 2017 20:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save teresko/2b3e41c29f6155d8e9f35c9a4a7ceaf4 to your computer and use it in GitHub Desktop.
Save teresko/2b3e41c29f6155d8e9f35c9a4a7ceaf4 to your computer and use it in GitHub Desktop.
<?php
use Symfony\Component\Config\FileLocator;
use Symfony\Component\Config\Loader\LoaderResolver;
use Symfony\Component\Config\Loader\DelegatingLoader;
use Symfony\Component\DependencyInjection;
use Symfony\Component\DependencyInjection\Loader\PhpFileLoader;
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
use Symfony\Component\Routing;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\JsonResponse;
require __DIR__ . '/../vendor/autoload.php';
$request = Request::createFromGlobals();
$locator = new FileLocator(__DIR__ . '/../config');
// DI container
$container = new DependencyInjection\ContainerBuilder;
$resolver = new LoaderResolver(
[
new YamlFileLoader($container, $locator),
new PhpFileLoader($container, $locator),
]
);
$loader = new DelegatingLoader($resolver);
$loader->load('config-development.yml');
$container->compile();
// routing
$loader = new Routing\Loader\YamlFileLoader($locator);
$context = new Routing\RequestContext();
$context->fromRequest($request);
$matcher = new Routing\Matcher\UrlMatcher(
$loader->load('routing.yml'),
$context
);
$parameters = $matcher->match($request->getPathInfo());
foreach ($parameters as $key => $value) {
$request->attributes->set($key, $value);
}
$command = $request->getMethod() . $request->get('action');
try {
$controller = $container->get($request->get('controller'));
$data = $controller->{$command}($request) ?? [];
$data = ['status' => 'ok'] + $data;
} catch (\Exception $exception) {
$data = [
'status' => 'error',
'message' => $exception->getMessage(),
];
} catch (\TypeError $error) {
$data = [
'status' => 'error',
'message' => 'Invalid dependency',
];
}
$name = $request->get('view');
$view = $container->get($name);
$response = $view->{$command}($data) ?? new Response;
$response->send();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment