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

最近由于工作需要用到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
PHP依赖注入容器:快速启动PHP依赖注入容器:快速启动May 13, 2025 am 12:11 AM

aphpdepentioncontiveContainerIsatoolThatManagesClassDeptions,增强codemodocultion,可验证性和Maintainability.itactsasaceCentralHubForeatingingIndections,因此reducingTightCightTightCoupOulplingIndeSingantInting。

PHP中的依赖注入与服务定位器PHP中的依赖注入与服务定位器May 13, 2025 am 12:10 AM

选择DependencyInjection(DI)用于大型应用,ServiceLocator适合小型项目或原型。1)DI通过构造函数注入依赖,提高代码的测试性和模块化。2)ServiceLocator通过中心注册获取服务,方便但可能导致代码耦合度增加。

PHP性能优化策略。PHP性能优化策略。May 13, 2025 am 12:06 AM

phpapplicationscanbeoptimizedForsPeedAndeffificeby:1)启用cacheInphp.ini,2)使用preparedStatatementSwithPdoforDatabasequesies,3)3)替换loopswitharray_filtaray_filteraray_maparray_mapfordataprocrocessing,4)conformentnginxasaseproxy,5)

PHP电子邮件验证:确保正确发送电子邮件PHP电子邮件验证:确保正确发送电子邮件May 13, 2025 am 12:06 AM

phpemailvalidation invoLvesthreesteps:1)格式化进行regulareXpressecthemailFormat; 2)dnsvalidationtoshethedomainhasavalidmxrecord; 3)

如何使PHP应用程序更快如何使PHP应用程序更快May 12, 2025 am 12:12 AM

tomakephpapplicationsfaster,关注台词:1)useopcodeCachingLikeLikeLikeLikeLikePachetoStorePreciledScompiledScriptbyTecode.2)MinimimiedAtabaseSqueriSegrieSqueriSegeriSybysequeryCachingandeffeftExting.3)Leveragephp7 leveragephp7 leveragephp7 leveragephpphp7功能forbettercodeefficy.4)

PHP性能优化清单:立即提高速度PHP性能优化清单:立即提高速度May 12, 2025 am 12:07 AM

到ImprovephPapplicationspeed,关注台词:1)启用opcodeCachingwithapCutoredUcescriptexecutiontime.2)实现databasequerycachingusingpdotominiminimizedatabasehits.3)usehttp/2tomultiplexrequlexrequestsandredececonnection.4 limitsclection.4.4

PHP依赖注入:提高代码可检验性PHP依赖注入:提高代码可检验性May 12, 2025 am 12:03 AM

依赖注入(DI)通过显式传递依赖关系,显着提升了PHP代码的可测试性。 1)DI解耦类与具体实现,使测试和维护更灵活。 2)三种类型中,构造函数注入明确表达依赖,保持状态一致。 3)使用DI容器管理复杂依赖,提升代码质量和开发效率。

PHP性能优化:数据库查询优化PHP性能优化:数据库查询优化May 12, 2025 am 12:02 AM

databasequeryOptimizationinphpinvolVolVOLVESEVERSEVERSTRATEMIESOENHANCEPERANCE.1)SELECTONLYNLYNESSERSAYCOLUMNSTORMONTOUMTOUNSOUDSATATATATATATATATATATRANSFER.3)

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

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

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

VSCode Windows 64位 下载

VSCode Windows 64位 下载

微软推出的免费、功能强大的一款IDE编辑器

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。