温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Laravel中$this->app的示例分析

发布时间:2021-08-09 13:52:37 来源:亿速云 阅读:143 作者:小新 栏目:编程语言

这篇文章主要介绍了Laravel中$this->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;

感谢你能够认真阅读完这篇文章,希望小编分享的“Laravel中$this->app的示例分析”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI