Laravel5.1 启动详解

借鉴:http://www.cnblogs.com/wish123/p/4756669.html

Laravel所有请求的入口文件是:/public/index.php,代码如下

<?php

/*
|--------------------------------------------------------------------------
| Register The Auto Loader
|--------------------------------------------------------------------------
|
| Composer provides a convenient, automatically generated class loader for
| our application. We just need to utilize it! We‘ll simply require it
| into the script here so that we don‘t have to worry about manual
| loading any of our classes later on. It feels nice to relax.
|
*/
//自动加载文件设置
require __DIR__.‘/../bootstrap/autoload.php‘;

/*
|--------------------------------------------------------------------------
| Turn On The Lights
|--------------------------------------------------------------------------
|
| We need to illuminate PHP development, so let us turn on the lights.
| This bootstraps the framework and gets it ready for use, then it
| will load up this application so that we can run it and send
| the responses back to the browser and delight our users.
|
*/
//初始化服务容器,即框架的 IoC 容器,生成一个Laravel应用实例
$app = require_once __DIR__.‘/../bootstrap/app.php‘;

/*
|--------------------------------------------------------------------------
| Run The Application
|--------------------------------------------------------------------------
|
| Once we have the application, we can handle the incoming request
| through the kernel, and send the associated response back to
| the client‘s browser allowing them to enjoy the creative
| and wonderful application we have prepared for them.
|
*/
//通过服务容器生成一个 HTTP / Console kernel类的实例
$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);
//kernel类实例运行handle方法,接收请求和处理结果(主要是运行middleware和URL相关的controller)
$response = $kernel->handle(
    $request = Illuminate\Http\Request::capture()
);
//返回处理结果
$response->send();
//为整个请求处理周期展示最后的任何想要提供的动作,如每次访问后想要记录用户行为、给前端发消息
$kernel->terminate($request, $response);

(1)自动加载文件

  自动加载文件功能是通过Composer实现的,在composer.json中设置的加载方式里提取加载路径,然后根据Laravel对应的加载方式进行处理,主要为四种加载方式:

  1. PSR0加载方式—对应的文件就是autoload_namespaces.php
  2. PSR4加载方式—对应的文件就是autoload_psr4.php
  3. 其他加载类的方式—对应的文件就是autoload_classmap.php
  4. 加载公用方法—对应的文件就是autoload_files.php

  具体的定义形式在 composer.json 里面设置路径,如下:

"autoload": {
    "classmap": [
        "database"
    ],
    "psr-4": {
        "App\\": "app/",
        "App\\Http\\Models\\": "app/Http/Models/"
    }
},
"autoload-dev": {
    "classmap": [
        "tests/TestCase.php"
    ]
},

(2)初始化服务容器

  The Laravel service container is a powerful tool for managing class dependencies and performing dependency injection.

  这句话是指 Laravel 服务容器的核心是依赖注入(也是控制反转,一种设计模式),它是把在类里面定义实例的这种高耦合模式摒弃掉,虽然工厂模式也行,不过也比较不灵活,然后以一种依赖的方式去把相关的类注册在容器里,需要时再把类实例从容器提取出来注入到本身。

  本质上是分离,将各种功能分离开,保证了松耦合,例如应用程序用到Foo类,Foo类需要Bar类,Bar类需要Bim类,那么先创建Bim类,再创建Bar类并把Bim注入,再创建Foo类,并把Bar类注入,再调用Foo方法,Foo调用Bar方法,接着做些其它工作。

  Laravel这个过程粗略的有以下几个步骤:

  1、registerBaseBindings:初始化基本的容器实例。

  2、registerBaseServiceProviders:注册基本的service provider,有两个:event、route。event service provider会设置队列的处理工厂,route service provider定义一些路由行为,包括请求、反应、重定向这些。

  3、registerCoreContainerAliases:注册核心的容器功能类的别名,这些类包括验证、缓存、配置、队列、session等。

(3)生成kernel类

  The HTTP kernel extends the Illuminate\Foundation\Http\Kernel class, which defines an array of bootstrappers that will be run before the request is executed. These bootstrappers configure error handling, configure logging, detect the application environment, and perform other tasks that need to be done before the request is actually handled.

  The HTTP kernel also defines a list of HTTP middleware that all requests must pass through before being handled by the application. These middleware handle reading and writing the HTTP session, determine if the application is in maintenance mode, verifying the CSRF token, and more.

(4)kernel handle处理

  将kernel当成黑盒来看,接收请求、处理请求。

时间: 2024-10-17 15:19:49

Laravel5.1 启动详解的相关文章

centos启动详解

