Last active
June 22, 2018 18:24
-
-
Save jasonhofer/122114688c822b388d4b3ad4a28d8d9e to your computer and use it in GitHub Desktop.
An example of using the core Symfony components outside of a framework.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
😍