你知道Laravel的$this->app以及app()是怎么来的吗?
下面给大家介绍Laravel的$this->app以及app()是怎么来的,希望对需要的朋友有所帮助!
断点调试寻找对应文件,忽略次要步骤,仅描述核心动作,‘/’表示index.php所在目录
地址:index.php
- $app = require_once __DIR__.'/../bootstrap/app.php';
$app初始化
路径/…/bootstrap/app.php
- $app = new Illuminate\Foundation\Application(
- realpath(__DIR__.'/../')
- );
- //$app初始化工作
$app初始化的类及构造函数
- class Application extends Container implements ApplicationContract,HttpKernelInterface
- {
- //继承Container类,Container类实现应用契约接口与请求接口
- public function __construct($basePath = null){
- if ($basePath) {//$basePath = '/../'
- $this->setBasePath($basePath);//路径绑定
- }
- $this->registerBaseBindings();//基础绑定
- $this->registerBaseServiceProviders();//注册基础服务提供者
- $this->registerCoreContainerAliases();//注册别名
- }
- }
路径绑定
Application的setBasePath(’/…/’)方法调用Container的instance(a b s t r a c t , abstract,abstract,instance)方法赋值Contaienr类instances
- instances: array:9 [
- "path" => "\var\www\app"
- "path.base" => "\var\www"
- "path.lang" => "\var\www\resources\lang"
- "path.config" => "\var\www\config"
- "path.public" => "\var\www\public"
- "path.storage" => "\var\www\storage"
- "path.database" => "\var\www\database"
- "path.resources" => "\var\www\resources"
- "path.bootstrap" => "\var\www\bootstrap"
- ]
基础绑定
向Container的instances中添加绑定
- "app" => Application {#2}
- "Illuminate\Container\Container" => Application {#2}
- "Illuminate\Foundation\PackageManifest" => PackageManifest {#4 ▼
- +files: Filesystem {#5}
- +basePath: "\var\www"
- +vendorPath: "\var\www\vendor"
- +manifestPath: "\var\www\bootstrap\cache\packages.php"
- +manifest: null
- }
app与Container指向当前实例
PackageMainfest 为包管理实例,构造方法中files注册文件系统实例
注册基础服务提供者
- //class Application
- protected function registerBaseServiceProviders()
- {
- $this->register(new EventServiceProvider($this));
- $this->register(new LogServiceProvider($this));
- $this->register(new RoutingServiceProvider($this));
- }
Event、Log、Routing基础服务继承ServiceProvider,初始化的时候将app属性赋值Application实例
- //class ServiceProvider
- public function __construct($app)
- {
- $this->app = $app;
- }
执行Application类register方法
- //Application
- public function register($provider, $options = [], $force = false)
- {
- if (is_string($provider)) {
- $provider = $this->resolveProvider($provider);
- }
- if (method_exists($provider, 'register')) {
- $provider->register();//赋值bindings
- }
- //将服务提供者添加到serviceProviders属性队列
- //将服务提供者类名添加到loaderProviders属性
- $this->markAsRegistered($provider);
- return $provider;
- }
为provider注册提供了两种方法;
一种是字符串类名直接实例,
一种是执行$$provider->register()方法注册,
当前执行第二种方法,
回看当前EventServiceProvider实例的register方法
- public function register()
- {
- $this->app->singleton('events', function ($app) {
- return (new Dispatcher($app))->setQueueResolver(function () use ($app) {
- return $app->make(QueueFactoryContract::class);
- });
- });
- }
调用Application实例的singleton方法
- //class Continer
- public function singleton($abstract, $concrete = null)
- {
- $this->bind($abstract, $concrete, true);
- }
调用bind方法,赋值bindings
- //class Container
- public function bind($abstract, $concrete = null, $shared = false)
- {
- if (is_null($concrete)) {
- $concrete = $abstract;
- }
- if (! $concrete instanceof Closure) {
- $concrete = $this->getClosure($abstract, $concrete);
- }
- $this->bindings[$abstract] = compact('concrete', 'shared');
- }
回到Application类register方法中并执行markAsRegistered($provider)
- //class Application
- protected function markAsRegistered($provider)
- {
- $this->serviceProviders[] = $provider;
- $this->loadedProviders[get_class($provider)] = true;
- }
LogServerProvider、RoutingServiceProvider与之类似
别名绑定
- //class Application
- public function registerCoreContainerAliases()
- {
- foreach ([
- 'app' => [self::class, \Illuminate\Contracts\Container\Container::class, \Illuminate\Contracts\Foundation\Application::class, \Psr\Container\ContainerInterface::class],
- 'auth' => [\Illuminate\Auth\AuthManager::class, \Illuminate\Contracts\Auth\Factory::class],
- 'auth.driver' => [\Illuminate\Contracts\Auth\Guard::class],
- 'blade.compiler' => [\Illuminate\View\Compilers\BladeCompiler::class],
- 'cache' => [\Illuminate\Cache\CacheManager::class, \Illuminate\Contracts\Cache\Factory::class],
- 'cache.store' => [\Illuminate\Cache\Repository::class, \Illuminate\Contracts\Cache\Repository::class],
- 'config' => [\Illuminate\Config\Repository::class, \Illuminate\Contracts\Config\Repository::class],
- 'cookie' => [\Illuminate\Cookie\CookieJar::class, \Illuminate\Contracts\Cookie\Factory::class, \Illuminate\Contracts\Cookie\QueueingFactory::class],
- 'encrypter' => [\Illuminate\Encryption\Encrypter::class, \Illuminate\Contracts\Encryption\Encrypter::class],
- 'db' => [\Illuminate\Database\DatabaseManager::class],
- 'db.connection' => [\Illuminate\Database\Connection::class, \Illuminate\Database\ConnectionInterface::class],
- 'events' => [\Illuminate\Events\Dispatcher::class, \Illuminate\Contracts\Events\Dispatcher::class],
- 'files' => [\Illuminate\Filesystem\Filesystem::class],
- 'filesystem' => [\Illuminate\Filesystem\FilesystemManager::class, \Illuminate\Contracts\Filesystem\Factory::class],
- 'filesystem.disk' => [\Illuminate\Contracts\Filesystem\Filesystem::class],
- 'filesystem.cloud' => [\Illuminate\Contracts\Filesystem\Cloud::class],
- 'hash' => [\Illuminate\Contracts\Hashing\Hasher::class],
- 'translator' => [\Illuminate\Translation\Translator::class, \Illuminate\Contracts\Translation\Translator::class],
- 'log' => [\Illuminate\Log\Writer::class, \Illuminate\Contracts\Logging\Log::class, \Psr\Log\LoggerInterface::class],
- 'mailer' => [\Illuminate\Mail\Mailer::class, \Illuminate\Contracts\Mail\Mailer::class, \Illuminate\Contracts\Mail\MailQueue::class],
- 'auth.password' => [\Illuminate\Auth\Passwords\PasswordBrokerManager::class, \Illuminate\Contracts\Auth\PasswordBrokerFactory::class],
- 'auth.password.broker' => [\Illuminate\Auth\Passwords\PasswordBroker::class, \Illuminate\Contracts\Auth\PasswordBroker::class],
- 'queue' => [\Illuminate\Queue\QueueManager::class, \Illuminate\Contracts\Queue\Factory::class, \Illuminate\Contracts\Queue\Monitor::class],
- 'queue.connection' => [\Illuminate\Contracts\Queue\Queue::class],
- 'queue.failer' => [\Illuminate\Queue\Failed\FailedJobProviderInterface::class],
- 'redirect' => [\Illuminate\Routing\Redirector::class],
- 'redis' => [\Illuminate\Redis\RedisManager::class, \Illuminate\Contracts\Redis\Factory::class],
- 'request' => [\Illuminate\Http\Request::class, \Symfony\Component\HttpFoundation\Request::class],
- 'router' => [\Illuminate\Routing\Router::class, \Illuminate\Contracts\Routing\Registrar::class, \Illuminate\Contracts\Routing\BindingRegistrar::class],
- 'session' => [\Illuminate\Session\SessionManager::class],
- 'session.store' => [\Illuminate\Session\Store::class, \Illuminate\Contracts\Session\Session::class],
- 'url' => [\Illuminate\Routing\UrlGenerator::class, \Illuminate\Contracts\Routing\UrlGenerator::class],
- 'validator' => [\Illuminate\Validation\Factory::class, \Illuminate\Contracts\Validation\Factory::class],
- 'view' => [\Illuminate\View\Factory::class, \Illuminate\Contracts\View\Factory::class],
- ] as $key => $aliases) {
- foreach ($aliases as $alias) {
- $this->alias($key, $alias);
- }
- }
- }
为alias属性赋值
$app核心类绑定
- /…/bootstrap/app.php
- /**
- *核心类绑定
- */
- $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
- );
调用bind函数
- //class Container
- public function singleton($abstract, $concrete = null)
- {
- $this->bind($abstract, $concrete, true);
- }
对字符串类名进行默认回调函数绑定
- //class Container
- public function bind($abstract, $concrete = null, $shared = false)
- {
- // If the factory is not a Closure, it means it is just a class name which is
- // bound into this container to the abstract type and we will just wrap it
- // up inside its own Closure to give us more convenience when extending.
- if (! $concrete instanceof Closure) {
- $concrete = $this->getClosure($abstract, $concrete);
- }
- $this->bindings[$abstract] = compact('concrete', 'shared');
- }
getClosure返回默认回调函数
- //class Container
- protected function getClosure($abstract, $concrete)
- {
- return function ($container, $parameters = []) use ($abstract, $concrete) {
- if ($abstract == $concrete) {
- return $container->build($concrete);
- }
- return $container->make($concrete, $parameters);
- };
- }
最终:返回$app
- /…/bootstrap/app.php
- return $app;
本文网址:https://www.zztuku.com/index.php/detail-9062.html
站长图库 - 你知道Laravel的$this->app以及app()是怎么来的吗?
申明:如有侵犯,请 联系我们 删除。
您还没有登录,请 登录 后发表评论!
提示:请勿发布广告垃圾评论,否则封号处理!!