首页 后端开发 php教程 cakephp执行流程代码解读

cakephp执行流程代码解读

Dec 20, 2016 am 09:40 AM

最近由于工作需要用到cakephp这个PHP框架,由于之前用的比较少,加之最近看了些手册感觉对cakephp里面有些东西还不是很清楚,于是决定看下它的源代码,下面是我看的过程中一些笔记

我觉得如果有兴趣查看这个文档的话最好是打开相应的PHP文件对照查看,要不然很有可能都不知道我在说什么。

开始:

当我们从网上默认下载安装以后,都会有app,cake , vendors三个目录以及.htaccess,和index.php文件。

根据手册说明以及经验,cake目录为框架的核心代码同时也是我们开发的时候不需要动的一个目录,这样对我们以后升级框架内核是有帮助的。如果在开发过程中需要自己编写类,可以把文件放在vendors目录下面然后使用app::import等方法调用。.htaccess和index.php会把默认访问请求传递给app/webroot/index.php文件执行(如服务器不支持.htaccess,则需重新修改index.php文件),最终我们可以确定app才是我们默认的主战场!(当然这个是可以更改的,比如说几个应用程序公用一个内核的情况,我这里不细说了)

当打开app/webroot/index.php文件以后,我们会发现这个文件写的非常简单,开始一段代码定义了一些基本路径的常量(如app路径,更目录路径等),后面包含了一个cake/bootstrap.php文件,也就是这个文件加载了所有框架所必需的信息以及初始化工作,让我们看下它到底做了些什么。

 

下面的是bootstrap.php文件里面部分代码,我在里面适当的加了一些注释
if (!isset($bootstrap)) {
                require CORE_PATH . 'cake' . DS . 'basics.php';   //定义了框架通用的函数方法
                $TIME_START = getMicrotime();
                require CORE_PATH . 'cake' . DS . 'config' . DS . 'paths.php'; //文件路径定义文件
                require LIBS . 'object.php'; //所有类的父类
                require LIBS . 'inflector.php'; //命名类,处理单复数已经驼峰命名等:如Inflector::pluralize('example') 返回 “examples”
                require LIBS . 'configure.php'; //配置参数类 --里面定义有重要的加载类app::import ,以后我们就可以使用它进行类文件导入了
        }
        require LIBS . 'cache.php';   //加载缓存引擎类

        Configure::getInstance();  //初始化配置文件,这里会加载app/config/core.php以及app/config/bootstrap.php等文件

        App::import('Core', array('Dispatcher'));  //导入路径处理类,程序入口路径等

在app/webroot/index.php文件最后会调用$Dispatcher->dispatch方法执行程序
$Dispatcher = new Dispatcher();  //初始化路径处理类
$Dispatcher->dispatch($url);   //框架开始判断URL执行程序


下面让我们看看框架是如何加载Dispatcher并执行程序的吧!

 

首先在cake/ dispatcher.php文件106行中我们会找到dispatch方法,默认情况下我们传递给dispatch的参数会为空,当url参数为空的情况时,框架会自动调用getUrl方法得到url等信息
代码如:

$url = $this->getUrl();  //得到URL路径
$this->params = array_merge($this->parseParams($url), $additionalParams); //得到处理URL后的数组,包括$_POST,$_GET传递过来的值,以及控制器和方法
程序通过parseParams方法处理URL参数并调用routes类方法获得controller和action等信息并组装成有规律数组形式后传递给$this->params,值得注意的是,在后面的代码中$this->params会赋值给$controller->params,这也就是为什么我们可以在控制器可以使用$this->params的原因,例如:$this->params['controller']会获得当前请求的控制器名
其后会对当前的action做判断,比如action名字前有下划线(_)的会认为是受保护方法不予访问等
接下来会把一些参数等赋值给当前controller
代码如下
$controller->base = $this->base;
$controller->here = $this->here;
$controller->webroot = $this->webroot;
$controller->plugin = $this->plugin;
$controller->params =& $this->params;  //传递所有的参数给$controller->plugin,包括controller和action名字以及form数据以及URL等
$controller->action =& $this->params['action'];
$controller->passedArgs = array_merge($this->params['pass'], $this->params['named']);  //把所有$_GET传递的参数赋值给$controller->passedArgs 包括有无命名参数,如/controller/action/a:1/b=2/3/4 

(注意:当controller在执行render方法后会自动把一些变量传递给view也就是我们所说的模板,比如controller会把passedArgs变量值赋值给view里面的passedArgs,以致我们在模板中可以直接调用$this->passedArgs)
这里应该注意的是框架会判断当前操作中是否会有$_POST,$_GET等值,如$_POST有字段名为data的字段,框架会执行$controller->data =& $this->params['data'];
最后改方法会调用当前controller并传递参数执行


代码如下:return $this->_invoke($controller, $this->params); //通过地址引用传递传递参数给$controller,调用$controller,正式执行

下面看下调用的_invoke
function _invoke(&$controller, $params)

