`
weiqingfei
  • 浏览: 316760 次
  • 性别: Icon_minigender_1
  • 来自: 黑洞
社区版块
存档分类
最新评论

TinyShop简单分析

    博客分类:
  • PHP
 
阅读更多

1.第一次启动会向DB导入必要的数据,并根据设定重写配置文件,以及生成入口的index.php文件

index.php文件最终运行

Tiny::createWebApp($config)->run();

 

2.类Tiny在文件tiny.php中创建。

    public static function createWebApp($config=null)
    {
        return self::createApp('WebApp',$config);
    }

    public static function createApp($className,$config=null)
    {
        //加载项目的时区,默认为中国
        date_default_timezone_set('Asia/Shanghai');
        //注册脚本执行完毕后调用的动作
        register_shutdown_function(array('Tiny','exitScript'));
        Tiny::initSystemHandler();
        return new $className($config);
    }

 

3.类WebApp位于文件webapp_class.php中,而run方法,是在其父类App也就是文件application_class.php中

	public function run()
	{
		//实现对Application的扩展
		Tiny::$_iserror = true;
		$appExtension = ExtensionFactory::getFactory('appExtension');
		if($appExtension !== null )
		{
			$appExtension->before();
			$this->doRequest();
			$appExtension->after();
		}
		else $this->doRequest();
		Tiny::$_iserror = false;
	}

 

4.接下来看看类WebApp里的方法doRequest

	public function doRequest()
	{
		Url::urlReWrite();
		$this->runController();
	}

	public function runController()
	{
		$this->controller = $this->createController();
		$this->controller->run();

	}

	public function createController()
	{
		$controllerName = Req::args('con')!==null?ucfirst(Req::args('con')):$this->defaultController;
		$controllerClass = $controllerName.'Controller';
		$widgetClass = $controllerName.'Widget';

		if(class_exists($controllerClass))
		{
			return new $controllerClass(strtolower($controllerName),$this);
		}
		else if(class_exists($widgetClass))
		{
			return new $widgetClass($controllerName,$this);
		}
		else if(Tiny::getErrorsController()!==null)
		{
			$errorsController = Tiny::getErrorsController();
			return $errorsController;
		}
		else
		{
			return new Controller($controllerName,$this);
		}
	}

 

可以看出webapp是通过con来寻找controller的,如果请求里没有设置con,那么默认使用的是index。寻找的规则大写con值得第一个字母,并且链接字符串“Controller”,比如con=admin,那么寻找的controller类名就是AdminController

 

 5.既然找到了相应的controller了,那么看看调用的run方法是怎样的。run方法存在于controller的父类Controller里,也就是文件controller_class.php里

    public function run()
    {
        if(Tiny::app()->checkToken('redirect')){
            $data = Req::args();
            unset($data['con'],$data['act'],$data['tiny_token_redirect']);
            $this->setDatas($data);
        }
        $this->init();
        $id = Req::args('act');
        if($id ===null) $id = $this->defaultAction;

        //防止页面的循环调用
        if(!$this->module->popRequestStack($this->id.'@'.$id))$this->module->pushRequestStack($this->id.'@'.$id);
        else if($this->module->popRequestStack($this->id.'@'.$id)) {throw new Exception("Can't repeat redirect to the same position, you action is {$this->id}.",E_USER_ERROR);}
        $this->action = $this->createAction($id);
        //所有Controller处理的扩展处理
        $contExtensions = ExtensionFactory::getFactory('controllerExtension');
        if($contExtensions !== null )
        {
            $contExtensions->before($this);
            if(!is_null($this->action))$this->action->run();
            $contExtensions->after($this);
        }
        else if(!is_null($this->action))$this->action->run();
    }

 根据参数act的值来查找其对应的action,默认是index。这里为了防止循环调用,会把以字符串“con@act”的形式把调用过的action存起来,然后检查是否调用过。

接下来看看action是如何创建的

    public function createAction($id)
    {
        if($id ==='') $actionId = $this->defaultAction;
        //统一拦截权限控制
        if($this->checkRight($id) == false)
        {
            $this->noRight();
        }else{
            //如果控制器直接定义了方式
            if(method_exists($this,$id))
            {
                return new InlineAction($this,$id);
            }
            else
            {
                return new Action($this, $id);
            }
        }
        
    }

 如果这个controller类里有以action命名的方法,那么就创建InlineAction类,如果没有,就创建Action类

linlineAction类的run方法很简单,就是直接执行那个方法

class InlineAction extends BaseAction
{
	//Action运行入口
	public function run()
	{
		$controller=$this->getController();
		$methodName=$this->getId();
		$controller->$methodName();
	}
}

如果以act值命名的方法不存在的话, 那么再来看看Action类,它的run方法比较长,那么我们就来看看关键的几个地方。

$methodName = preg_split("/_(?=(save|del|edit)$)/i",$this->getId());
$operator = array('save'=>'save','del'=>'delete','edit'=>'find');
if($controller->getAutoActionRight() && array_key_exists($op,$operator))
{

            $model = new Model($modelName);
            $data=$model->data(Req::args())->$operator[$op]();
}

 当方法名也就是act的值是以xxxx_save,xxxx_del,xxxx_edit命名时,且登录者有自动action权限时(权限的判断可参考controller_class类的$autoActionRight值设定),可以自动对表(xxxx)进行插入,删除,更新操作。

如果方法名并没有这个规则,或者没有权限的话。那么

		else
		{
			$action = new ViewAction($controller, $this->getId());
			$action->run();
			//exit;
		}

 

继续跟踪一下类ViewAction可以看到其实就是直接输出view目录下,以con的值为子目录名,以act的值为文件名的php文件。

分享到:
评论

相关推荐

    TinyShop测试项目总结报告1

    综上所述,TinyShop测试项目涵盖了从需求分析到测试执行的整个生命周期,使用TestLink和Mantis进行测试管理和缺陷追踪,有效提高了测试效率和问题解决速度。通过这样的实践,团队成员提升了专业技能,对软件测试有了...

    Xammp下tinyshop环境部署.zip

    这个“Xammp下tinyshop环境部署.zip”文件显然是为了指导用户如何在XAMMP平台上配置TinyShop电子商务平台。TinyShop可能是一个基于PHP的开源电子商务解决方案,用于快速搭建在线商店。 首先,我们来详细了解XAMMP。...

    1-tinyshop网上商城用户需求规格说明书(标准)1

    《1-tinyshop网上商城用户需求规格说明书(标准)1》 本文档主要针对1TinyShop网上商城系统,详细阐述了该系统的核心功能需求和设计目标,旨在为开发团队和相关利益者提供清晰的业务范围和用户需求,确保系统的开发...

    TinyShop二次开发手册

    1. 需求分析:明确要开发的新功能或优化现有功能的需求。 2. 设计模块:根据需求设计新的模块结构,考虑与原有系统的兼容性。 3. 编码实现:使用Tiny框架的API编写代码,遵循框架的编码规范。 4. 数据库设计:如果...

    TinyShop性能测试报告1

    【TinyShop性能测试报告】 1. 引言 TinyShop性能测试报告的编写目的在于评估和优化TinyShop电子商务系统的性能,确保其在实际运营环境中能够稳定、高效地运行。本报告详细记录了测试过程、测试环境、测试内容以及...

    Tinyshop网上商城系统安装手册1

    Tinyshop网上商城系统安装手册1 Tinyshop网上商城系统安装手册1是惠普-济宁国际软件人才及产业基地商用软件测试ELMS进销存管理系统安装手册的组成部分,该手册详细介绍了Tinyshop网上商城系统的安装过程,包括部署...

    TinyShop v1.0.3.1

    TinyShop v1.0.3.1是一款专为企业和个人设计的新型电子商务平台系统,它致力于帮助用户快速搭建个性化网上商店。这个版本的更新至1.0.3.1,表明了开发者持续优化和增强其功能性和稳定性。解压密码为www.xinxi18.com...

    TinyShop_v1.7.zip

    3. **快速构建**:TinyShop_v1.7 提供了一套完整的建站工具,用户无需具备深厚的编程知识,只需通过简单的配置和模板选择,即可快速建立自己的网上商店。系统内置多种预设主题,支持自定义布局和样式,满足不同用户...

    tinyshop v1开发手册

    HelloWorld入门:为初学者提供了一个简单的入门示例,帮助理解如何在TinyShop中创建基础应用。 b. Controller与layout:介绍了控制器的使用方法以及布局文件的作用。 c. Action向视图文件传值与权限控制:阐述了...

    TinyShop商城系统测试计划1

    设定明确的时间表,进行定期的测试执行和结果分析,根据测试结果调整测试策略,并持续优化系统性能。 5. 结果报告与跟进 测试完成后,编写详细的测试报告,列出所有发现的问题和建议,与开发团队进行沟通,跟踪...

    TinyShop商城系统性能测试计划1

    11. **业务抽取**:通过分析用户行为模式,提取出最常见、最具代表性的操作序列,作为性能测试的重点场景。 12. **角色和职责**:明确测试团队中的每个成员的职责,包括测试工程师、开发人员、项目经理等,确保测试...

    TinyShop_V3.1前后台操作手册

    最新tinyshop前后台用户操作手册。详细介绍了安装、后台管理操作、商品管理、标签管理、订单管理等

    TinyShop_v1.3.zip

    TinyShop_v1.3.zip 是一个电子商务系统的压缩包,它为企业和个人提供了快速构建自定义在线商店的平台。这个系统的核心是基于Tiny框架构建的,该框架是专门为提高安全性、速度、稳定性以及性能而设计的。以下是关于...

    TinyShop电子商务系统支付插件 v1.7.zip

    TinyShop电子商务系统支付插件简介 TinyShop电子商务系统支付插件是以tinyshop1.7版本为基础进行开发的网站支付宝插件系统。 TinyShop电子商务系统支付插件安装方法: 一、做好网站文件及数据库的备份,以防出错...

    TinyShop PHP开源网站系统源码 v1.2.rar

    TinyShop PHP开源网站系统是一款新型的电子商务网店系统,开源源码构建,内核基于Tiny框架,TinyShop使每个...TinyShop后台功能模块总览:商品中心、订单中心、客户中心、营销推广、统计报表、内容管理、系统设置等。

    TinyShop PHP开源商城系统 v1.0.3.rar

    TinyShop个性化网上商店系统,基于Tiny框架开发,运行于PHP环境,采取MVC的架构方式,特有Widget机制,使开发插件更加的方便,TinyShop商城参考了国内外众多商城的设计,使每个商品都可设计出自己的特有的规格,使...

    TinyShop电子商务系统支付插件 v1.7

    TinyShop电子商务系统支付插件是以tinyshop1.7版本为基础进行开发的网站支付宝插件系统。安装方法:一、做好网站文件及数据库的备份,以防出错。二、把这三个文件覆盖到 网站根目/protected/classes/payments/ 下面...

    TinyShop v3.1.1

    商城参考了国内外众多商城的设计,提取那些更适合现在发展的元素,去除老旧没有的部分,使系统在设计都就做到的简单易用,系统特别产品高效发布,强大的规格设计,使每个商品都可设计出自己的特有的规格,专门的规格...

    TinyShop电子商务系统 3.1.1.zip

    TinyShop一款电子商务系统(网店系统),适合企业及个人快速构建个性化网上商店。系统是基于Tiny(自主研发)框架开发的,使系统更加的安全、快捷、稳定、高性能。 TinyShop 3.1.1 更新日志:2018-03-07 更新:更新...

    TinyShop_v2.3.zip

    TinyShop_v2.3.zip是一个压缩包,包含了一个名为TinyShop的电子商务系统的新版本,具体为v2.3。这个系统被设计用于帮助企业或个人快速搭建具有个性化特点的网上商店,提供了一站式的电子商务解决方案。核心特性是它...

Global site tag (gtag.js) - Google Analytics