精华内容
下载资源
问答
  • Laravel运行流程

    2019-11-05 10:11:09
  • // 使用最终目标回调运行管道,最终需要运行的结果 - > then ( $this - > dispatchToRouter ( ) ) ; 进入 dispatchToRouter 路由分发 ,最终由路由类中 dispatch 执行路由,并实现注入 $this - ...

    1.index.php

    $app = require_once __DIR__.'/../bootstrap/app.php';
    $kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);
    $response = $kernel->handle(
        $request = Illuminate\Http\Request::capture()
    );
    

    2.进入app.php

    $app = new Illuminate\Foundation\Application(
        $_ENV['APP_BASE_PATH'] ?? dirname(__DIR__)
    );
    
    $app->singleton(
        Illuminate\Contracts\Http\Kernel::class,
        App\Http\Kernel::class
    );
    
    • Application 类绑定基本类到容器

    • Kernel 类执行路由分发加载控制器等操作

    3.进入 Kernel.php

    // 全局路由中间件,每次执行都会执行
    protected $middleware = [];
    // 中间件路由分组,
    protected $middlewareGroups = [];
    // 中间件别名,可以单独使用也可以分配给组
    protected $routeMiddleware = [];
    // 中间件排序
    protected $middlewarePriority = [];
    
    • kernel 类继承 Illuminate\Foundation\Http\Kernel 类

    4.进入 Illuminate\Foundation\Http\Kernel 类

    //http方法参数覆盖,也就是 X-HTTP-METHOD-OVERRIDE 中有参数,就按照这个里面的走,如果没有,那就是post
    $request->enableHttpMethodParameterOverride();
    // 通过中间件/路由器发送给定的请求。
    $response = $this->sendRequestThroughRouter($request);
    // 触发事件并呼叫听众  韩注:触发观察者
    $this->app['events']->dispatch(
    new Events\RequestHandled($request, $response)
    );
    return $response;
    

    进入 sendRequestThroughRouter 方法

    // 注册请求类到容器中
     $this->app->instance('request', $request);
    // 从facade根实例 中删除共享实例
    Facade::clearResolvedInstance('request');
    // 启动引导类   protected $bootstrappers = []; 引导类都在这个数组中
    $this->bootstrap();
    // 通过管道模式执行最终结果,切面编程,aop 
     return (new Pipeline($this->app))
                        // 设置通过管道发送的对象
                        ->send($request)
                        // 设置管道阵列。
                        // shouldSkipMiddleware   判断是否应该跳过中间件,$this->make('middleware.disable')  设置为true
                        // $this->bound('middleware.disable')  设置为true 应该可以跳过 所有中间件,不知道这么做的好处是什么?
                        ->through($this->app->shouldSkipMiddleware() ? [] : $this->middleware)
                        // 使用最终目标回调运行管道,最终需要运行的结果
                        ->then($this->dispatchToRouter());
    
    
    • 进入 dispatchToRouter 路由分发 ,最终由路由类中 dispatch 执行路由,并实现注入

    $this->router->dispatch($request);
    
    • 利用反射原理实现依赖注入 Illuminate\Container\Container 类中
    
    public function make($abstract, array $parameters = []){
       return $this->resolve($abstract, $parameters);
    }
    public function build($concrete)
    //  build 中  
    $reflector = new ReflectionClass($concrete);
    

    依赖注入通过 $parameter->getClass() 知道是什么类

    class Demo{
        public function store(Request $req333, $abc){
        }
    }
    class Request{}
    $method = new ReflectionMethod('Demo', 'store');
    foreach ($method->getParameters() as $parameter) {
    
        // 获取参数的限制类的类型
        $param_type = $param->getClass(); //获取当前注入对象的类型提示
        $param_value = $param->getName(); //获取参数名称
    
        if ($param_type) {
            // 通过类的类型限制名称中提取容器中的实例
            $avgs[] = $app[$param_type->name];
        }
        
    }
    $reflect->invokeArgs($app['demo'], $avgs);
    
    • X-HTTP-METHOD-OVERRIDE 可以覆盖laravel的请求,比如实现restful请求,像put delete 等特殊的请求

    展开全文
  • 六、执行一个  $loader->register(true); , [register 方法逻辑] 一个布尔值参数,将传给 spl_autoload_register 第三个参数中。 而自动加载程序为: array($this, 'loadClass') ,也就是本类的  load...

    定位

    • 从 public/index.php 定位到 bootstrap/autoload.php
    • 从 bootstrap/autoload.php 定位到 vendor/autoload.php
    • 从 vendor/autoload.php 定位到 __DIR__ . '/composer' . '/autoload_real.php';

    定位完毕,你会看到这样的代码:

    return ComposerAutoloaderInit2bf9ae5262a23b284c9433508d41d77f::getLoader();

    ComposerAutoloaderInit2bf9ae5262a23b284c9433508d41d77f 简称本类。

    那我们就从 getLoader() 方法入手。

    getLoader()

    文件位于: __DIR__ . '/composer' . '/autoload_real.php';

    逻辑顺序:

    一、如果静态变量 $loader 不为空则返回 $loader

    二、注册一个自动加载程序,加载程序为本类的 loadClassLoader() 方法,

    [loadClassLoader 方法逻辑]


    静态方法,含有一个 $class 参数,判断如果 $class 等于 Composer\Autoload\ClassLoader,则载入当前目录下
    的 ClassLoader.php 文件,实际上是在为这句代码工作:self::$loader = $loader = new \Composer\Autoload\ClassLoader();


    三、 $loader 得到 ClassLoader 类(\Composer\Autoload\ClassLoader)的一个实例,卸载自动加载程序 loadClassLoader,

    四、载入路径信息,设置路径信息,

    五、载入一些 autoload_x.php 形式的文件,


    分别有:

    • autoload_namespaces.php
    • autoload_psr4.php
    • autoload_classmap.php

    并进行各自的循环 set 操作,如 $loader->set($namespace, $path);

    【set 函数】2 个参数,一个前缀,一个路径。如果前缀非真,将 paths 转为数组类型赋值给类成员变量 fallbackDirsPsr0,如果前缀为真,则将路径赋值给
    $this->prefixesPsr0[$prefix[0]][$prefix] ,这个写法的意思等同于字母索引,比如 phpDocumentor ,则数组就图所示:

     

    file


    六、执行一个 $loader->register(true);

    [register 方法逻辑]


    一个布尔值参数,将传给 spl_autoload_register 第三个参数中。
    而自动加载程序为:array($this, 'loadClass'),也就是本类的 loadClass() 方法。

    [loadClass 方法逻辑]

    一个 $class 参数,用了 findFile() 方法判断文件是否存在,存在则调用函数 includeFile() 载入文件。

     

    file

    注意:这个函数也在本类中直接定义了的。


    七、还载入了一个 autoload_files.php,而里面也是一组文件数组,貌似预加载一些函数库文件吧,没有继续深入这里了。

    八、最后返回一个 $loader 变量,也就是 ClassLoader 类的实例。

    好了,现在看看 $loader 这个实例到此拥有些什么?部分截图所示:

     

    file

    可以看出类属性包含了具有字母索引的一些命名空间,文件路径等信息。这和刚才载入那几个文件进行 set 操作有关,想起来了吗?

    到此 getLoader() 方法逻辑结束。

    总结

    实现自动化的关键代码是 vendor/autoload.php 的 ::getLoader() 静态方法,
    利用此方法内部的 $loader->register(true); 方法注册自动化载入方法,这样,当 new 对象的时候自动触发 loadClass() 了,而上面提到的 set 一些路径信息,正是自动化的必备条件,如有兴趣可以自行查看 vendor/composer/ClassLoader.php 的 loadClass() 方法代码细节。

    上面如果没懂的,请打开文件代码,跟着慢慢走,慢慢看,一定能懂。

    在返回到 vendor/autoload.php,在把 return $loader 返回到上一层。
    即 bootstrap/autoload.php,
    这行的代码 require __DIR__.'/../vendor/autoload.php';
    我们 var_dump() 下 require 的返回值,和刚才 $loader 的部分截图完全一致。
    其实有从 aotuload_real.php 文件开始,我尝试过删除 return,也没有任何报错,不知道这里的 return 意义为何。

    可是还没有看到真正 new, 我们知道了原理,得看看它在哪调用了?
    在看 index.php 定位到了 bootstrap/app.php
    打开就看到第一个

    $app = new Illuminate\Foundation\Application(
        realpath(__DIR__.'/../')
    );
    展开全文
  • Laravel5.5执行流程

    2018-10-24 10:07:41
    一张图了解一下典型的Laravel应用程序的完整执行流程
  • 主要介绍了laravel 框架执行流程与原理,结合实例形式分析了laravel框架基本执行流程、原理及相关操作技巧,需要的朋友可以参考下
  • laravel一套流程

    2017-09-15 22:31:00
    首先切换到phpstudy/www目录下首先切换到phpstudy/www目录下运行 composer create-project laravel/laravel 命令安装laravelcd laravel切换到laravel目录下同步到 Gitgit initgit add -Agit commit -m “initial ...

    首先切换到phpstudy/www目录下首先切换到phpstudy/www目录下

    运行 composer create-project laravel/laravel 命令安装laravel

    cd laravel切换到laravel目录下

    同步到 Git

    git init

    git add -A

    git commit -m “initial commit”

    //然后在 git上创建远程库名字为 laravel-comment

    git remoteaddorigin https://github.com/替换为你自己的git用户名/laravel-comment.git

    git push -u origin master

    输入账号密码同步成功

    配置数据库

    sudo service mysql start

    //连接 mysql

    mysql -u root

    //创建数据库c

    reate database laravel_comment;

    //退出

    mysqlexit;

    打开代码根目录下的 .env 文件,修改相应代码

    DB_CONNECTION=mysql

    DB_HOST=127.0.0.1

    DB_DATABASE=你的数据库名称

    DB_USERNAME=你的帐号

    DB_PASSWORD=你的密码

    展开全文
  • Laravel框架执行流程

    千次阅读 2017-04-13 15:37:09
    俗话说知己知彼百战不怠,使用Laravel也有有一段时间了,中间也踩了很多坑,碰了很多壁,归根结底还是对Laravel的底层不太了解,以前使用Thinkphp养成的MVC的习惯,刚接触Laravel一...研究了下Laravel框架的执行流程
  • laravel 支付宝流程

    千次阅读 2018-11-08 18:25:33
    容器是现代 PHP 开发的一个重要概念,Laravel 就是在容器的基础上构建的。我们将支付操作类实例注入到容器中,在以后的代码里就可以直接通过 app('alipay') 来取得对应的实例,而不需要每次都重新创建。 我们...
  • laravel启动流程

    2020-03-17 12:10:21
    1. 用户请求index.php 2. 创建app.php 服务容器 3. request 被发送到http kernel或者console kernel ...这些启动对象或者配置错误处理对象,或者日志处理对象,侦测应用系统环境, 执行一些在request被处理之前的...
  • laravel开发流程

    2020-08-20 18:16:48
    Auth 中间件 必须 书写在控制器的 __construct 方法中,并且 必须 使用 except 黑名单进行过滤,这样新增控制器方法时,默认是安全的 二,主要流程 一个功能齐全的模块大概需要以下常用开发流程,实际应用中可以根据...
  • laravel访问流程

    千次阅读 2018-07-16 15:39:28
    统一入口laravel框架使用了统一入口,入口文件:/public/index.php<code class="php" data-origin="" <?php" style="font-family: "Courier New", ...
  • Laravel基础运行流程

    千次阅读 2018-05-29 22:44:16
    在index.php入口文件中,主要引入了两个文件,一个是laravel/bootstrap/autoload.php另一个是laravel/bootstarp/app.php。我们先说这个autoload.php文件。这个文件正如它的名字一样,自动加载类,也就是解决命名空间...
  • Laravel 队列执行流程

    千次阅读 2019-07-26 16:30:31
    执行队列 ... 执行队列过程,从queues:detault:delayed有序集合拿出到期的JOB数据放到queues:detault队列中,然后从首先从queues:detault 队列拿出要执行的JOB...laravel 这边的延迟队列使用了三个队列。 queue:de...
  • 搭建Laravel框架流程

    千次阅读 2014-10-23 18:51:50
    1.搭建LAMP: 安装apache2:sudo apt-get install ...10.打开laravel主目录(composer.josn目录)运行:composer install 自动安装文件 11.输入127.0.0.1/laravel/public得到图: you have arrived
  • [原创]Laravel 启动流程

    2018-07-11 12:01:34
    请求到响应的整个执行阶段归纳为 4 个: 程序启动准备阶段 文件自动加载 服务容器实例化 基础服务提供者的注册 核心类的实例化 请求实例化阶段 实例化 Request 实例 请求处理阶段 准备请求...
  • 经过上面一大串子分析,Laravel已经加载了大部分的基础服务,现在是不是还有个疑问,我们的请求是怎么到Controller的呢 答案就在app.php的下面的几行代码了 $app->singleton( Illuminate\Contracts\...
  • 执行安装程序 如果第二张图片没有自动设定,解决如下 2,验证安装成功( composer ) 如果没有显示,则可能环境变量出错,需要设置 3,使用composter方式部署laravel项目 第一步,切换镜像到国内镜像 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,280
精华内容 1,312
关键字:

laravel的运行流程