redirect方法,可以在自定义的控制器实现跳转的功能。看thinkphp 5.1源码发现它是在在jump trait中定义的一个方法。
Controller.php
1 | . |
jump.php 可以看到它抛出一个异常
1 | <?php |
查看HttpResponseException可以发现它是Excepton的子类
HttpResponseException.php
1 | <?php |
RuntimeException是SPL中的类,它继承Exception1
2class RuntimeException extends Exception {
}
到此我们知道了redirect()方法其实是抛出一个异常,那它是在哪里调用然后输出(跳转)呢?
从入口文件index.php开始。发现先加载base.php,然后执行App类的run方法。然后调用返回对象的send方法
1 | <?php |
App类,发现它catch了一个HttpResponseException,返回Redirect类型的Response 对象
1 | <?php |
继续看Redirect类父类Response的send方法。它设置了header头等
1 | <?php |
最后应用终止时会执行shutdown处理方法。它在Error.php已经注册了shutdown方法为Error类的appShutdown方法
1 | <?php |
appShutdown方法
1 | public static function appShutdown() |
OK.
另:thinkphp 5.0源码阅读参考:https://www.kancloud.cn/zmwtp/tp5/155311
