Laravel容器延迟加载以及Auth扩展详解

澳门新葡亰娱乐在线 1

发现问题

3、运算结果渲染成网页返回给浏览器,网页响应

当我在 LoauthServiceProvider 中这样写的时候:

第四句创建了一个用于处理请求的核心。

报错

2、程序接到请求开始运算,网页程序

我猜测是因为优先级的问题,可能在框架注册
LoauthServiceProvider::register() 的时候,Auth
还没有标记为延迟加载,这就造成了一个先后问题,任何即时加载的服务提供器都无法在register方法中调用延迟加载的服务。

第三句引入了laravel应用主体。

public function load(Application $app, array $providers)
{
    //...省略
    // We will go ahead and register all of the eagerly loaded providers with the
    // application so their services can be registered with the application as
    // a provided service. Then we will set the deferred service list on it.
    foreach ($manifest['eager'] as $provider)
    {
        $app->register($this->createProvider($app, $provider));
    }
    //延迟加载标记在即时加载服务之后
    $app->setDeferredServices($manifest['deferred']);
}

第二句引入了基于composer的自动加载模块。

public function provides()
{
    return array('auth');
}

View Code

澳门新葡亰娱乐在线 1

关于第二句,这里我先解释一下自动加载,我们都知道php中如果要使用文件外的代码,需要使用require等方法先将文件引入,然后就可以使用被引入那个文件的代码了。但是我们平时使用框架编写代码的时候就不需要这么做了,只需要use命名空间,便可以直接new出对象了,这就要归功于自动加载了,php在new出当前不存在的对象时,会触发__autoload、spl_澳门新葡亰娱乐在线,autoload等一些魔术方法。tp3的处理方式遍是非常粗暴的,在autoload魔术方法中,将当前类use的命名空间与我们new的对象名进行字符串拼接,随后require该文件就完了。laravel使用了composer显然就高级的多,不过再怎么高级,composer本身也是做了类似的操作,所以它也使用了spl_autoload函数,它高级在哪呢?我们都知道composer使用时可以新建一个json文件将需要的依赖编写在里面,composer运行时就会自动下载这些文件了。用composer
做自动加载也是一样,它将json文件里写入的依赖进行缓存成了key/value的关联数组,触发spl_autoload函数的时候便根据这些映射来require。存放在laravelvendorcomposerautoload_classmap.php文件内,有兴趣的朋友可自行观看,这里不是重点,便到此为止了。(我初学php面向对象的时候一直以为命名空间下面那些use就是用来替代require、include的。直到后来学习mvc概念的时候自己试着做了个微框架的demo,才搞清楚use只是起到明确命名空间的作用。)

根据手册以及注释,我们得知 $defer
属性是用来延迟加载该服务提供器,说直白点就是延迟执行 register()
方法,只需要配合provides()方法即可实现。举个例子:

1、用户从浏览器进行请求,请求

昨天按照手册教程,动手写一个Auth扩展,按照包独立性的原则,我不希望将Auth::extend()这种方法写在
start.php
中,毫无疑问,我选择了在服务提供器register()方法中注册扩展驱动。然而,事与愿违……

第七句结束应用并释放资源。

Call to undefined method IlluminateSupportFacadesAuth::extend()
 1 define('LARAVEL_START', microtime(true)); 2  3 require __DIR__.'/../vendor/autoload.php'; 4  5 $app = require_once __DIR__.'/../bootstrap/app.php'; 6  7 $kernel = $app->make(IlluminateContractsHttpKernel::class); 8  9 $response = $kernel->handle(10     $request = IlluminateHttpRequest::capture()11 );12 13 $response->send();14 15 $kernel->terminate($request, $response);

解决之道

第五句对实例化后的request对象进行解析并返回执行后的response响应对象。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

相关文章

网站地图xml地图