function _invoke(&$controller, $params) {
$controller->constructClasses();  //加载controller必要信息以及合并appController等(包括加载model,以及helper和Component),更多信息请查看controller.php下的类方法
$controller->Component->initialize($controller);  //在控制器beforeFilter前调用component的initialize方法
$controller->beforeFilter();
$controller->Component->startup($controller);

在这里我们可以看到$controller->Component->initialize是在$controller->beforeFilter()之前执行的,这个手册上都有提到我就不多说了
这里要注意的是
$controller->constructClasses方法会合并当前用户自定义controller类和AppController(app_controller.php)中的一些变量,如$users以及helper和component等,这里比较重要一点的是会循环调用所有$users变量下面的值并加载对应的model,如果$this->uses变量为false则不初始化任何model: 注意如果只想定义controller而不想定义相应的model文件的时候,这个变量应该为空,或者如想在该控制器调用时自动加载其他的model的情况时,可以把想要的model名通过数组赋值给$this->users=array('modelname1','modelname2')等,还有种情况就是当用户并没有自己设置$users的值的时候,框架会自动根据名字并尝试调用对应的model(model文件不是必须的,但此时数据库中必须要有相应的表,否则会报错)


其他的应该不用做什么解释说明

下面的
$output = $controller->dispatchMethod($params['action'], $params['pass']);
这个方法是调用object类里面的dispatchMethod方法,其实也就是controller类执行对应的action方法

下面一小段代码

if ($controller->autoRender) {
                $controller->output = $controller->render();
} elseif (empty($controller->output)) {
                        $controller->output = $output;
                }
所有在$controller中如果我们有定义$ this->autoRender=false的话,框架是不会自动调用render方法的

如果$ this->autoRender为真的或者没有定义的时候,框架会调用render函数调用对应的模板显示输出最后的HTML了


到此框架执行步骤基本结束,当然里面还有很多东西没写进来,一是因为我文笔水平有限,其次也是调用的函数太多所有者这里就不做一一说明了.

这不过是一个简化的执行流程,并没有牵扯到model等内容,大家可以做为参考,因为我有时候有会觉得读源代码比看手册更容易理解

以上就是cakephp执行流程代码解读的内容,更多相关内容请关注PHP中文网(www.php.cn)! 


本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
4 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

CakePHP 项目配置 CakePHP 项目配置 Sep 10, 2024 pm 05:25 PM

在本章中,我们将了解CakePHP中的环境变量、常规配置、数据库配置和电子邮件配置。

CakePHP 日期和时间 CakePHP 日期和时间 Sep 10, 2024 pm 05:27 PM

为了在 cakephp4 中处理日期和时间,我们将使用可用的 FrozenTime 类。

如何使用CakePHP中的数据库查询构造器? 如何使用CakePHP中的数据库查询构造器? Jun 04, 2023 am 09:02 AM

CakePHP是一个开源的PHPMVC框架,它广泛用于Web应用程序的开发。CakePHP具有许多功能和工具,其中包括一个强大的数据库查询构造器,用于交互性能数据库。该查询构造器允许您使用面向对象的语法执行SQL查询,而不必编写繁琐的SQL语句。本文将介绍如何使用CakePHP中的数据库查询构造器。建立数据库连接在使用数据库查询构造器之前,您首先需要在Ca

如何在CakePHP中创建自定义分页? 如何在CakePHP中创建自定义分页? Jun 04, 2023 am 08:32 AM

CakePHP是一个强大的PHP框架,为开发人员提供了很多有用的工具和功能。其中之一是分页,它可以帮助我们将大量数据分成几页,从而简化浏览和操作。默认情况下,CakePHP提供了一些基本的分页方法,但有时你可能需要创建一些自定义的分页方法。这篇文章将向您展示如何在CakePHP中创建自定义分页。步骤1:创建自定义分页类首先,我们需要创建一个自定义分页类。这个

CakePHP 文件上传 CakePHP 文件上传 Sep 10, 2024 pm 05:27 PM

为了进行文件上传,我们将使用表单助手。这是文件上传的示例。

CakePHP如何处理文件上传? CakePHP如何处理文件上传? Jun 04, 2023 pm 07:21 PM

CakePHP是一个开源的Web应用程序框架,它基于PHP语言构建,可以简化Web应用程序的开发过程。在CakePHP中,处理文件上传是一个常见的需求,无论是上传头像、图片还是文档,都需要在程序中实现相应的功能。本文将介绍CakePHP中如何处理文件上传的方法和一些注意事项。在Controller中处理上传文件在CakePHP中,上传文件的处理通常在Cont

CakePHP 路由 CakePHP 路由 Sep 10, 2024 pm 05:25 PM

在本章中,我们将学习以下与路由相关的主题?

如何在CakePHP中使用Twig? 如何在CakePHP中使用Twig? Jun 05, 2023 pm 07:51 PM

在CakePHP中使用Twig是一种将模板和视图分离的方法,能够使代码更加模块化和可维护,本文将介绍如何在CakePHP中使用Twig。一、安装Twig首先在项目中安装Twig库,可以使用Composer来完成这个任务。在控制台中运行以下命令:composerrequire"twig/twig:^2.0"这个命令会在项目的vendor

See all articles