新手想了解一下laravel收到请求到返回页面的整个流程是怎么样的

laravel小白,想向大家请教一下,laravel收到一个请求的时候,是怎么处理的?

从收到request到做出response的整个流程。

第一次接触框架开发,希望大家不要笑话我。

Thx

animaflower

看了你的问题,我准备研究下laravel 的流程 但是开始就遇到了问题!!

class ComposerAutoloaderInita27a8091010d0d1cf0fe2866d617ef1d
{
    private static $loader;
	
    public static function loadClassLoader($class)
    {
        if ('Composer\Autoload\ClassLoader' === $class) {
            require __DIR__ . '/ClassLoader.php';
        }
        
    }

    public static function getLoader()
    {
        if (null !== self::$loader) {
            return self::$loader;
        }
		//自己定义一个自动加载函数 ,loadClassLoader
        spl_autoload_register(array('ComposerAutoloaderInita27a8091010d0d1cf0fe2866d617ef1d', 'loadClassLoader'), true, true);
        
        self::$loader = $loader = new \Composer\Autoload\ClassLoader();
        
        //取消这个自动加载函数
        spl_autoload_unregister(array('ComposerAutoloaderInita27a8091010d0d1cf0fe2866d617ef1d', 'loadClassLoader'));

ClassLoader这个类的自动加载我就看不懂了,瞬间注册和注销一个自动加载函数 目的 就是为了require ClassLoader.php这个东西…
这不是多此一举吗.

想学算法的程序猴子

@animaflower 至少你还知道从哪里入手,我是云里雾里不知所以

animaflower

public 目录下面的 index.php 是整个程序 的入口

animaflower
// autoload_real.php @generated by Composer

class ComposerAutoloaderInita27a8091010d0d1cf0fe2866d617ef1d
{
    private static $loader;
    
	/*
    public static function loadClassLoader($class)
    {
        if ('Composer\Autoload\ClassLoader' === $class) {
            require __DIR__ . '/ClassLoader.php';
        }
        
    }
	*/
    
    public static function getLoader()
    {
        if (null !== self::$loader) {
            return self::$loader;
        }
        
        if(file_exists(__DIR__ . '\ClassLoader.php')) {
        	require __DIR__ . '\ClassLoader.php';
        	self::$loader = $loader = new \Composer\Autoload\ClassLoader();
        }else{
        	exit( 'ClassLoader require fail !');
        }
		
		/*
		//自己定义一个自动加载函数 ,loadClassLoader
        spl_autoload_register(array('ComposerAutoloaderInita27a8091010d0d1cf0fe2866d617ef1d', 'loadClassLoader'), true, true);
        
        self::$loader = $loader = new \Composer\Autoload\ClassLoader();
        
        //取消这个自动加载函数
        spl_autoload_unregister(array('ComposerAutoloaderInita27a8091010d0d1cf0fe2866d617ef1d', 'loadClassLoader'));
		*/

改后并不影响什么,作者真的就是想秀一下这两个函数

justtest

@animaflower 这两行中间只有一句话,应该就是为这句话服务的。
点进他注册的自动加载函数 loadClassLoader 中可以看到,如果访问特定的完全限定名,则返回 ClassLoader 这个类。
中间这句恰恰访问的就是这个, 这个过程下来的作用就是把 ClassLoader 对象赋值给了当前类的静态属性 loader,因为他注册的时候把加载函数置于了 spl autoload 的栈首,任何自动加载的文件都要先经过这个方法处理,可能为了性能考虑,在完成目的后就立刻注销掉了这个自动加载器。

为什么这里不直接用 include 呢? 还是为了性能考虑,并不是每个应用的每个页面都需要 composer 去自动加载, include 的话,每个请求无论是否需要都要读取一次这个文件,他想做到按需加载。

为什么注销之后还能运行? 那是因为你之前没注销的时候,他已经生成了加载文件的映射数据,就是后面的 autoload_psr static files 那些, 注销自动加载器没有影响这些文件的载入和你的应用效果。

animaflower
###开始:public/index.php
/**
 * Laravel - A PHP Framework For Web Artisans
 *
 * @package  Laravel
 * @author   Taylor Otwell <taylorotwell@gmail.com>
 */
###结束:vendor\laravel\framework\src\Illuminate\Routing\Controller.php
    /**
     * Execute an action on the controller.
     *	执行控制中的器方法
     * @param  string  $method
     * @param  array   $parameters
     * @return \Symfony\Component\HttpFoundation\Response
     */
    public function callAction($method, $parameters)
    {
    	//经过复杂的解析最终控制器类里面的方法在这里运行了
        return call_user_func_array([$this, $method], $parameters);
    }
看了两天,才简单看完整个流程,楼主你下载个php手册,慢慢看就会看完整个流程了.比较复杂......
animaflower

@justtest 你说的好像不是很对,ClassLoader这个类每次请求都必须加载.

justtest

@animaflower 有道理,我错了,那就不是为了性能考虑,因为每次访问这个方法都要加载它。

想学算法的程序猴子

如果只看index.php的话,是这样的。
1 request 被服务器发送给 index.php
2 index.php 创建 laravel 实例
3 创建 service container 实例
4 Http Kernel 配置 error log 并启动 middleware
然后 dispatch 然后 response.
那么我现在的问题是…service provider里的内容是在哪里加载的呢? @justtest @animaflower

animaflower
我只是粗略的过了下流程,还不能清楚的理解你这里的 service provider 指的是具体哪里的内容,是不是上面图中指的?
想学算法的程序猴子

@animaflower 是我没说清,我想问的是IOC模型是什么时候被加载起来的,请问如何 @ 一下JellyBool

animaflower
这问题真的没必要麻烦站长大人了吧!!!
http://www.cnblogs.com/amy26/p/4633015.html
想学算法的程序猴子

@animaflower 谢谢,我就是想找这个流程图