【Laravel】Laravel 框架关键技术解析·读书笔记(一)

自由软件
• 阅读 2841

Laravel 框架关键技术解析·读书笔记(一)

第一章
  • 入口文件

请求访问的入口文件,主要完成几部分工作,分别是:

  1. 自动加载函数的添加
  2. 服务器实例化与服务注册
  3. 路由加载
  4. 请求实例化与路由分发
  5. 相应生成与发送

其中,自动加载函数用于包含引用文件,改文件是composer工具自动生成的,直接require关键字添加即可。

在Laravel框架中一些功能的生成都需要服务容器实现,即IlluminateContainerContainer类的实例,服务容器用于服务注册和解析,也就是说向服务容器注册能够实现某些功能的实例或者回调函数,当需要使用该功能时从服务容器中获取相应的实例来完成。

访问网站的根目录,服务器会调用入口文件进行处理,入口文件会通过IlluminateHttpRequest类的静态方法createFormGlobals()实现请求的实例化,然后通过路由进行分发处理,路由会根据请求的地址查找路由表,查找到将通过路由表中对应的相应处理方式进行处理并返回响应。

  • 模型组件

Illuminatedatabase 组件主要用于操作数据库,他提供了两种数据库的方式,一种是查询构造器方式,一种是Eloqument ORM 方式

通过Eloquent ORM 方式操作数据库需要以下工作

  1. 创建数据库
  2. 添加数据库配置信息
  3. 启动Eloquent ORM模块
  4. 创建model类
  5. 通过model类操作数据库

启动Eloquent ORM 模块阶段需要用到数据库的管理类,即IlluminateDatabaseCapsuleManager 类,需要相应初始化,以及数据库相关配置,以完成数据库Eloquent ORM 模块的启动。


第二章(环境搭建)

第三章(框架常用的PHP语法)
  1. 组件开发语法条件

    1. 命名空间
    2. 文件包含
    • 通过composer工具创建依赖管理时,会在vendor目录下创建一个autoload.php文件和一个composer文件夹,其中composer文件夹中包含了类自动加载函数注册的相关实现,而autoload.php文件是对外的接口,通过包含该文件就可以完成类自动加载函数的注册。
    • 【相应问题看源码,没能够有很理解,停留层次较浅】
  2. 匿名函数
  3. 特殊语法

    1. 魔术方法
    2. 魔术常量
  4. 反射

    • 主要用来动态的获取系统中的类、实例对象、方法等语言结构的信息,通过反射API函数可以实现对这些语言构件信息的动态获取和动态操作等(PHP5具有完整的反射API,添加了对类、接口、函数、方法和扩展进行反向工作的能力)
    • 在laravel框架中,服务容器解析服务的过程中就用到了反射机制
    ##文件 : Illuminate\Container\Container.php

在Laravel框架中,解析服务是通过build()函数实现,一般分为两种情况:一种是查找对应的服务是否被服务提供者注册为实例或者提供服务的匿名函数,如果是,则直接进行服务解析;第二种是服务名称没有响应的服务绑定,通过反射机制来动态创建服务。通过反射机制动态创建服务的过程可以分为两个步骤:第一步是通过放射机制获取服务类构造函数的信息,第二步是解决服务类构造函数的依赖问题。【判断是否存在构造函数,不存在直接实例化,存在则通过getParameters()来获取输入函数,并有相应的方法解决依赖参数问题,实现依赖注入。】

  1. 后期静态绑定

    • 同样的相关介绍,在《深入PHP:面向对象、模式与实践》中也有相关介绍,增加了一个后期延迟静态绑定的功能,用于继承范围引用静态调用的类
    • 在类的继承过程中,使用的类不再是当前类,而是调用的类,后期静态延迟绑定使用关键字static来实现,通过这种机制,“static::”不再解析未定义当前方法所在的类,而是在实际运行时计算得到的。即为运行时最初调用的类。
    • 后期延迟绑定还可以用于对象实例中。在对象实例化中static会根据运行时调用的类来决定实例化对象,而self是根据所在位置的类来决定实例化对象【更多实例,参见IlluminateEloquentModel类的代码,该类中使用了大量的后期静态绑定】
  2. 新特性
  3. trait

    • 单继承语言解决多继承问题方式(Ruby中通过混入类Mixin的方法解决)
    • 通过use 关键字添加到其他类的内部,增加了水平的特性的组合。

