zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    HDU 5115 Dire Wolf (区间DP)
    HDU 4283 You Are the One(区间DP(最优出栈顺序))
    ZOJ 3469 Food Delivery(区间DP好题)
    LightOJ 1422 Halloween Costumes(区间DP)
    POJ 1651 Multiplication Puzzle(区间DP)
    NYOJ 石子合并(一)(区间DP)
    POJ 2955 Brackets(括号匹配一)
    POJ 1141 Brackets Sequence(括号匹配二)
    ZOJ 3537 Cake(凸包+区间DP)
    Graham求凸包模板
  • 原文地址:https://www.cnblogs.com/kidsitcn/p/4696276.html
Copyright © 2011-2022 走看看