1.1 Bootstrap
D:\Projects\laravel70\bootstrap\app.php
<?php
$app = new Illuminate\Foundation\Application(
$_ENV['APP_BASE_PATH'] ?? dirname(__DIR__)
);
$app->singleton(
Illuminate\Contracts\Http\Kernel::class,
App\Http\Kernel::class
);
$app->singleton(
Illuminate\Contracts\Console\Kernel::class,
App\Console\Kernel::class
);
$app->singleton(
Illuminate\Contracts\Debug\ExceptionHandler::class,
App\Exceptions\Handler::class
);
return $app;
1.2 Call bootstrap app from index.php
D:\Projects\laravel70\public\index.php
<?php
define('LARAVEL_START', microtime(true));
require __DIR__.'/../vendor/autoload.php';
$app = require_once __DIR__.'/../bootstrap/app.php';
$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);
$response = $kernel->handle(
$request = Illuminate\Http\Request::capture()
);
$response->send();
$kernel->terminate($request, $response);
1.3 Check Kernel
D:\Projects\laravel70\app\Http\Kernel.php
<?php
namespace App\Http;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
class Kernel extends HttpKernel
{
protected $middleware = [
\App\Http\Middleware\TrustProxies::class,
…
];
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
….
],
'api' => [
'throttle:60,1',
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
];
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
….
];
}
2.1 $bootstrappers
D:\Projects\laravel70\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php
<?php namespace Illuminate\Foundation\Http;
use Illuminate\Contracts\Debug\ExceptionHandler;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Contracts\Http\Kernel as KernelContract;
use Illuminate\Foundation\Http\Events\RequestHandled;
use Illuminate\Routing\Pipeline;
use Illuminate\Routing\Router;
use Illuminate\Support\Facades\Facade;
use InvalidArgumentException;
use Throwable;
class Kernel implements KernelContract
{
……
/**
* The bootstrap classes for the application.
*
* @var array
*/
protected $bootstrappers = [
\Illuminate\Foundation\Bootstrap\LoadEnvironmentVariables::class,
\Illuminate\Foundation\Bootstrap\LoadConfiguration::class,
\Illuminate\Foundation\Bootstrap\HandleExceptions::class,
\Illuminate\Foundation\Bootstrap\RegisterFacades::class,
\Illuminate\Foundation\Bootstrap\RegisterProviders::class,
\Illuminate\Foundation\Bootstrap\BootProviders::class,
];
…….
/**
* Handle an incoming HTTP request.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function handle($request)
{
try {
$request->enableHttpMethodParameterOverride();
$response = $this->sendRequestThroughRouter($request);
} catch (Throwable $e) {
$this->reportException($e);
$response = $this->renderException($request, $e);
}
$this->app['events']->dispatch(
new RequestHandled($request, $response)
);
return $response;
}
….
}
2.2 Send Request Through Router
D:\Projects\laravel70\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php
protected function sendRequestThroughRouter($request)
{
$this->app->instance('request', $request);
Facade::clearResolvedInstance('request');
$this->bootstrap();
return (new Pipeline($this->app))
->send($request)
->through($this->app->shouldSkipMiddleware()
? [] : $this->middleware)
->then($this->dispatchToRouter());
}
2.3 Call bootstrap kernel
public function bootstrap()
{
if (! $this->app->hasBeenBootstrapped()) {
$this->app->bootstrapWith(
$this->bootstrappers());
}
}
2.3 Return bootstrap list from kernel
protected function bootstrappers()
{
return $this->bootstrappers;
}
2.4 bootstrap kernel in application
D:\Projects\laravel70\vendor\laravel\framework\src\Illuminate\Foundation\Application.php
public function bootstrapWith(array $bootstrappers)
{
$this->hasBeenBootstrapped = true;
foreach ($bootstrappers as $bootstrapper) {
$this['events']->dispatch(
'bootstrapping: '.$bootstrapper, [$this]);
$this->make($bootstrapper)->bootstrap($this);
$this['events']->dispatch(
'bootstrapped: '.$bootstrapper, [$this]);
}
}
3.1 Bootstrap
D:\Projects\laravel70\vendor\laravel\framework\src\Illuminate\Foundation\Bootstrap\RegisterFacades.php
<?php
namespace Illuminate\Foundation\Bootstrap;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Foundation\AliasLoader;
use Illuminate\Foundation\PackageManifest;
use Illuminate\Support\Facades\Facade;
class RegisterFacades
{
/**
* Bootstrap the given application.
*
* @param \Illuminate\Contracts\Foundation\Application $app
* @return void
*/
public function bootstrap(Application $app)
{
Facade::clearResolvedInstances();
Facade::setFacadeApplication($app);
//Just for test
dd('RegisterFacades:alias from config.app.aliases',
$app->make('config')->get('app.aliases', []),
'RegisterFacades:alias from PackageManifest',
$app->make(PackageManifest::class)->aliases()
);
AliasLoader::getInstance(array_merge(
$app->make('config')->get('app.aliases', []),
$app->make(PackageManifest::class)->aliases()
))->register();
}
}
3.2 Test
^ "RegisterFacades:alias from config.app.aliases"
^ array:39 [▼
"App" => "Illuminate\Support\Facades\App"
"Arr" => "Illuminate\Support\Arr"
"Artisan" => "Illuminate\Support\Facades\Artisan"
"Auth" => "Illuminate\Support\Facades\Auth"
"Blade" => "Illuminate\Support\Facades\Blade"
"Broadcast" => "Illuminate\Support\Facades\Broadcast"
"Bus" => "Illuminate\Support\Facades\Bus"
"Cache" => "Illuminate\Support\Facades\Cache"
"Config" => "Illuminate\Support\Facades\Config"
"Cookie" => "Illuminate\Support\Facades\Cookie"
"Crypt" => "Illuminate\Support\Facades\Crypt"
"DB" => "Illuminate\Support\Facades\DB"
"Eloquent" => "Illuminate\Database\Eloquent\Model"
"Event" => "Illuminate\Support\Facades\Event"
"File" => "Illuminate\Support\Facades\File"
"Gate" => "Illuminate\Support\Facades\Gate"
"Hash" => "Illuminate\Support\Facades\Hash"
"Http" => "Illuminate\Support\Facades\Http"
"Lang" => "Illuminate\Support\Facades\Lang"
"Log" => "Illuminate\Support\Facades\Log"
"Mail" => "Illuminate\Support\Facades\Mail"
"Notification" => "Illuminate\Support\Facades\Notification"
"Password" => "Illuminate\Support\Facades\Password"
"Queue" => "Illuminate\Support\Facades\Queue"
"Redirect" => "Illuminate\Support\Facades\Redirect"
"Redis" => "Illuminate\Support\Facades\Redis"
"Request" => "Illuminate\Support\Facades\Request"
"Response" => "Illuminate\Support\Facades\Response"
"Route" => "Illuminate\Support\Facades\Route"
"Schema" => "Illuminate\Support\Facades\Schema"
"Session" => "Illuminate\Support\Facades\Session"
"Storage" => "Illuminate\Support\Facades\Storage"
"Str" => "Illuminate\Support\Str"
"URL" => "Illuminate\Support\Facades\URL"
"Validator" => "Illuminate\Support\Facades\Validator"
"View" => "Illuminate\Support\Facades\View"
"Message" => "App\Facades\MessageFacade"
"User" => "App\Facades\UserFacade"
"TestService" => "App\Services\TestService"
]
^ "RegisterFacades:alias from PackageManifest"
^ array:1 [▼
"Flare" => "Facade\Ignition\Facades\Flare"
]