Moved more basic logic into application start to make it easier to hook into early life cycle events such as configuration loading while not introducing extra files into the framework. Signed-off-by: Taylor Otwell <taylorotwell@gmail.com>
186 lines
5.0 KiB
PHP
186 lines
5.0 KiB
PHP
<?php namespace Laravel;
|
|
|
|
/**
|
|
* Bootstrap the core framework components like the IoC container and
|
|
* the configuration class, and the class auto-loader. Once this file
|
|
* has run, the framework is essentially ready for use.
|
|
*/
|
|
require 'core.php';
|
|
|
|
/**
|
|
* Register the PHP exception handler. The framework throws exceptions
|
|
* on every error that cannot be handled. All of those exceptions will
|
|
* be sent through this closure for processing.
|
|
*/
|
|
set_exception_handler(function($e)
|
|
{
|
|
Error::exception($e);
|
|
});
|
|
|
|
/**
|
|
* Register the PHP error handler. All PHP errors will fall into this
|
|
* handler which will convert the error into an ErrorException object
|
|
* and pass the exception into the exception handler.
|
|
*/
|
|
set_error_handler(function($code, $error, $file, $line)
|
|
{
|
|
Error::native($code, $error, $file, $line);
|
|
});
|
|
|
|
/**
|
|
* Register the shutdown handler. This function will be called at the
|
|
* end of the PHP script or on a fatal PHP error. If a PHP error has
|
|
* occured, we will convert it to an ErrorException and pass it
|
|
* to the common exception handler for the framework.
|
|
*/
|
|
register_shutdown_function(function()
|
|
{
|
|
Error::shutdown();
|
|
});
|
|
|
|
/**
|
|
* Setting the PHP error reporting level to -1 essentially forces
|
|
* PHP to report every error, and it is guranteed to show every
|
|
* error on future versions of PHP.
|
|
*
|
|
* If error detail is turned off, we will turn off all PHP error
|
|
* reporting and display since the framework will be displaying
|
|
* a generic message and we do not want any sensitive details
|
|
* about the exception leaking into the views.
|
|
*/
|
|
error_reporting(-1);
|
|
|
|
/**
|
|
* Even though "Magic Quotes" are deprecated in PHP 5.3, they may
|
|
* still be enabled on the server. To account for this, we will
|
|
* strip slashes on all input arrays if magic quotes are turned
|
|
* on for the server environment.
|
|
*/
|
|
if (magic_quotes())
|
|
{
|
|
$magics = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST);
|
|
|
|
foreach ($magics as &$magic)
|
|
{
|
|
$magic = array_strip_slashes($magic);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Gather the input to the application based on the global input
|
|
* variables for the current request. The input will be gathered
|
|
* based on the current request method and will be set on the
|
|
* Input manager class' static $input property.
|
|
*/
|
|
$input = array();
|
|
|
|
switch (Request::method())
|
|
{
|
|
case 'GET':
|
|
$input = $_GET;
|
|
break;
|
|
|
|
case 'POST':
|
|
$input = $_POST;
|
|
break;
|
|
|
|
default:
|
|
if (Request::spoofed())
|
|
{
|
|
$input = $_POST;
|
|
}
|
|
else
|
|
{
|
|
parse_str(file_get_contents('php://input'), $input);
|
|
|
|
if (magic_quotes()) $input = array_strip_slashes($input);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* The spoofed request method is removed from the input so it is not
|
|
* unexpectedly included in Input::all() or Input::get(). Leaving it
|
|
* in the input array could cause unexpected results if an Eloquent
|
|
* model is filled with the input.
|
|
*/
|
|
unset($input[Request::spoofer]);
|
|
|
|
Input::$input = $input;
|
|
|
|
/**
|
|
* Load the "application" bundle. Though the application folder is
|
|
* not typically considered a bundle, it is started like one and
|
|
* essentially serves as the "default" bundle.
|
|
*/
|
|
Bundle::start(DEFAULT_BUNDLE);
|
|
|
|
/**
|
|
* Auto-start any bundles configured to start on every request.
|
|
* This is especially useful for debug bundles or bundles that
|
|
* are used throughout the application.
|
|
*/
|
|
foreach (Bundle::$bundles as $bundle => $config)
|
|
{
|
|
if ($config['auto']) Bundle::start($bundle);
|
|
}
|
|
|
|
/**
|
|
* Register the "catch-all" route that handles 404 responses for
|
|
* routes that can not be matched to any other route within the
|
|
* application. We'll just raise the 404 event.
|
|
*/
|
|
Routing\Router::register('*', '(:all)', function()
|
|
{
|
|
return Event::first('404');
|
|
});
|
|
|
|
/**
|
|
* If the requset URI has too many segments, we will bomb out of
|
|
* the request. This is too avoid potential DDoS attacks against
|
|
* the framework by overloading the controller lookup method
|
|
* with thousands of segments.
|
|
*/
|
|
$uri = URI::current();
|
|
|
|
if (count(URI::$segments) > 15)
|
|
{
|
|
throw new \Exception("Invalid request. Too many URI segments.");
|
|
}
|
|
|
|
/**
|
|
* Route the request to the proper route in the application. If a
|
|
* route is found, the route will be called via the request class
|
|
* static property. If no route is found, the 404 response will
|
|
* be returned to the browser.
|
|
*/
|
|
Request::$route = Routing\Router::route(Request::method(), $uri);
|
|
|
|
$response = Request::$route->call();
|
|
|
|
/**
|
|
* Close the session and write the active payload to persistent
|
|
* storage. The session cookie will also be written and if the
|
|
* driver is a sweeper, session garbage collection might be
|
|
* performed depending on the "sweepage" probability.
|
|
*/
|
|
if (Config::get('session.driver') !== '')
|
|
{
|
|
Session::save();
|
|
}
|
|
|
|
/**
|
|
* Send all of the cookies to the browser. The cookies are
|
|
* stored in a "jar" until the end of a request, primarily
|
|
* to make testing the cookie functionality of the site
|
|
* much easier since the jar can be inspected.
|
|
*/
|
|
Cookie::send();
|
|
|
|
/**
|
|
* Send the final response to the browser and fire the
|
|
* final event indicating that the processing for the
|
|
* current request is completed.
|
|
*/
|
|
$response->send();
|
|
|
|
Event::fire('laravel.done'); |