Laravel 4:Facades 是如何解决的?

2024-05-03

我有点想看看 Laravel 4 发生了什么facades在引擎盖下。

我们以这个 Facade 为例:

File::get(someArgs);

如果我没有记错的话,逐步(过于简化)的调用将是:

//static method invocation which are all extended from Facade class
File::__callStatic(get, someArgs)
//returns an instance of FileSystem
File::resolveFacedeInstance('files') 
FileSystem->get(someArgs)

我感到困惑的是该方法下面的注释行文件::resolveFacadeInstance() below:

protected static function resolveFacadeInstance($name)
{
    if (is_object($name)) return $name;

    if (isset(static::$resolvedInstance[$name]))
    {
        return static::$resolvedInstance[$name];
    }



    /**
    * The line that i'm confused about
    */

    return static::$resolvedInstance[$name] = static::$app[$name];
}

我的问题是:

  • How is 文件::$app甚至在 Facade 类中初始化或赋值
  • If 文件::获取()是被调用的Facade

    静态::$应用程序[$名称]我认为应用程序['文件']会解决 或 Application->files 依次调用 Application->__get('files') 因为没有files里面的财产应用 class.

    如果这只是该方法的内容,那么 FileSystem 类将如何返回?

    public function __get($key)
    {
        return $this[$key];
    }
    

我将尝试简短地描述一下:

所以,你已经知道了resolveFacadeInstance方法通过调用__callStatic的方法Facade类和组件的 Facade(i.e. File extends Facade)延伸这个Facade class.

在框架的启动过程中,从public/index.php下面一行开始执行bootstrap/start.php file

$app = require_once __DIR__.'/../bootstrap/start.php';

所以,在这个(bootstrap/start.php)文件中你可以看到一些代码,例如

// the first line, initiate the application
$app = new Illuminate\Foundation\Application;
// ...
// ...
// notice this line
require $framework.'/Illuminate/Foundation/start.php';
// ...
// last line
return $app;

在此代码片段中,require $framework.'/Illuminate/Foundation/start.php';行开始执行Foundation/start.php文件,在这个文件中你可能会看到类似这样的内容

// ...

Facade::clearResolvedInstances();
// Notice this line
Facade::setFacadeApplication($app);

这个(上面给出的)线集application实例到$app财产在Facade class

// support/Facades/Facade.php
public static function setFacadeApplication($app)
{
    static::$app = $app;
}

然后在Foundation/start.php文件在底部,你可以看到类似这样的东西

/*
|--------------------------------------------------------------------------
| Register The Core Service Providers
|--------------------------------------------------------------------------
|
| The Illuminate core service providers register all of the core pieces
| of the Illuminate framework including session, caching, encryption
| and more. It's simply a convenient wrapper for the registration.
|
*/

$providers = $config['providers'];

$app->getProviderRepository()->load($app, $providers);

$app->boot();

在上面给出的代码片段中,框架注册了所有核心组件,并且如您所知,每个组件都有一个服务提供者类(即FilesystemServiceProvider)并且在每个服务提供者类中都有一个方法register这是(对于FilesystemServiceProvider)

/**
 * Register the service provider.
 *
 * @return void
 */
public function register()
{
    $this->app['files'] = $this->app->share(function() { return new Filesystem; });
}

那么,在这种情况下$this->app['files']环境 (return new Filesystem) 一个匿名函数,它返回filesystem当被执行时

$this->app['files'] = $this->app->share(function() { return new Filesystem; });

to $app['files']所以,当你打电话给File::get(),它最终调用匿名函数,在本例中,以下行

return static::$resolvedInstance[$name] = static::$app[$name];

调用该函数static::$app['file'];该函数返回实例,但在返回之前,它将实例存储在$resolvedInstance变量,因此,下次它可以从变量返回实例,而无需再次调用匿名函数。 所以,看起来是这样的,static::$resolvedInstance[$name] = static::$app[$name];调用返回实例的匿名函数,并且该函数是之前注册的,当app通过启动过程启动。

重要的 :

Application延伸Container and Container延伸数组访问 http://php.net/manual/en/class.arrayaccess.php类,这就是为什么,$app可以使用数组表示法(访问)设置/获取对象。

我试图给你一个想法,但你必须一步一步地查看代码,你不会只阅读/跟踪代码一次。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Laravel 4:Facades 是如何解决的? 的相关文章

