• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • dedecms
  • ecshop
  • z-blog
  • UcHome
  • UCenter
  • drupal
  • WordPress
  • 帝国cms
  • phpcms
  • 动易cms
  • phpwind
  • discuz
  • 科汛cms
  • 风讯cms
  • 建站教程
  • 运营技巧
您的位置:首页 > CMS教程 >建站教程 > 你知道Laravel的$this->app以及app()是怎么来的吗?

你知道Laravel的$this->app以及app()是怎么来的吗?

作者:站长图库 字体:[增加 减小] 来源:互联网

站长图库向大家介绍了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 Applicationprotected 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方法

//Applicationpublic 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 Continerpublic function singleton($abstract, $concrete = null){    $this->bind($abstract, $concrete, true);}

调用bind方法,赋值bindings

//class Containerpublic 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 Applicationprotected function markAsRegistered($provider){    $this->serviceProviders[] = $provider;    $this->loadedProviders[get_class($provider)] = true;}

LogServerProvider、RoutingServiceProvider与之类似

别名绑定

//class Applicationpublic 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' 
  


 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • laravel与thinkphp之间的区别与优缺点
  • 说说在Laravel中怎么执行Shell命令 ?
  • Laravel中用Observer事件致Redis队列异常问题
  • 手把手带你使用Vue + Laravel开发一个简单的 CRUD 应用
  • 分享个人推荐的Laravel或其它框架的编程规范
  • Laravel中三种中间件的作用
  • 解决Laravel使用laravel-excel扩展包(maatwebsite/excel)导入报错问题
  • 分享一个顺丰同城配送的扩展包并在laravel中使用
  • 介绍Laravel8路由模块新增missing方法
  • 解析如何进行Laravel表单验证分层设计和验证场景应用

相关文章

  • dedecms文章审核后给会员增加积分或者金币的办法
  • JavaScript 对象可以做到的几件事
  • 宝塔面板忘记账号和密码怎么办?一条命令全搞定
  • 宝塔面板使用中常见的9个问题(附答案)
  • PhotoShop自定义图案制作背景纹理教程
  • 如何使用PHP原生来导出Excel和CSV文件
  • Photoshop设计3D效果的月牙状LOGO
  • WordPress获取指定标签下的文章总数
  • 深入了解PHP中的序列化和反序列化
  • Photoshop CS6制作飞溅的彩色液体字

文章分类

  • dedecms
  • ecshop
  • z-blog
  • UcHome
  • UCenter
  • drupal
  • WordPress
  • 帝国cms
  • phpcms
  • 动易cms
  • phpwind
  • discuz
  • 科汛cms
  • 风讯cms
  • 建站教程
  • 运营技巧

最近更新的内容

    • PS打造飘起来的房子‘飞屋环游记’合成教程
    • 织梦DEDECMS首页调用单页文档内容并带过滤HTML的方
    • JS保留两位小数的函数有哪些
    • 一文带你PHP利用phpmailer实现邮件发送功能
    • Photoshop鼠绘蓝色进度圈
    • 关于在页面SEO优化中H标签的正确使用方法
    • 帝国cms忘记后台登录认证码和安全问题的解决方法
    • JavaScript中解析parseInt()的怪异行为
    • 详解PHP中__construct()构造方法
    • php swfupload中文乱码怎么解决

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有