trait的一些特质

    1. 优先级:当前类的方式会覆盖trait中的方法,而trait中的方法会覆盖积累的方法
    2. 多个trait组合,通过逗号分隔
    3. 冲突解决:结局多个trait中插入了相同的方法,若没有明确解决冲突将会产生一个致命错误,解决该冲突,需要使用insteadof操作符来明确指定使用冲突方法中的哪一个,同时可以使用as操作符将其中一个冲突的方法以另一个名字来引入。
    4. 修改方法的访问控制:使用as语法调整方法的访问控制
    5. trait的抽象方法:在trait中可以使用抽象成员
    6. trait的静态成员:可以使用静态方法、静态变量
    7. trait的属性定义:可以定义属性
    1. 简化三元运算符

      • $var = (expr1)?(expr2):(expr3);
      • 从PHP5.3起,可以省略三元运算符的中间部分 $var = expr1 ? :expr3
    点赞
    收藏
    评论区
    推荐文章
    blmius blmius
    3年前
    MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
    文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
    皕杰报表之UUID
    ​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
    Easter79 Easter79
    3年前
    spring源码解析
    前言上篇我们介绍了spring容器加载的方式,并重点介绍了基于xml配置解析和注解扫描两种容器加载的方式,封装和注册beandefinition的过程。今天我们分享BeanDefinition注册后的另一个重要过程bean的实例化过程的源码。容器加载流程!spring源码解析spring容器加载源码(bean实
    Jacquelyn38 Jacquelyn38
    4年前
    Vue路由的模块自动化与统一加载
    首先呢,我们来看看一般项目路由是怎么划分的。为什么这么划分呢?如果大项目业务非常多,单纯的单页面很难维护,我们只有这样规范化,才能高效率。模块自动化与统一加载的好处:规范化命名(模块名.业务名.vue)不用每次写页面都要去总路由引入组件接下来,我们实战一波。一、建立项目文件目录以及文件夹根据上面的要求建立,依次在src文件夹下的c
    Stella981 Stella981
    3年前
    MyBatis接口(Bean)与配置信息(Mapper)绑定
    目的MyBatis的XML配置文件解析成JAVA类并在内存中存储,但是在程序运行时需要对应的类去调用,而相应的调用类还没有实例化,现在流行的都是使用Spring去管理需要的对象,Spring提供2种方式,分别为XML与注解。下面来分析调用类的实例化及与配置绑定。1XML方式<bean id"menuMapper" cl
    Stella981 Stella981
    3年前
    Noark入门之线程模型
    0x00单线程多进程单线程与单进程多线程的目的都是想尽可能的利用CPU,减少CPU的空闲时间,特别是多核环境,今天咱不做深度解读,跳过...0x01线程池锁最早的一部分游戏服务器是采用线程池的方式来处理玩家的业务请求,以达最大限度的利用多核优势来提高处理业务能力。但线程池同时也带来了并发问题,为了解决同一玩家多个业务请求不被
    Easter79 Easter79
    3年前
    SpringCloud学习笔记(七)之路由网关Zuul
    是什么Zuul包含了对请求路由和过滤两个最主要的功能:其中路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础。而过滤功能则负责对请求的处理过程进行干预,是实现请求校验、服务聚合等功能的基础。Zuul和Eureka进行整合,将zuul自身注册为Eureka服务治理下的应用,同时从Eureka中获得其他微
    Wesley13 Wesley13
    3年前
    Go 语言基础入门教程 —— 函数篇:匿名函数和闭包
    匿名函数熟悉Laravel框架(一个PHPWeb框架)的同学对匿名函数应该很熟悉,Laravel框架中有着大量匿名函数的应用场景,比如路由定义、绑定实现到接口等://路由定义再比如Swoole中通过回调函数处理网络事件实现异步事件驱动也是匿名函数的典型应用场景://收到请求时触发可以看到,匿名函数
    Stella981 Stella981
    3年前
    Django与drf 源码视图解析
    0902自我总结Django与drf源码视图解析一.原生DjangoCBV源码分析:View"""1)as_view()是入口,得到view函数地址2)请求来了调用view函数,内部调用dispatch函数
    Wesley13 Wesley13
    3年前
    MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
    背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
    美凌格栋栋酱 美凌格栋栋酱
    5个月前
    Oracle 分组与拼接字符串同时使用
    SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(