Skip to content

Instantly share code, notes, and snippets.

@jasonhofer
Last active June 22, 2018 18:24
Show Gist options
  • Save jasonhofer/122114688c822b388d4b3ad4a28d8d9e to your computer and use it in GitHub Desktop.
Save jasonhofer/122114688c822b388d4b3ad4a28d8d9e to your computer and use it in GitHub Desktop.
An example of using the core Symfony components outside of a framework.
<?php
//
// Symfony Bare
//
// php -S localhost:8181 symfony-bare.php
//
// http://localhost:8181/is-leap-year
//
require_once 'vendor/autoload.php';
use Symfony\Component\Debug;
use Symfony\Component\DependencyInjection as DI;
use Symfony\Component\EventDispatcher;
use Symfony\Component\HttpFoundation;
use Symfony\Component\HttpKernel;
use Symfony\Component\Routing;
//
// Service
//
class LeapYearService
{
public function isLeapYear($year = null)
{
if (null === $year) {
$year = date('Y');
}
return 0 === $year % 400 || (0 === $year % 4 && 0 !== $year % 100);
}
}
//
// Listener
//
class StringResponseListener implements EventDispatcher\EventSubscriberInterface
{
public function onView(HttpKernel\Event\GetResponseForControllerResultEvent $event)
{
$result = $event->getControllerResult();
if (is_string($result)) {
$event->setResponse(new HttpFoundation\Response($result));
}
}
public static function getSubscribedEvents()
{
return array('kernel.view' => 'onView');
}
}
//
// Controllers
//
class LeapYearController
{
private $leapYearService;
public function __construct(LeapYearService $leapYearService)
{
$this->leapYearService = $leapYearService;
}
public function indexAction($year)
{
if ($this->leapYearService->isLeapYear($year)) {
return 'Yep, this is a leap year!';
}
return 'Nope, this is not a leap year.';
}
}
class ErrorController
{
public function exceptionAction(Debug\Exception\FlattenException $exception)
{
return new HttpFoundation\Response(
sprintf('Something went wrong! (%s)', $exception->getMessage()),
$exception->getStatusCode()
);
}
}
//
// Routes
//
$routes = new Routing\RouteCollection();
$routes->add('leap_year', new Routing\Route('/is-leap-year/{year}', [
'year' => null,
'_controller' => 'controller.leap_year:indexAction',
]));
//
// Container
//
$container = new DI\ContainerBuilder();
// Parameters
$container->setParameter('debug', true);
$container->setParameter('charset', 'UTF-8');
$container->setParameter('routes', $routes);
// My Services
$container->register('service.leap_year', LeapYearService::class);
$container->register('listener.string_response', StringResponseListener::class);
$container->register('controller.leap_year', LeapYearController::class)
->setArguments([new DI\Reference('service.leap_year')])
;
$container->register('controller.error', ErrorController::class);
// Symfony Services
$container->register('request_context', Routing\RequestContext::class);
$container->register('url_matcher', Routing\Matcher\UrlMatcher::class)
->setArguments(['%routes%', new DI\Reference('request_context')])
;
$container->register('request_stack', HttpFoundation\RequestStack::class);
$container->register('controller_resolver', HttpKernel\Controller\ContainerControllerResolver::class)
->setArguments([$container])
;
$container->register('argument_resolver', HttpKernel\Controller\ArgumentResolver::class);
$container->register('listener.router', HttpKernel\EventListener\RouterListener::class)
->setArguments([new DI\Reference('url_matcher'), new DI\Reference('request_stack')])
;
$container->register('listener.response', HttpKernel\EventListener\ResponseListener::class)
->setArguments(['%charset%'])
;
$container->register('listener.exception', HttpKernel\EventListener\ExceptionListener::class)
->setArguments(['controller.error:exceptionAction'])
;
$container->register('dispatcher', EventDispatcher\EventDispatcher::class)
->addMethodCall('addSubscriber', [new DI\Reference('listener.router')])
->addMethodCall('addSubscriber', [new DI\Reference('listener.string_response')])
->addMethodCall('addSubscriber', [new DI\Reference('listener.response')])
->addMethodCall('addSubscriber', [new DI\Reference('listener.exception')])
;
$container->register('kernel', HttpKernel\HttpKernel::class)
->setArguments([
new DI\Reference('dispatcher'),
new DI\Reference('controller_resolver'),
new DI\Reference('request_stack'),
new DI\Reference('argument_resolver'),
])
;
//
// Front Controller
//
$request = HttpFoundation\Request::createFromGlobals();
$response = $container->get('kernel')->handle($request);
$response->send();
@srt4rulez
Copy link

😍

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment