当前位置: 首页 > news >正文

Laravel源码进阶

Laravel源码进阶

  • 版本 laravel5.8

生成服务容器

  • public index.php
//compose必要操作
require __DIR__.'/../vendor/autoload.php';
//容器文件
$app = require_once __DIR__.'/../bootstrap/app.php';

-bootstrap/app.php

//初始化容器 构造函数中执行这个几个方法
//$this->registerBaseBindings();
// $this->registerBaseServiceProviders();
//$this->registerCoreContainerAliases();
$app = new Illuminate\Foundation\Application(
    $_ENV['APP_BASE_PATH'] ?? dirname(__DIR__)
);

$app->singleton(
    Illuminate\Contracts\Http\Kernel::class,
    App\Http\Kernel::class
);

$app->singleton(
    Illuminate\Contracts\Console\Kernel::class,
    App\Console\Kernel::class
);

$app->singleton(
    Illuminate\Contracts\Debug\ExceptionHandler::class,
    App\Exceptions\Handler::class
);

return $app;
  • 首先加载autoload文件 -> 先new app(就是application 初始化instance方法初始化instance属性 然后registrProvider 使用的是观察者模式 然后传入对象就是会执行register方法 这就是为什么需要register方法 绑定bindings属性 ) singleton就是绑定在bindings属性上
    singleton就是有三种方式调用方式
    在这里插入图片描述
  • make方法的实现
    $kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);
    获取实例化对象
  • serviceProvider 分析
    在这里插入图片描述
    第一种laravel的依赖注入去绑定服务者
    第二种就是自己去创建依赖关系
    bind是绑定
    在路由中使用app(“Family”)就是可以解析
  • 加载并启动laravelProvider(进入request请求了)(封装用户请求) 加载环境变量 加载配置 加载异常 加载Facades 加载服务提供者
    new static() 延迟加载
  • 封装用户请求 -> 穿过路由和中间件->封装一系列的服务
  • register 用户绑定服务到容器, 先调用provider的register方法,等所有服务都注册完毕再去调用每一个服务的boot方法 register是必须的,boot方法不是必须的
  • 服务提供者延时注册
  • 事件:观察者模式 用来解耦非常的完美
  • 中间件:管道模式,用户请求经过一层一层的中间件,然后执行用户处理逻辑,先走全局,然后web,然后自己的中间件

总结

  • 实现依赖注入,更好的管理类之间的依赖关系,为扩展提供无线的可能,实现了一些高级特性
  • 缺点:加载文件太多,导致速度变慢
  • 声明周期 包含自动加载文件-> 注册基础的bindings -> 注册进出的servicePeovider 只是最基础的-> 绑定重要的接口 ->获取request对象 -> 业务逻辑处理 (加载基本的启动项,路由,异常处理,通过管道模式使用中间件处理业务) -> 返回response
  • 常用的模式 单例模式,观察
http://www.dtcms.com/a/128915.html

相关文章:

  • AWTK-MVVM 如何让多个View复用一个Model记录+关于app_conf的踩坑
  • 再看 MPTCP 时的思考
  • Spring 是如何解决循环依赖的?
  • Redis-分布式锁
  • Shell打印命令返回的数组只显示第一个元素
  • 云豹录屏大师:多功能免费录屏工具
  • Maven 的安装与配置(IDEA)
  • 本地Docker部署开源Web相册图库Piwigo与在线远程访问实战方案
  • TypeScript入门
  • MySQL安装实战分享
  • LINUX基础 [二] - Linux常见指令
  • Unity协程从入门到精通:告别卡顿,用Coroutine优雅处理异步与时序任务 (Day 27)
  • Compose笔记(十六)--ExoPlayer
  • 一、绪论(Introduction of Artificial Intelligence)
  • 多模态大语言模型arxiv论文略读(十五)
  • 【技术派部署篇】Windows本地部署技术派
  • 果篮问题 Python
  • 【论文阅读】RMA: Rapid Motor Adaptation for Legged Robots
  • 最近在工作中感受到了设计模式的重要性
  • SDC命令详解:使用相对路径访问设计对象(current_instance命令)
  • OpenFlow v1.1+流表匹配流程解析
  • DeepSeek私有化部署性能怎么样?企业级AI落地实战解析!
  • vue+leaflet 区域划分_反向遮罩层
  • 深入解析 QuickAPI 三大核心能力:SQL 编辑器、数据 API、数据市场
  • 自然语言处理、计算机视觉与语音处理-AI学习Day3
  • swift菜鸟教程24-25(可选链,自动引用计数)
  • PyTorch张量操作指南:cat、stack、split与chunk的实战拆解
  • vue3中,element-plus中el-input的v-model和value的用法示例
  • 数据结构:哈希表 | C++中的set与map
  • muduo库源码分析: TcpConnection