bootstrap.php 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. <?php
  2. require __DIR__ . '/../vendor/autoload.php';
  3. use Symfony\Component\HttpFoundation\Request;
  4. use Symfony\Component\HttpFoundation\RequestStack;
  5. use Symfony\Component\HttpFoundation\Response;
  6. use Symfony\Component\HttpKernel\Controller\ArgumentResolver;
  7. use Symfony\Component\HttpKernel\Controller\ControllerResolver;
  8. use Symfony\Component\HttpKernel\EventListener\RouterListener;
  9. use Symfony\Component\HttpKernel\HttpKernel;
  10. use Symfony\Component\Routing\Matcher\UrlMatcher;
  11. use Symfony\Component\Routing\RequestContext;
  12. use Symfony\Component\Routing\Route;
  13. use Symfony\Component\Routing\RouteCollection;
  14. use Symfony\Component\EventDispatcher\EventDispatcher;
  15. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  16. use Symfony\Component\HttpKernel\Event\TerminateEvent;
  17. use Symfony\Component\HttpKernel\HttpKernelInterface;
  18. use Symfony\Component\HttpKernel\KernelEvents;
  19. class Application implements HttpKernelInterface
  20. {
  21. private $kernel;
  22. private $dispatcher;
  23. public function __construct()
  24. {
  25. $routes = new RouteCollection();
  26. $routes->add('hello', new Route('/foo', [
  27. '_controller' => function (Request $request) {
  28. return new Response('bar');
  29. }]
  30. ));
  31. $matcher = new UrlMatcher($routes, new RequestContext());
  32. $this->dispatcher = new EventDispatcher();
  33. $this->dispatcher->addSubscriber(new RouterListener($matcher, new RequestStack()));
  34. $controllerResolver = new ControllerResolver();
  35. $argumentResolver = new ArgumentResolver();
  36. $this->kernel = new HttpKernel($this->dispatcher, $controllerResolver, new RequestStack(), $argumentResolver);
  37. }
  38. public function handle(Request $request, int $type = HttpKernelInterface::MASTER_REQUEST, bool $catch = true)
  39. {
  40. return $this->kernel->handle($request);
  41. }
  42. public function terminate(Request $request, Response $response)
  43. {
  44. $this->kernel->terminate($request, $response);
  45. }
  46. public function finish(callable $callback)
  47. {
  48. $dispatcher = $this->dispatcher;
  49. $app = $this;
  50. $request = Request::createFromGlobals();
  51. $response = $app->handle($request);
  52. $app->terminate($request, $response);
  53. $event = new TerminateEvent($app, $request, $response);
  54. $dispatcher->addSubscriber(new KernelTerminatedSubscriber($callback));
  55. $dispatcher->dispatch($event, KernelEvents::TERMINATE);
  56. }
  57. }
  58. class KernelTerminatedSubscriber implements EventSubscriberInterface
  59. {
  60. protected $callback;
  61. public function __construct(callable $callback)
  62. {
  63. $this->callback = $callback;
  64. }
  65. public static function getSubscribedEvents()
  66. {
  67. return [
  68. KernelEvents::TERMINATE => 'onKernelTerminated'
  69. ];
  70. }
  71. public function onKernelTerminated(TerminateEvent $event)
  72. {
  73. call_user_func($this->callback);
  74. }
  75. }