<?php require dirname(__DIR__) . '/vendor/autoload.php'; use Zend\Diactoros; use ExpressiveAsync\Server; use React\EventLoop\Factory; use React\Socket\Server as SocketServer; use ExpressiveAsync\Application; use React\Promise\Deferred; $serviceManager = new \Zend\ServiceManager\ServiceManager(); $eventLoop = Factory::create(); $socketServer = new SocketServer($eventLoop); $httpServer = new Server($socketServer); $serviceManager->setFactory('EventLoop', function () use($eventLoop) { return $eventLoop; }); $serviceManager->setInvokableClass('Zend\\Expressive\\Router\\RouterInterface', 'Zend\\Expressive\\Router\\FastRouteRouter'); $router = new \Zend\Expressive\Router\FastRouteRouter(); $router->addRoute(new \Zend\Expressive\Router\Route('/', function ($request, $response) use($eventLoop) { echo 'Home executed' . PHP_EOL; return new Diactoros\Response\HtmlResponse('Hello World.'); }, ['GET'], 'home')); $router->addRoute(new \Zend\Expressive\Router\Route('/deferred', function ($request, $response) use($eventLoop) { // create a request, wait 1-5 seconds and then return a response. $deferred = new Deferred(); $eventLoop->addTimer(rand(1, 5), function () use($deferred) { echo 'Timer executed' . PHP_EOL; $deferred->resolve(new Diactoros\Response\HtmlResponse('Deferred response.')); }); return new \ExpressiveAsync\DeferredResponse($deferred->promise()); }, ['GET'], 'deferred'));
/** * Boot Rails. * * It requires at least paths to libraries and/or Composer Autoloader * to autoload classes. An instance of Rails\Loader\Loader can also be * passed instead. * * @param array $config */ public static function boot(array $config) { if (self::$booted) { return; } /** * Loader. */ if (!isset($config['loader'])) { throw new BadMethodCallException('Requires at least loader instance or configuration'); } else { if (is_array($config['loader'])) { // require_once __DIR__ . '/Rails/Loader/Loader.php'; $loader = new Rails\Loader\Loader(); if (isset($config['loader']['paths'])) { $loader->addPaths($config['loader']['paths']); } if (isset($config['loader']['composerAutoloader'])) { $loader->setComposerAutoloader($config['loader']['composerAutoloader']); } else { $loader->addPath(__DIR__ . '/Rails'); } $loader->register(); } elseif ($config['loader'] instanceof Rails\Loader\Loader) { $loader = $config['loader']; } else { throw new InvalidArgumentException(sprintf('Loader must be either array or instance of Rails\\Loader\\Loader, %s passed', gettype($config['loader']))); } } /** * Service Manager. */ $sm = new Zend\ServiceManager\ServiceManager(); self::$serviceManager = $sm; $sm->setService('loader', $loader); /** * Global configuration. */ $sm->setService('rails.config', new Rails\ActiveSupport\ArrayObject(['use_cache' => false])); /** * Inflector. */ $sm->setFactory('inflector', function () { return new Rails\ActiveSupport\Inflector\Inflector(new Rails\ActiveSupport\Inflector\Inflections\EnglishInflections(), 'en'); }); /** * Translator. */ $sm->setFactory('i18n', function () { $tr = new Rails\I18n\LoadingTranslator(); $tr->setDefaultLocale('en'); $tr->setLoader(new Rails\I18n\Loader()); # Add Rails' locales paths to i18n loader $tr->loader()->addPaths([__DIR__ . '/Rails/ActiveSupport/Carbon/locales', __DIR__ . '/Rails/I18n/locales']); return $tr; }); self::$booted = true; }