前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Laravel 非常规教程之1 生命周期

Laravel 非常规教程之1 生命周期

作者头像
老高的技术博客
发布2022-12-28 10:39:52
4850
发布2022-12-28 10:39:52
举报

上一节老高零(瞎)散(扯)的讲了一下laravel的基本知识,不知道你现在搞清楚symfony vs laravel的关系了吗?其实没多大关系,l借用了s的组件,laravel的屏蔽了框架复杂的内部实现,让程序猿们注重业务的开发,而symfony的学习曲线很陡峭,需要你掌握框架的运行机制和各种组件的关系。

本节关注一次请求在Laravel中的生命周期!就是从接收到请求到返回请求整个过程中都发生了哪些比较重要的事件。

入口

让我们先把目光移向程序的入口,index.php的内容如下

代码语言:javascript
复制
<?php
# 自动加载类
require __DIR__.'/../bootstrap/autoload.php';
# $app就是后面要提到的容器
$app = require_once __DIR__.'/../bootstrap/app.php';
# kernel 实现了 Illuminate\Foundation\Http\Kernel 接口
$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);

# 处理请求,返回处理响应类,其基类来自symfony,命名空间为 Symfony\Component\HttpFoundation
# 路径为 vendor/symfony/http-foundation/Response.php
$response = $kernel->handle(
    $request = Illuminate\Http\Request::capture()
);
# 调用send方法,返回header和content
$response->send();
# 完成收尾工作,其实最终调的是$app的terminate方法
$kernel->terminate($request, $response);

app.php

略过自动加载,我们现在看看bootstrap/app.php文件。

代码语言:javascript
复制
<?php
# class Application extends Container implements ApplicationContract, HttpKernelInterface
# Application直接继承了Container,并实现了ApplicationContract, HttpKernelInterface两个契约(接口)
# 在初始化的时候,该类做了很多事情。老高稍后会分析
$app = new Illuminate\Foundation\Application(
    realpath(__DIR__.'/../')
);

// 注册一个单例Illuminate\Contracts\Http\Kernel::class的实现
$app->singleton(
    Illuminate\Contracts\Http\Kernel::class,
    App\Http\Kernel::class
);
// 注册一个单例Illuminate\Contracts\Console\Kernel::class的实现
$app->singleton(
    Illuminate\Contracts\Console\Kernel::class,
    App\Console\Kernel::class
);
// 注册一个单例ExceptionHandler::class的实现
$app->singleton(
    Illuminate\Contracts\Debug\ExceptionHandler::class,
    App\Exceptions\Handler::class
);

return $app;

singleton是单例的意思,在绑定时的逻辑和bind一样,只是多了一个置share的值为true。这个share值会影响make的时候的某一步逻辑,具体代码如下,针对singleton的实例化之后会被$app缓存起来,提高了性能,而通过bind方法绑定的类被实例化时每次返回的都是不同的对象。

代码语言:javascript
复制
        if ($this->isShared($abstract)) {
            $this->instances[$abstract] = $object;
        }

对bind和make的逻辑不清楚的同学可以参考一下laravel的启动过程中服务容器——laravel真正的核心一节。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-04-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 入口
  • app.php
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档