随机推荐

  • htaccess 重定向非 www http 和 https

    我想要 http example com重定向至 http www example com https example com重定向至 https www example com 以及任何东西http whatever example co
  • Laravel 查询生成器:枢轴不在的地方

    wherePivotIn已提及here https laravel com docs 5 5 eloquent relationships many to many under 通过中间表列过滤关系 但我找不到任何有关相反功能的信息 As
  • 将设备 3D 方向与太阳位置进行比较

    我正在开发一款应用程序 要求用户将 iPhone 对准太阳才能触发特殊事件 我可以基于陀螺仪和 CoreMotion 框架检索设备 3D 方向四元数 从中我可以获得偏航角 滚动角和俯仰角 我还可以根据当前日期和时间 GMT 以及纬度和经度计
  • 使用全局管理员帐户访问 Office 365/SharePoint Online 被拒绝

    自从两天解决问题以来我都快疯了 问题是 我正在制作一个控制台应用程序 它使用全局管理员帐户 在进行新订阅时被指定为管理员的帐户 与 SharePoint Online 进行通信 我想要实现的是 我想使用 CSOM 将自定义操作添加到 Off
  • 如何检测鼠标指针位于浏览器关闭按钮上时的事件? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 换句话说 这是用于检测事件的 javascript jquery 代码当鼠标指针位于浏览器的关闭按钮 X按钮 上时 或者当鼠标指针进入
  • 有没有一种方法可以在不测试整个应用程序的情况下对类库(通用 Windows)进行单元测试?

    我需要进行单元测试Class Library Universal Windows 但是从 添加新项目 窗口中 我只看到了这一点 该项目使用应用程序容器运行所有测试 它始终打开一个应用程序 由于我不需要所有这些开销 我想知道是否有一种方法可以
  • Thymeleaf 文本文字中的下划线

    问题 如何转义文本中的多个连续下划线 我正在使用 HTML 的标准 Thymeleaf 方言 我是not此处使用 Spring 或 SpEL 在 Thymeleaf 中 我可以创建一个下划线作为文字文字 https www thymelea
  • 在 Django 中使用多处理时,应用程序尚未加载,出现异常

    我正在做一个 Django 项目并尝试提高后端的计算速度 该任务类似于 CPU 限制的转换过程 这是我的环境 Python 3 6 1 姜戈 1 10 PostgreSQL 9 6 当我尝试通过 python 多处理库并行计算 API 时
  • 从alertDialog构建器获取editText值

    我是新来的android 我需要得到editText s搜索某些东西的价值 但是当我运行程序时 出现错误null pointer exception EditText etSearch 没有获取它的文本 请帮我 谢谢 public bool
  • 提高 ASP.NET/C# 编译速度的最佳方法是什么?

    更新 请将您的答案集中在硬件解决方案上 您使用什么硬件 工具 插件来提高 ASP NET 编译和首次执行速度 我们正在寻找固态硬盘来加快速度 但现在价格确实很高 我现在有两个 RAID 0 的 7200 rpm 硬盘 但我对性能不再满意 所
  • Bootstrap 中的垂直菜单

    有没有办法使用任何引导类来创建垂直菜单 不是下拉菜单 侧边栏上完全独立的垂直菜单 我可以使用我的 css 创建一个 但只是想知道引导程序中是否有任何内置类 或者可以使用顶部栏通过任何 hack 来完成吗 这个问题现在已经很老了 但如果有人看
  • 在 Asp.net Web API 中处理 CORS 预检

    我的架构中有三个应用程序 它们位于同一服务器上 但具有不同的端口号 A Token Application port 4444 Asp net WebApi B API Application port 3333 Asp net WebAp
  • 如何从对象 URL 获取文件或 blob?

    我允许用户通过拖放和其他方法将图像加载到页面中 当图像被删除时 我正在使用URL createObjectURL转换为对象 URL 以显示图像 我不会撤销该网址 因为我会重复使用它 所以 当需要创建一个FormData对象 以便我可以允许他
  • 尝试使用 fopen() 将文件写入不同的目录

    我正在尝试将文件从一个目录写入另一个目录 例如 http www xxxxxxx com admin upload php http www xxxxxxx com admin upload php to http www xxxxxxx
  • onCreateOptionsMenu(菜单菜单)是什么

    方法中的Menu和menu两个参数是什么onCreateOptionsMenu Menu menu 以及如何使用这个方法 我还有一个问题为什么this参数用于 Intent intent new Intent this DisplayMes
  • 尝试利用?

    我看到我的 nopCommerce 网站记录了以下搜索 ADw script AD4 alert 202 ADw script AD4 我有点好奇他们想要完成什么 我搜索了一下 似乎是ADw script AD4 以 UTF7 编码为
  • C# 中的异步方法如何工作?

    我在我的一些项目中使用异步方法 我喜欢它 因为它使我的应用程序更具可扩展性 但是 我想知道异步方法如何在后台真正工作 NET 或 Windows 如何知道调用已完成 根据我进行的异步调用的数量 我可以看到创建了新线程 但并不总是 为什么 此
  • (jQuery) 在 cookie 中单击时保存复选框状态

    关于此功能有很多主题 但我似乎无法让它工作 我在谷歌上搜索了这个具体案例 有一堆链接让我来到这里 但奇怪的是我似乎无法让它们工作 我所做的唯一工作如下 http dl dropbox com u 2238080 a old z htm ht
  • Clang 使用 -nostdlib 生成崩溃代码

    我正在尝试为可执行文件设置自己的运行时环境 但无法使用 clang v3 4 1ubuntu1 目标 x86 64 pc linux gnu 来生成没有段错误的可执行文件 我已将问题简化为以下内容 如果我有一个文件 crt1 c 除了满足
  • Laravel 4:Facades 是如何解决的?

    我有点想看看 Laravel 4 发生了什么facades在引擎盖下 我们以这个 Facade 为例 File get someArgs 如果我没有记错的话 逐步 过于简化 的调用将是 static method invocation wh