centos启动的过程是怎样的呢? 1:加载BIOS信息(计算机的硬件信息在BIOS中有保存的)找到第一个引导设备(硬盘在bios里我们可以设置boot引导) 2:根据第一个引导设备找到它的MBR  的boot Loader(mbr是硬盘的第一个扇区 boot Loader可以认为是grub spfdisk等程序 ) 3:boot Loader 找kernel(内核),kernel会加载硬件信息和加载驱动程序(这里由硬件转到软件了) 4:之后会调用init进程 init会让各相关服务启动起来 c

PC104上配置VxWorks硬盘启动详解

DEVPC104-SYS是一款在 PC104 尺寸上开发出来的嵌入式工业主板.以其小巧的体积﹑超强的功能和稳定性,可广泛应用于自动查询系统﹑POS 机﹑网络终端﹑仪器仪表﹑信息家电.工业控制等各种嵌入式领域. VxWorks 是美国 Wind River System 公司推出的一个实时操作系统.通常所指的VxWorks操作系统对应软件包括三个部分:引导程序bootrom.主操作系统vxWorks.以及用户开发程序.Tornado提供一个集成的编译bootrom.vxWorks以及用户程序的工程

Android之Zygote启动详解

我们知道Android系统是基于Linux内核的,在Linux系统中所有的进程都是init进程的子进程.Zygote也一样它是在系统启动的过程中由init进程创建的,在系统启动脚本init.rc中: <span style="font-size:14px;">@init.rc service zygote /syste/bin/app_process -Xzygote /system/bin -zygote --start-system-server class main

深入浅出mybatis之启动详解

深入浅出mybatis之启动详解 MyBatis功能丰富,但使用起来非常简单明了,今天我们来追踪一下它的启动过程. 目录 如何启动MyBatis 如何使用MyBatis MyBatis启动过程 如何启动MyBatis 我们知道,SqlSessionFactory是MyBatis中最为核心的组件,每个基于MyBatis的应用都是以一个SqlSessionFactory实例为中心的.SqlSessionFactory的实例可以通过SqlSessionFactoryBuilder获得,而SqlSess

Linux 启动详解之init

1.init初探 init是Linux系统操作中不可缺少的程序之一.init进程,它是一个由内核启动的用户级进程,然后由它来启动后面的任务,包括多用户环境,网络等. 内核会在过去曾使用过init的几个地方查找它,它的正确位置(对Linux系统来说)是/sbin/init.如果内核找不到init,它就会试着运行/bin/sh,如果运行失败,系统的启动也会失败. 根据实际看一下,我们来到/boot下, 可以看见,Grub就在这里,vmlinuz-2.6.32-358.el6.i686这个文件很重要,

DSP2812&#160; 启动详解

百度文库转载 1. 从0X3F FFC0处复位→执行0X3F FC00地址处的初始化引导函数(Initboot) →根据GPIO选择引导模式→确定用户程序入口地址→从入口处开始执行用户程序. 输入外部引脚为/XRS, /XRS为低电平时,DSP终止执行,PC指向地址:0x3FFFC0,当/xRS变成高电平时,DSP开始执行0x3FFFC0中存放的指令.这条指令是条跳转指令或者说是复位中断向量,这个中断向量指向地址0X3F FC00处的初始化引导函数(Initboot),即将地址0x3FFC00(

CentOS 7 Vsftpd无法启动详解

不小心安装了CentOS 7(说多了都是泪呀,各种不适应),不过随遇而安吧(PS:不要用既来之则安之,不懂的可以百度.),装完系统后想跑个Vsftpd, yum -y install vsftpd 坐等安装完毕(用的手机2G流量那个心塞). 启动vstfpd: service start vsftpd (这条命令现在已经不管用了,) /etc/init.d/vsftd start (想都不用想,就没有这个脚本) 这可怎么办?当然是systemctl了,这个命令在今后的版本里非常有用需要熟练掌握.

centos7开机启动详解

Centos 系统服务脚本目录: /usr/lib/systemd/ 有系统(system)和用户(user)之分, 如需要开机没有登陆情况下就能运行的程序,存在系统服务(system)里,即: /lib/systemd/system/ 反之,用户登录后才能运行的程序,存在用户(user)里 服务以.service结尾. 这边以nginx开机运行为例 1.建立服务文件 vim /lib/systemd/system/nginx.service [Unit]   Description=nginx

centos 7 上配置mysql 开机启动详解

之前多次在centos7环境下配置mysql开机自启动出现了错误.现留下篇文章已做记录 一.centos7与centos6相比有什么不同: 1 在centos7中服务不在是用service这个命令来启动与停止,也不再用chkconfig来设置开机启动与否! 在centos7中所有对服务的管理都集中到了systemctl当中:systemctl不再是合之前一样依赖/etc/init.d/下 的脚本,它是通过配置文件来完成对服务的管理的: 二.创建systemctl管理mysql的配置文件: 1 创