/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php

https://gitlab.com/dzakiafif/cokelatklasik · PHP · 286 lines · 131 code · 41 blank · 114 comment · 6 complexity · ed96adb37ca7e7df49f60a22db9544bc MD5 · raw file

  1. <?php
  2. namespace Illuminate\Foundation\Http;
  3. use Exception;
  4. use RuntimeException;
  5. use Illuminate\Routing\Router;
  6. use Illuminate\Pipeline\Pipeline;
  7. use Illuminate\Support\Facades\Facade;
  8. use Illuminate\Contracts\Foundation\Application;
  9. use Illuminate\Contracts\Http\Kernel as KernelContract;
  10. class Kernel implements KernelContract
  11. {
  12. /**
  13. * The application implementation.
  14. *
  15. * @var \Illuminate\Contracts\Foundation\Application
  16. */
  17. protected $app;
  18. /**
  19. * The router instance.
  20. *
  21. * @var \Illuminate\Routing\Router
  22. */
  23. protected $router;
  24. /**
  25. * The bootstrap classes for the application.
  26. *
  27. * @var array
  28. */
  29. protected $bootstrappers = [
  30. 'Illuminate\Foundation\Bootstrap\DetectEnvironment',
  31. 'Illuminate\Foundation\Bootstrap\LoadConfiguration',
  32. 'Illuminate\Foundation\Bootstrap\ConfigureLogging',
  33. 'Illuminate\Foundation\Bootstrap\HandleExceptions',
  34. 'Illuminate\Foundation\Bootstrap\RegisterFacades',
  35. 'Illuminate\Foundation\Bootstrap\RegisterProviders',
  36. 'Illuminate\Foundation\Bootstrap\BootProviders',
  37. ];
  38. /**
  39. * The application's middleware stack.
  40. *
  41. * @var array
  42. */
  43. protected $middleware = [];
  44. /**
  45. * The application's route middleware.
  46. *
  47. * @var array
  48. */
  49. protected $routeMiddleware = [];
  50. /**
  51. * Create a new HTTP kernel instance.
  52. *
  53. * @param \Illuminate\Contracts\Foundation\Application $app
  54. * @param \Illuminate\Routing\Router $router
  55. * @return void
  56. */
  57. public function __construct(Application $app, Router $router)
  58. {
  59. $this->app = $app;
  60. $this->router = $router;
  61. foreach ($this->routeMiddleware as $key => $middleware) {
  62. $router->middleware($key, $middleware);
  63. }
  64. }
  65. /**
  66. * Handle an incoming HTTP request.
  67. *
  68. * @param \Illuminate\Http\Request $request
  69. * @return \Illuminate\Http\Response
  70. */
  71. public function handle($request)
  72. {
  73. try {
  74. $request->enableHttpMethodParameterOverride();
  75. $response = $this->sendRequestThroughRouter($request);
  76. } catch (Exception $e) {
  77. $this->reportException($e);
  78. $response = $this->renderException($request, $e);
  79. }
  80. $this->app['events']->fire('kernel.handled', [$request, $response]);
  81. return $response;
  82. }
  83. /**
  84. * Send the given request through the middleware / router.
  85. *
  86. * @param \Illuminate\Http\Request $request
  87. * @return \Illuminate\Http\Response
  88. */
  89. protected function sendRequestThroughRouter($request)
  90. {
  91. $this->app->instance('request', $request);
  92. Facade::clearResolvedInstance('request');
  93. $this->bootstrap();
  94. $shouldSkipMiddleware = $this->app->bound('middleware.disable') &&
  95. $this->app->make('middleware.disable') === true;
  96. return (new Pipeline($this->app))
  97. ->send($request)
  98. ->through($shouldSkipMiddleware ? [] : $this->middleware)
  99. ->then($this->dispatchToRouter());
  100. }
  101. /**
  102. * Call the terminate method on any terminable middleware.
  103. *
  104. * @param \Illuminate\Http\Request $request
  105. * @param \Illuminate\Http\Response $response
  106. * @return void
  107. */
  108. public function terminate($request, $response)
  109. {
  110. $routeMiddlewares = $this->gatherRouteMiddlewares($request);
  111. foreach (array_merge($routeMiddlewares, $this->middleware) as $middleware) {
  112. list($name, $parameters) = $this->parseMiddleware($middleware);
  113. $instance = $this->app->make($name);
  114. if (method_exists($instance, 'terminate')) {
  115. $instance->terminate($request, $response);
  116. }
  117. }
  118. $this->app->terminate();
  119. }
  120. /**
  121. * Gather the route middleware for the given request.
  122. *
  123. * @param \Illuminate\Http\Request $request
  124. * @return array
  125. */
  126. protected function gatherRouteMiddlewares($request)
  127. {
  128. if ($request->route()) {
  129. return $this->router->gatherRouteMiddlewares($request->route());
  130. }
  131. return [];
  132. }
  133. /**
  134. * Parse a middleware string to get the name and parameters.
  135. *
  136. * @param string $middleware
  137. * @return array
  138. */
  139. protected function parseMiddleware($middleware)
  140. {
  141. list($name, $parameters) = array_pad(explode(':', $middleware, 2), 2, []);
  142. if (is_string($parameters)) {
  143. $parameters = explode(',', $parameters);
  144. }
  145. return [$name, $parameters];
  146. }
  147. /**
  148. * Add a new middleware to beginning of the stack if it does not already exist.
  149. *
  150. * @param string $middleware
  151. * @return $this
  152. */
  153. public function prependMiddleware($middleware)
  154. {
  155. if (array_search($middleware, $this->middleware) === false) {
  156. array_unshift($this->middleware, $middleware);
  157. }
  158. return $this;
  159. }
  160. /**
  161. * Add a new middleware to end of the stack if it does not already exist.
  162. *
  163. * @param string $middleware
  164. * @return $this
  165. */
  166. public function pushMiddleware($middleware)
  167. {
  168. if (array_search($middleware, $this->middleware) === false) {
  169. $this->middleware[] = $middleware;
  170. }
  171. return $this;
  172. }
  173. /**
  174. * Bootstrap the application for HTTP requests.
  175. *
  176. * @return void
  177. */
  178. public function bootstrap()
  179. {
  180. if (!$this->app->hasBeenBootstrapped()) {
  181. $this->app->bootstrapWith($this->bootstrappers());
  182. }
  183. }
  184. /**
  185. * Get the route dispatcher callback.
  186. *
  187. * @return \Closure
  188. */
  189. protected function dispatchToRouter()
  190. {
  191. return function ($request) {
  192. $this->app->instance('request', $request);
  193. return $this->router->dispatch($request);
  194. };
  195. }
  196. /**
  197. * Determine if the kernel has a given middleware.
  198. *
  199. * @param string $middleware
  200. * @return bool
  201. */
  202. public function hasMiddleware($middleware)
  203. {
  204. return array_key_exists($middleware, array_flip($this->middleware));
  205. }
  206. /**
  207. * Get the bootstrap classes for the application.
  208. *
  209. * @return array
  210. */
  211. protected function bootstrappers()
  212. {
  213. return $this->bootstrappers;
  214. }
  215. /**
  216. * Report the exception to the exception handler.
  217. *
  218. * @param \Exception $e
  219. * @return void
  220. */
  221. protected function reportException(Exception $e)
  222. {
  223. $this->app['Illuminate\Contracts\Debug\ExceptionHandler']->report($e);
  224. }
  225. /**
  226. * Render the exception to a response.
  227. *
  228. * @param \Illuminate\Http\Request $request
  229. * @param \Exception $e
  230. * @return \Symfony\Component\HttpFoundation\Response
  231. */
  232. protected function renderException($request, Exception $e)
  233. {
  234. return $this->app['Illuminate\Contracts\Debug\ExceptionHandler']->render($request, $e);
  235. }
  236. /**
  237. * Get the Laravel application instance.
  238. *
  239. * @return \Illuminate\Contracts\Foundation\Application
  240. */
  241. public function getApplication()
  242. {
  243. return $this->app;
  244. }
  245. }