• laravel中的$request对象构造及请求生命周期


    laravel应用程序中index.php是所有请求的入口。当用户提交一个form或者访问一个网页时,首先由kernel捕捉到该session PHP运行环境下的用户数据,

    生成一个request对象,该对象再传入routing系统寻址到对应的controller,最终由controller形成response返回给浏览器,完成整个网页请求的生命周期。

    $kernel->handle $request=IlluminateHttpRequest::capture->createFromBase->createFromGlobals->

    $request = self::createRequestFromFactory($_GET, $_POST, array(), $_COOKIE, $_FILES, $server);(SymfonyComponentHttpFoundationRequest::createRequestFromFactory

    $response = $this->sendRequestThroughRouter($request);   Kernel.php(IlluminateFoundationHttpKernel
    $this->app['events']->fire('kernel.handled', [$request, $response]);
    return $response;

    response->send();

     从上面的简单分析可以看出,laravel中的请求生命周期分为三个部分:

    1. 一个HTTP请求被routed到一个controller(request对象本身的生成过程如上面所描述)

    2. controller执行特定的action访问数据库获取数据按照商业逻辑处理后返回到View;

    3. View本身将数据做格式化,最终提供HTTP的response到浏览器

    虽然大体过程如上面描述,但是除此之外,也有很多异常流程并未提及。一个request的整个生命周期可以分为三个部分: Loading, Booting, Running.

    loading steps:

    有三个你的应用能够影响loading步骤的三个区域:

    1)workbench: workbench允许你开发和调试一个package

    2)你可以修改bootstrap/strat.php并且增加你的应用环境检测;

    3)你可以修改bootstrap/paths.php来定制你的应用路径

    Booting steps

    有10个你的应用可以影响到booting steps的不同区域:

    1. configuration:你的应用配置影响到boot process和laravel的运行;

    2.service providers:任何你创建的service provider都将在boot process的早期加载到应用中。如果你的service provider 不被deferred,那么他的register()方法将在这时调用;

    3.registering the strat files.你的三个application startup file将在应用的booted 事件发生时被加载

    4.handle middleware going down

    5.booting service providers, 这时所有non-deferred service provider的boot()函数被调用

    6.booting callbacks. 任何使用APP::booting()函数注册的callbacks将被调用

    7.booted callback. 既然应用已经booted了,那么任何使用App::booted()函数注册的回调将被调用。这包括在第三步中用于加载三个application startup文件的callback

    8.Your application start script被调用。这时app/start/globals.php文件。这时任何你希望你的应用在任何request被处理之前所调用的。

    9.app/start/{environment}.php如果你需要在特定环境下初始化的代码可以放到这里。

    10.app/routes.php:你的应用程序的路由。

    running steps

    1.Maintenance mode:如果你有一个maintenance mode侦听函数被注册了,那么你的listener将在此运行;

    2.App "before" filter:

    如果你有任何用App::before()来注册的filter,那么他们在此运行;

    3.Route/Controller "before"filters

    如果你有任何在route或者controller level的before filter,则在此运行;

    4.action:

    这里是一个controller method或者一个route callback当处理请求是被调用;

    5.Route/Controller "after" filters:如果你有route或者controller level的after filter,则在这里被调用;

    6.App "after" filters.

    如果你有任何使用App::after()函数注册的filter,则在这里调用。任何一个middleware可以在response被返回前来修改它;

    7.middleware repsponse handling:

    8. middleware shtdown.如果你提供了一个实现了TerminableInterface的middleware,则他的shutdown()

    9.Finish callbacks:

    如果你有App::finish()注册的callback,则这时调用;

    10.shutdown callbacks。最后,如果你有使用App::shutdown()注册的callback则这时调用

    http://laravel-recipes.com/recipes/52/understanding-the-request-lifecycle

  • 相关阅读:
    Java:Excel文件上传至后台
    JDK1.8中的HashMap实现
    Redis远程连接报错解决
    Redis操作命令总结
    HashMap实现原理及源码分析
    谈谈对Spring IOC的理解
    centos 7.3 服务器环境搭建——MySQL 安装和配置
    Linux系统下 docker安装命令
    JS求两个数组的交集 (假设数组已经经过排序)
    作用域和作用域链
  • 原文地址:https://www.cnblogs.com/kidsitcn/p/4696276.html
Copyright © 2020-2023  润新知