门面模式 Laravel Log::info () 是如何运行的

我用的是laravel 5.2 对应的是 Writer

namespace Illuminate\Log;
class Writer implements LogContract, PsrLoggerInterface
{
    public function info($message, array $context = [])
    {
      return $this->writeLog(__FUNCTION__, $message, $context);
    }
}

请问Log::info() 调用的时候,他是怎么绑定到Write这个类的,我在config/app.php下没有看到相关的配置,只看到有个别名

'aliases' => [
        'Log' => Illuminate\Support\Facades\Log::class,
]

namespace Illuminate\Support\Facades;

/**
 * @see \Illuminate\Log\Writer
 */
 class Log extends Facade
 {
  /**
 * Get the registered name of the component
 * @return string
 */ 
 protected static function getFacadeAccessor()
 {
     return 'log';
  }
}
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

https://github.com/laravel/framework/blob/...

额,,,怎么找到的吗,,,因为之前看过一本书,介绍 Laravel 的,,,大概知道这些基础服务,是在应用启动时,注册到容器中的,,,然后顺着代码,,找了一下,,

public/index.php -> bootstrap/app.php -> App\Http\Kernel -> $bootstrappers -> ConfigureLogging

Laravel 请求生命周期小结

文章里看下,【用请求生成响应】小节,,,

4年前 评论
讨论数量: 8

前面说了 Facades 是如何调用 Writer 中的方法的,,,

我来补充下,当你直接 Log::xxx() 时,,,是如何变成 Illuminate\Support\Facades\Log::xxx() 的,,

其实就是当你调用 Log::xxx() 时,会进入到 spl_autoload_register 注册的回调中,然后该回调中,会去你上面发的那个 aliases 数组中,拿到真正的类名,就是 Illuminate\Support\Facades\Log ,,,

简单解释:外观类(Facade)的注册和调用过程

4年前 评论
Epona

可以看一下
Facades外观模式背后实现原理

以及Illuminate\Log\LogServiceProvider

4年前 评论
梦之马

@Epona LogServiceProvider 我全局搜索了一下没有这个 怎么回事
我的版本是 5.2
这个 api https://laravel.com/api/5.2/

4年前 评论
梦之马

@largezhou Illuminate\Support\Facades\Log 但是这个里面没有info,别名只是最后指向的哪个门面

 protected static function getFacadeAccessor()
 {
     return 'log';
  }

我想知道的是 Log::info() 是在哪一步吧执行者换为了 Writer 的,在哪里有绑定操作?

4年前 评论
梦之马 (作者) (楼主) 4年前
梦之马 (作者) (楼主) 4年前

Illuminate\Log\LogServiceProvider 里register注册了 log

4年前 评论
梦之马 (楼主) 4年前
yanhws (作者) 4年前

框架启动会先new Writer 放在一个容器里,大概就是:
$container['log'] = new Writer
当你使用Log::info()的时候,通过getFacadeAccessor 知道Log 这个Facade在container中的key是‘log’,然后就去container 中找对象,相当于:
$container['log']->info()

4年前 评论
梦之马 (楼主) 4年前

https://github.com/laravel/framework/blob/...

额,,,怎么找到的吗,,,因为之前看过一本书,介绍 Laravel 的,,,大概知道这些基础服务,是在应用启动时,注册到容器中的,,,然后顺着代码,,找了一下,,

public/index.php -> bootstrap/app.php -> App\Http\Kernel -> $bootstrappers -> ConfigureLogging

Laravel 请求生命周期小结

文章里看下,【用请求生成响应】小节,,,

4年前 评论

。。。你是不是 面试碰到 问这些底层的了

4年前 评论
梦之马 (楼主) 4年前
golang练习生 (作者) 4年前
梦之马 (楼主) 4年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!