您的位置:首页 > 编程语言 > PHP开发

thinkphp复习

2016-07-28 20:13 681 查看

1、概况

使用面向对象的开发结构和mvc模式,采用单一入口,融合了struts2的action思想和jsp的taglib,ROR的orm映射和activerecord模式,封装了curd常用操作,支持多数据库切换,分布式数据库,缓存,用于敏捷web应用开发,简化企业级开发

2、什么是LAMP

LAMP是基于Linux,Apache,Mysql,PHP的开放资源网络开发平台

Linux是开放的操作系统

Apache是最通用的网络服务器

Mysql是带有基于网络管理工具的关系数据库

PHP是流行的对象脚本语言

LAMP是强大的网站解决方案

3、什么是OOP

面向对象编程(Object Oriented Programming)是一种计算机编程架构

达到的目标:重用性,灵活性,扩展性

基本原则:计算机程序由单个能起到子程序作用的单元或对象组合而成,每个对象都能够接收信息、处理数据、向其他对象发送信息。

其他一些概念

组件:数据和功能一起在运行着的计算机程序中形成的单元,组件是模块化和结构化的基础。

抽象性:

封装性:每类组组件都提供了一些与其他组件进行通信的借口,并规定其调用方法

多态性:

4、什么是mvc

Mvc是一个设计模式,强调输入-处理-输出分开,应用程序被分为三个核心部件(

模型M:表示企业数据和业务规则

视图V:用户交互界面

处理器C:接收用户的输入,并调用模型和视图完成用户的需求。本身不输出任何东西和做任何处理,它只是接受请求并决定调用哪个模型部件去处理请求,然后确定用哪个视图显示模型处理后返回的数据



5、什么是ORM

对象-关系映射(Object/relation map)

面向对象开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。

业务实体在内存中表现为对象,存在关联和继承关系,在数据库中表现为关系数据,无法表达关联和继承关系。ORM实现程序对象到关系数据库数据的映射。

6、什么是CURD

创建(Create)、更新(Update)、读叏(Read)和初除(Delete)

7、什么是ACTIVERECORD

类映射到一张表,对象映射到表中的一行记录,对象属性映射到表的字段,最大程度快速实现模型操作,封装了对数据库的访问(CURD),封装了部分业务逻辑

8、什么是单一入口

一个项目有一个统一的入口文件,入口文件是第一步被执行的

规范,控制灵活

9、 ThinkPHP特性

类库导入:采用基于类库包和命名空间的形式导入类库,严格检查加载文件的大小写。

URL模式:支持普通模式,PATHINFO模式,REWRITE模式,兼容模式等URL模式。随心所欲构建URL地址。

编译机制:核心编译和项目动态编译

ORM

缓存机制:支持多种动态数据缓存类型,以及可定制的静态缓存规则

扩展机制:支持包括类库扩展,驱动扩展,应用扩展,模型扩展,控制器扩展,标签库扩展,模板引擎扩展,widget扩展,行为扩展,模式扩展,

10、Thinkphp框架目录

ThinkPHp.php框架入口文件

Common:框架文件,框架配置,

Lang 框架语言包

Lib 框架基类库

Mode框架模式扩展

Vendor:第三方类库目录

11、thinkphp命名规范

类文件已.class.php为后缀,使用驼峰命名法,而且首字母大写

文件的命名和调用大小写要一致

函数命名要使用小写字母加下划线的方式或者驼峰法并且首字母小写

变量命名使用驼峰发且首字母小写

常量以大写字母和下划线命名

12、thinkphp的单字母函数

1、A函数实例化Action类。

A(name,app='@')

实例化Action name
表示Action名称和app表示项目名,默认是当前项目;

返回实例化后的Action对象,如果对应的Action类不存在则返回false

例子

例如我们的程序有2个Action分别是IndexAction和TestAction,在 IndexAction中有个myHello方法能够输出hello world,如果我也想在TestAction中也输出同样一段文字怎么办?最原始的方法首先我们导入IndexAction.class.php这个文件,然后new IndexAction,最后调用myHello方法才行。

代码一般为 :
PHP代码
1. <?php
2. ?("@.Action.Index");
3. //导入本项目目录下Action目录下的Index.class.php文件。
4. class TestAction extends Action{
5. public function index()
6. {
7. $index=new IndexAction();//实例化IndexAction
8. echo $index->myHello();//调用myHello()方法
9. }
10. }
11. ?>
那么,如果我们用A函数,怎么写呢?
PHP代码
1. <?php
2. class TestAction extends Action{
3. public function index()
4. {
5. $index=A("Index");
6. echo $index->myHello();
7. }
8. }
9. ?>
跨项目调用
$User = A("User","App2"); // 实例化App2项目癿UserAction控刢器对象

2、B函数执行某个行为

B(name)

调用行为name,name表示名称

例如B('app_begin');就是在项目开始之前,执行这个行为定义的所有函数,支持2个参数,第二个参数支持需要接受一个数组,例如B('app_begin',array("name"=>"tdweb","time"=>time()));这样。

3、C函数读取设置配置

C(name=null,value=null)

获取和设置配置值C('name')
新增或者更新设置C('name','value')如果name的知识数组,就进行批量赋值;

获取值:  

获取所有设置:C(); 不传递任何参数,返回一个包含所有设置的数组。

获取指定配置:C('URL_MODEL') 这样就能得到URL_MODEL的配置信息

获取指定二维数组配置:C("array.name"),这样就返回数组array下的key为name所对应的值

设置值:

为二维数组赋值C("array.name","value"),原理同上(获取array.name的值),后边的value是值

批量赋值:

$test=array("URL_MODEL"=>1,"THIN_MODEL"=>true");

C($test);

这样直接将数组里的值赋值了

判断是否赋值:

C("?URL_MODEL")这样前边加个"?",如果已经赋值,则返回true

需要说明的是,这里虽然更改了配置的值,但是仅仅是这个页面做了更改,到下个页面就不起作用了,如果想改就永久更改,那么需要配合F函数,将配置文件写入config.php才行。

也可以支持二维数组的读取和配置,使用点语法进行操作,如下:

获取已经设置的参数值:

C('USER_CONFIG.USER_TYPE')

设置新的值:

C('USER_CONFIG.USER_TYPE','1');

4、D函数实例化model

  DAO函数应该是我们写程序用的最多的函数了。和A函数类似,如果不使用D函数,就需要导入Model,然后new Model,剩下都是一样的。

  但是D函数有2个有点,一是如果之前实例化过这个Model,那么就不再实例化了,剩资源;二是方便调试,如果不存在 这个Model,会抛出TP异常,非常人性化。

  如果访问本项目的Model直接D("Model名称");就可以了,如果打算跨项目访问,就使用D("Model名称","项目名称");如$User =D('User', 'Admin'); $User =D('Admin.User');

5、F函数快速读取和保存文件数据

  快速保存数据:F("mydata","这里是要保存的数据"),这样就在项目Data目录下保存了一个名叫mydata.php的文件,里边的内容是该函数的第二个参数。

  指定保存时间 :F("mydata","这里是要保存的数据","60"),这样,如果下次再访问,间隔大于60秒则删除次缓存文件。

  指定保存目录:F("mydata","这里是要保存的数据","60",DATA_PATH),这样就指定保存在data目录下

  立即删除缓存:F("mydata",null),第二个参数传递一个null值,这样就删除了mydate这个缓存

  读取缓存数据:F("mydata"),这样就读取这个缓存了

6、L函数

  语言定义函数,L("intro")获取定义成intro的语言,l("intro","介绍")为intro赋值,关于这个赋值的长久性,道理同C函数一样,但是仅仅是这个页面做了更改,到下个页面就不起作用了。

7、R函数

  还记得我们的A函数吧,如果仅仅想执行某个方法,其实用R函数更方便,刚才的可以替换成
PHP代码
1. <?php
2. class TestAction extends Action{
3. public function index()
4. {
5. $index=R("Index","myHello");
6. echo $index;
7. }
8. }
9. ?>
跨项目调用

R("User","importUser","App2"); // 远程调用App2项目的UserAction控制器癿importUser 操作方法

8、S函数

全局缓存读写函数,和C类似,不过是直接写成文件的哦,写在Temp目录下,不过在缓存有一点需要注意,如果缓存名称是aaa,那么缓存生成的文件名称就是md5("aaa")的值,值得注意。

9 、U函数

  U函数是很强大的一个函数,它主要是进行URL组装,同时支持不同模式和路由

例如:

取得当前模块的Action地址 :U("/nowMethod");

取得当前模块的Action地址,并传递参数:U("/nowMethod?params=test");

  (如果不习惯上边那种方式,可以使用U("/nowMethod",array("params"=>"test");这样的数组方式传递参数,效果是一样的)

  访问其他模块的方法:U("Other/otherMethod"),这样就是访问Other模块下的otherMethod方法

跨项目访问:U("appname://Other/otherMethod");

使用路由访问:U("appName://routeName@moduleName/actionName?params");

  另外,如果想直接跳转,那么就在第二个参数写1,例如U("/nowMethod",1);这样就直接调转到指定URL了

13、入口文件的标准写法

定义其他配置和参数

实例化应用

载入框架入口文件

<?php

// 定义ThinkPHP框架路徂(相对亍入口文件)

define('THINK_PATH', '../ThinkPHP');

//定义项目名称和路徂

define('APP_NAME', 'Myapp');

define('APP_PATH', '.');

// 加载框架入口文件

require(THINK_PATH."/ThinkPHP.php");

//实例化一个网站应用实例

App::run();

?>

14 thinkphp项目编译机制

系统第一次运行的时候会自动生成核心缓存文件~runtime.php和项目编译缓存文件~app.php,这些缓存文件把核心和项目必须的文件打包到一个文件中并且去掉所有空白和注释。

~runtime.php 包含系统定义文件defines.php、系统凼数库functions.php、系统基类Think、异常基类ThinkException、日志类 Log、应用类 App、控刢器基类 Action、规图类 View

~app.php包含项目配置文件和项目公共函数文件common.php。

15、URL

1、URL访问模式

框架是基于模块和操作的方式进行访问,thinkphp支持的URL模式包括普通模式,PATHINFO模式,REWRITE模式,兼容模式,提供路由支持,默认是pathinfo模式。

普通模式(URL_MODEL 为0)
http://localhost/appName/index.php?m=moduleName&a=actionName&id=1
pathinfo模式(URL_MODEL 为1)
http://localhost/appName/index.php/moduleName/actionName/id/1/
rewrite模式:( URL_MODEL 为2)
http://localhost/appName/moduleName/actionName/id/1/
兼容模式(URL_MODEL 为3)

可以支持任何的运行环境

2、URL路由

启用路由功能需要将URL_ROUTER_ON设置为true,

开启路由功能以后如果在路由定义中找到与URL匹配的路由名称,就会进行解析和重定向。

通过routes.php (放在conf目录下,优先级较高)进行配置,

return array(

array('路由定义','[分组/]模块/操作名', '路由对应发量','额外参数'),

)

或者在config.php中使用“URL_ROUTE_RULES”进行设置,定义形式是一样的。

'URL_ROUTE_RULES' => array(

array('路由定丿','[分组/]模块/操作名', '路由对应变量','额外参数'),

),

例子:

array('blog','Blog/archive','year,month,day', 'userId=1&status=1')

在执行http://<serverName>/appName/blog/2009/10/1/ 的时候就会实际执行blog模块下的archive方法后面的参数/2009/10/1会依次按照/year/month/day来解析并且会隐含传入userId=1和status=1两个参数,此时$_GET['year']的值为2009,$_GET['userId']的值为1。

如果需要路由到分组模块的话,可以定义成

array('blog','Home/Blog/archive','year,month,day', 'userId=1&status=1')

就可以指定路由到Home分组的Blog模块。

URL格式还可以使用正则表达式,例如:

'URL_ROUTE_RULES' => array(

array('/^blog\/(\d+)$/','Blog','read','id'),

array('/^blog\/(\d+)-(\d+)/','Blog','archive','year,month'),

),

第一个路由正则表达式解析 Blog/123 到 Blog 模块癿 read 操作,$_GET['id']获取的值为

123

第二个路由正则表达式解析 Blog/2011-5到 Blog 模块的 archive 操作,$_GET[' year ']

获徇2011,$_GET[' month ']获徇5

3、URL伪静态

系统支持url伪静态设置。

通过设置URL_HTML_SUFFIX参数随意在URL最后增加你想要的静态后缀而不影响系统正常运行。

4、URL重写

将.htacess文件放在和入口文件同级目录下面,

<IfModule mod_rewrite.c>

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-d

RewriteCond %{REQUEST_FILENAME} !-f

RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]

</IfModule>

5、URL生成

U方法,动态的根据URL设置来生成URL地址,确保项目在移植过程中不受影响。

使用定义规则

U('[项目://][路由@][分组名-模块/]操作? 参数1=值1[&参数N=值N]')

或者用数组的方式传入参数

U('[项目://][路由@][分组名-模块/]操作',array('参数1'=>'值1' [,'参数N'=>'值N']))

不过不定义项目和模块的话就表示当前的项目和模块

U('Myapp://User/add') // 生成Myapp项目的User模块的add操作的URL地址

U('Blog/read?id=1') // 生成Blog模块的read操作 并且id 为1的URL地址

U('Admin-User/select') // 生成Admin分组的User模块的select操作的URL地址

参数请确保使用 ?id=1&name=tp或者数组的方式来定义

在模板中的使用方法

<a href="{:U("News/edit/id/$vo[id]")}">阅读</a>
比如我有一个$page = 2变量怎么处理呢
<a href=”{:U(‘Index/index?page=’.$page)}”></a>
<volist name=”lists” id=”vo”>
<ahref=”{:U(‘Index/index?page=’.$vo['id'])}”></a>
</volist>

使用路由例子

return array(

// 常规路由

'product'=>array('Products', 'show', 'category,product_id','status=1'),

)

对应的 URL 访问地址例子如下:

index.php/product/5/123

<ahref="{:U('product@?category=3&product_id=123')}">产品详情</a>

6、URL有空操作

如果系统找不到指定的操作方法,就会定位到空操作来执行。我们可以实现错误页面和一些URL的优化。

7、URL有空模块

框架找不到指定的模块名称会尝试定位空模块(EmptyAction)我们可以实现错误页面和一些URL的优化。

我们要把
http://<serverName>/index.php/City/shanghai/变成http://<serverName>/index.php/shanghai/
Class EmptyAction extends Action{

Public function index(){

// 根据当前模块名称来判断要执行哪个城市的操作

$cityName = MODULE_NAME;

$this->city($cityName);

}

Protected function city($name){

// 和$name 返个城市相关癿处理

echo ('当前城市: '.$name);

}

}

16、类库介绍与导入方法

1、框架类库

基类库位于框架的lib目录下面,框架内置有Think核心类库和扩展类库ORG(第三方公共类库),Com(企业基类库)等,所有扩展类库必须放在这两个类库包下管理。

2、应用类库

Import方法是tp提供的类库和文件的导入方法,具有缓存和检测机制,相同文件不会重复导入,注意区分大小写。系统会自动识别导入类库文件的位置,thinkphp约定的是Think,ORG,Com包的导入以系统基类库为相对起始目录(即/Thinkphp/Lib),

import("Think.Util.Session");

import("ORG.Util.Page");

上面两个方法分别导入了系统目录下癿Thinkphp/Lib/Think/Util/Session.class.php和

Thinkphp/Lib/ORG/Util/Page.class.php类文件。

否则就是以项目应用类库为起始目录()

import("MyApp.Action.UserAction");

import("MyApp.Model.InfoModel");

上面的方式表示分别导入MyApp项目下面的Lib/Action/UserAction.class.php和Lib/Model/InfoModel.class.php类文件。通常我们都是在当前项目里面导入所需的类库文件我们可以使用下面的方式来简化代码

import("@.Action.UserAction");

import("@.Model.InfoModel");

如果要在当前项目下面导入其他项目的类库,必须保证两个项目的目录是平级的,否则无法使用

import("OtherApp.Model.GroupModel");

其它情况的导入,需要拟定baseUrl参数,也就是import 方法的第二个参数。例如,要导入当前文件所在目录下面的RBAC/AccessDecisionManager.class.php 文件,可以使用:

import("RBAC.AccessDecisionManager",dirname(__FILE__));

3、第三方类库

统一放在Vendor文件夹下面,并使用vendor方法导入,默认以php作为后缀名。

例如,我们把 Zend 的 Filter\Dir.php 放到 Vendor 目录下面,此时dir路径就是

Vendor\Zend\Filter\Dir.php,我们使用vendor 方法导入叧需要使用:

Vendor('Zend.Filter.Dir');

4别名导入

预先定义好相关类库的路径,在需要的时候根据定义的别名进行快速导入。可以统一用import进行别名导入。框架默认的别名导入文件位于Common\alias.php,例如

import('AdvModel');

如果有定义AdvModel别名,则import 方法会自动加载定义的别名。

别名定义:

'Model' => THINK_PATH.'/Lib/Think/Core/Model.class.php',

'Dispatcher' => THINK_PATH.'/Lib/Think/Util/Dispatcher.class.php',

'HtmlCache' => THINK_PATH.'/Lib/Think/Util/HtmlCache.class.php',

5、自动加载

无需手工导入类库而让框架自动加载。包括:

框架和项目中已经定义的别名导入

当前项目的Action类库和Model类库

自动加载路径(Tp配置参数APP_AUTOLOAD_PATH定义的路径,默认为["app_autoload_path"] => string(11)"Think.Util.")中的类库文件

我们需要增加ORG.Util.路径作为类库搜索路径,可以使用:

'APP_AUTOLOAD_PATH'=> 'Think.Util., ORG.Util.',

多个搜索路径之间用逗号分割。

17、php配置信息

1、TP默认的配置信息

array(108) {

["app_debug"] => string(4)"true"

["app_domain_deploy"] =>bool(false)

["app_plugin_on"] => bool(false)

["app_file_case"] => bool(true)

["app_group_depr"] => string(1)"."

["app_group_list"] => string(0)""

["app_autoload_reg"] =>bool(false)

["app_autoload_path"] =>string(11) "Think.Util."

["app_config_list"] => array(6){

[0] => string(7) "taglibs"

[1] => string(6) "routes"

[2] => string(4) "tags"

[3] => string(5) "htmls"

[4] => string(7) "modules"

[5] => string(7) "actions"

}

["cookie_expire"] => int(3600)

["cookie_domain"] => string(0)""

["cookie_path"] => string(1)"/"

["cookie_prefix"] => string(0)""

["default_app"] => string(1)"@"

["default_group"] => string(4)"Home"

["default_module"] => string(5)"Index"

["default_action"] => string(5)"index"

["default_charset"] => string(5)"utf-8"

["default_timezone"] =>string(3) "PRC"

["default_ajax_return"] =>string(4) "JSON"

["default_theme"] => string(7)"default"

["default_lang"] => string(5)"zh-cn"

["db_type"] => string(5)"mysql"

["db_host"] => string(9)"localhost"

["db_name"] => string(15)"thinkphpexample"

["db_user"] => string(4)"root"

["db_pwd"] => string(4)"root"

["db_port"] => string(4)"3307"

["db_prefix"] => string(6)"think_"

["db_suffix"] => string(0)""

["db_fieldtype_check"] =>bool(false)

["db_fields_cache"] =>bool(false)

["db_charset"] => string(4)"utf8"

["db_deploy_type"] => int(0)

["db_rw_separate"] =>bool(false)

["data_cache_time"] => int(-1)

["data_cache_compress"] =>bool(false)

["data_cache_check"] =>bool(false)

["data_cache_type"] => string(4)"File"

["data_cache_path"] =>string(15) "./Runtime/Temp/"

["data_cache_subdir"] =>bool(false)

["data_path_level"] => int(1)

["error_message"] => string(60)"您浏览的页面暂时发生了错误!请稍后再试~"

["error_page"] => string(0)""

["html_cache_on"] => bool(false)

["html_cache_time"] => int(60)

["html_read_type"] => int(0)

["html_file_suffix"] =>string(6) ".shtml"

["lang_switch_on"] =>bool(false)

["lang_auto_detect"] =>bool(true)

["log_record"] => bool(true)

["log_file_size"] =>int(2097152)

["log_record_level"] => array(9){

[0] => string(5) "EMERG"

[1] => string(5) "ALERT"

[2] => string(4) "CRIT"

[3] => string(3) "ERR"

[4] => string(4) "WARN"

[5] => string(5) "NOTIC"

[6] => string(4) "INFO"

[7] => string(5) "DEBUG"

[8] => string(3) "SQL"

}

["page_rollpage"] => int(5)

["page_listrows"] => int(20)

["session_auto_start"] =>bool(true)

["show_run_time"] => bool(true)

["show_adv_time"] => bool(true)

["show_db_times"] => bool(true)

["show_cache_times"] =>bool(true)

["show_use_mem"] => bool(true)

["show_page_trace"] =>bool(true)

["show_error_msg"] => bool(true)

["tmpl_engine_type"] =>string(5) "Think"

["tmpl_detect_theme"] =>bool(false)

["tmpl_template_suffix"] =>string(5) ".html"

["tmpl_cachfile_suffix"] =>string(4) ".php"

["tmpl_deny_func_list"] =>string(9) "echo,exit"

["tmpl_parse_string"] =>string(0) ""

["tmpl_l_delim"] => string(1)"{"

["tmpl_r_delim"] => string(1)"}"

["tmpl_var_identify"] =>string(5) "array"

["tmpl_strip_space"] =>bool(false)

["tmpl_cache_on"] => bool(true)

["tmpl_cache_time"] => int(-1)

["tmpl_action_error"] =>string(14) "Public:success"

["tmpl_action_success"] =>string(14) "Public:success"

["tmpl_trace_file"] =>string(36) "../../ThinkPHP/Tpl/PageTrace.tpl.php"

["tmpl_exception_file"] =>string(41) "../../ThinkPHP/Tpl/ThinkException.tpl.php"

["tmpl_file_depr"] => string(1)"/"

["taglib_begin"] => string(1)"<"

["taglib_end"] => string(1)">"

["taglib_load"] => bool(true)

["taglib_build_in"] => string(2)"cx"

["taglib_pre_load"] => string(0)""

["tag_nested_level"] => int(3)

["tag_extend_parse"] =>string(0) ""

["token_on"] => bool(true)

["token_name"] => string(8)"__hash__"

["token_type"] => string(3)"md5"

["url_case_insensitive"] =>bool(false)

["url_router_on"] => bool(false)

["url_dispatch_on"] =>bool(true)

["url_model"] => int(1)

["url_pathinfo_model"] => int(2)

["url_pathinfo_depr"] =>string(1) "/"

["url_html_suffix"] => string(0)""

["var_group"] => string(1)"g"

["var_module"] => string(1)"m"

["var_action"] => string(1)"a"

["var_router"] => string(1)"r"

["var_page"] => string(1)"p"

["var_template"] => string(1)"t"

["var_language"] => string(1)"l"

["var_ajax_submit"] => string(4)"ajax"

["var_pathinfo"] => string(1)"s"

["tmpl_file_name"] => string(30)"./Tpl/default/Index/index.html"

["cache_path"] => string(16)"./Runtime/Cache/"

}

系统的配置参数是通过静态变量全局存取的,存取方式简单高效。

惯例配置 项目配置 调试配置 分组配置模块配置 操作配置

以上是配置文件的加载顺序

2惯例配置,

在Tp文件夹下/common/convention.php,对常用参数进行了默认配置。

3项目配置

在项目配置文件目录conf下,文件名是config.php,可以对常用参数进行修改,添加配置参数。

<?php

return array(

'URL_MODEL'=>1,// 如果你的环境不支持PATHINFO 请设置为3

'DB_TYPE'=>'mysql',

'DB_HOST'=>'localhost',

'DB_NAME'=>'thinkphpexample',

'DB_USER'=>'root',

'DB_PWD'=>'root',

'DB_PORT'=>'3307',

'DB_PREFIX'=>'think_',

'app_debug'=>'true',

);

?>

4调试配置

如果开启了调试模式,会导入框架默认的调试配置文件,位于Think\Common\debug.php

如果需要对其中参数配置进行修改,则在项目conf目录下增加debug.php文件进行配置。

5、分组配置

分组配置实用与系统启动了分组模式的情况下,对于每个分组可以单独定义自己的配置文件,放在项目配置目录/分组名称/config.php

6、模块配置

模块配置文件位于

项目配置目录/模块名(小写)_config.php// 用于不使用分组的情况

项目配置目录/分组名/模块名(小写)_config.php//用于使用分组的情况

7、动态配置

我们可以预先定义配置文件,也可以在具体的action中对某些参数进行动态配置。

C('参数名称','新的参数值');

8、扩展配置

系统也内置了一些扩展配置文件癿定义,其中包括标签库定义,路由定义,静态定义,

扩展模块定义,扩展操作定义,标签定义。惯例配置如下

'APP_CONFIG_LIST' => array('taglibs','routes','htmls','modules','actions','tags'),

对于已经定义过的扩展配置文件系统会自动导入并加入到项目配置的缓存文件中。例如routes.php会自动导入。

配置值的获取方式:C('_扩展配置名称_.configName');

18、模块分组

把多项目合并到一个项目中,便于文件重用,省去了跨项目操作的麻烦,且每个分组都有独立的配置文件、公共文件和语言包。

启用分组的方法:

配置APP_GROUP_LIST和DEFAULT_GROUP

例如我们把当前的项目分成Home和Admin两个组,分别表示前台和后台功能,那只需要进行下面的配置:

'APP_GROUP_LIST'=>'Admin,Home',

'DEFAULT_GROUP'=>'Home',

在我们启用项目分组前,由于使用的两个项目,所以URL地址分别是:
http://<serverName>/index.php/Index/index Home项目地址
http://<serverName>/Admin/index.php/Index/index Admin项目地址

采用了分组模式后,URL地址发成:http://<serverName>/index.php/Home/Index/index

如果Home是默认分组癿话迓可以发成http://<serverName>/index.php/Index/index http://<serverName>/index.php/Admin/Index/index
如果设置了隐藏index.php 的话,两者的URL表现效果基本上是一致的

如果没有分组Action文件夹下是所有的Action类库

如果有了项目分组假设还是Home和Admin,那就需要在Action目录下面创建Home和Admin目录,然后把属于各自的Action类库放在对应的目录下面。如果Action是每个分组都需要的公共的,就直接放在Action目录下面。

如果使用了分组要实例化其他分组的模块类,可以使用

A('Home.User');//
实例化Home分组的UserAction类

Model类一般不分组存放,如果确实需要分组可以按照Action方式,再Model下创建Home和Admin目录然后放入model类库。

$User =D('Home.User');//
实例化Home分组下面的UserModel类

模板文件的分组和Action也类似,再原来的模板主题目录下面增加一个分组目录即可。

例如:

Tpl/default/Home/Index/index.html

Tpl/default/Admin/User/index.html

相比之前的模板文件位置就是多了一个分组目录Home和Admin

如果感觉目录结构太深了,可以配置 TMPL_FILE_DEPR参数 来减少目录层次,参数默认是 “/”,如果改成 'TMPL_FILE_DEPR'=>'_' 则分组的模板文件就成了

Tpl/default/Home/Index_index.html

Tpl/default/Admin/User_index.html

19、控制器

1、前置和后置操作

系统会检查当前操作是否具有前置操作和后置操作,如果存在就按照顺序执行

UserAction类里面定义了_before_insert() 和 _after_insert() 操作,执行User模块的insert 操作按照顺序执行下面的操作:

_before_insert

insert

_after_insert

前置和后置操作的方法名是在要执行的方法前面加 _before_和_after_

2、操作链

ThinkPHP支持使用操作链的方式,例如,我们访问下面的URL:
http://serverName/appName/User/action1:action2:action3/
那会依次执行UserAction的action1 、action2 和action3方法

当前操作名称是最后一个,在进行模板输出的时候会用到。如果在不同的操作方法中都需要输出,则都需要进行指定模板文件名,则把所有指定模板都输出在一个页面中。否则只输出最后操作模板。使用操作链则前置和后置方法都将失效。

20、页面跳转和定向问题

带有提示信息的跳转页面并且可以自动跳转到另外一个页面,系统的Action类内置了两个跳转方法success和error

$this->assign("jumpUrl","/User/list/");

$this->success("成功!");

// 本模块其他方法如 index 方法

$this->assign("jumpUrl","index");

// 带上参数

$this->assign("jumpUrl","index/section/".$section);

// 其他模块

$this->assign("jumpUrl","__APP__/User/index");




$this->error("错误!");

两个方法默认的模板是Public:success,可以使用如下模板变量

$msgTitle :操作标题

$message :页面提示信息

$status :操作状态 1表示成功 0 表示失败 具体还可以由项目本身定义规则

$waitSecond :跳转等待时间 单位为秒

$jumpUrl :跳转页面地址

如果是AJAX方式提交的话,success和error方法会调用ajaxReturn方法返回信息

success(message,ajax=false)

设置为ajax返回:$this->success("新增成功!",true);

重定向

$this->redirect('User/list',array('cate_id'=>2), 5,'页面跳转中~')

上面的用法是停留5秒后跳转到User模块的list 操作,并且显示页面跳转中字样,重定向后会改变当前的URL地址。

21、ThinkAjax使用

需引入的js文件

<loadhref="__PUBLIC__/Js/Base.js" />

<loadhref="__PUBLIC__/Js/prototype.js" />

<loadhref="__PUBLIC__/Js/mootools.js" />

<loadhref="__PUBLIC__/Js/Ajax/ThinkAjax.js" />

$this->ajaxReturn($data,$info,$status);

第一个是返回的数据变量,第二个是返回的信息,第三个是数据返回的状态

ThinkAjax.send(URL,params,回调函数,显示$info信息的页面id)

参数url:表示要将客户端浏览器传输过来的数据提交到服务器上的哪个方法进行处理,我这里提交给“当前模块下的checktitle方法”处理

参数pars:相当于ajax中的send方法中的参数string,表示要提交过去的数据,该参数只用于post方式传值

参数response:自定义的回调函数,如果定义了回调函数,则服务器处理完提交过去的数据之后,将会把处理后的数据交给回调函数进行处理。该回调函数有两个参数:①data②status 参数data:将服务器端处理后的数据赋给data 参数status:表示处理后的状态信息,1表示成功 0 表示失败

参数target:表示将处理后的数据在哪个地方进行显示(或输出),比如:我将此参数赋为:checkbox,表示处理后的数据会在id=”checkbox”的标签进行信息输出

function test(){

ThinkAjax.send('__URL__/test1','password=1&username=www',complete,'result');

}

返回的json格式,用post方式传值

function complete(data,status){

alert(status);

if(status==1){

alert(data.p+"-"+data.q);

}

}

ThinkAjax.sendForm(form的id, URL ,回调函数, 显示$info信息的页面id);

22、模型

1、commonModl

<?php
classCommonModel extends Model
{
publicfunction t()
{
return$this->select();
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office"/>
}
publicfunction getfiled()
{
return$this->getDbFields();

}
publicfunction b()
{
return$this->getPk();

}
}
?>
$demo=M("Demo","CommonModel");//$demo=newCommonModel(“demo”) 表示继承了CommonModel类而不是继承的默认Model类,那么实例化对象就可以调用CommonModel类封装好的方法

2、model

Model类属性

tableName(不包括前缀)

trueTableName 数据表全名

dbName模型对应数据库名称,通过在model中定义此属性可以实现跨库操作

$fields 字段信息

$tablePrefix 表前缀

如果某个模型类使用的是其他数据表可以再此Model中加

protected $connection =”mysql://username:passwd@localhost:3306/DbName”;

字段映射

Class UserModel extends Model{

protected $_map = array(

'name' =>'username'(数据库中的真实字段),

'mail' =>'email',

);

}

Sql查询

Table方法

$Model->Table('think_user user')->where('status>1')->select();

看到curd操作了。

23、视图和模板

默认的模板文件定义规则:模板目录/模板主题/[分组名/]模块名/操作名+模板后缀

模板调用方法

1、调用当前模块的其他操作模板

Display(“操作名”);

2、调用其他模块的操作模板

display('分组名:模块名:操作名')

我们需要调用Member模块的read操作模版,使用:

$this->display('Member:read');

如果要调用分组Admin的Member模块的read操作模板,可以使用:

$this->display('Admin:Member:read');

3、调用其他主题的操作模板

display('主题名@模块名:操作名')

调用Xp主题的User模块的edit操作模版,使用:$this->display('Xp@User:edit');

4、直接全路径输出模板

格式:display('模板文件名')

输出当前的Public目录下面的menu.html模板文件$this->display('./Public/menu.html');

当前位置是相对于当前项目入口文件而不是模板目录。

还可以指定模板的编码方式,解析方式

$this->display('Member:read', 'utf-8','text/xml');

5、模板特殊字符

· ../Public:当前项目的公共模板目录,通常是 /项目目录/Tpl/default/Public/
· __PUBLIC__:当前网站的公共目录,通常是 /Public/
· __TMPL__:项目的模板目录,通常是 /项目目录/Tpl/default/
· __ROOT__:当前网站的地址(不含域名)
· __APP__:当前项目的 URL 地址(不含域名)
· __URL__:当前模块的 URL 地址(不含域名)
· __ACTION__:当前操作的 URL 地址(不含域名)
· __SELF__:当前的页面 URL

假定我们的项目为:Test

当前模块为:Index

当前操作为:index

../Public:/Home/Tpl/default/Public/

__PUBLIC__:/Public/

__TMPL__:/Home/Tpl/default/

__URL__is/Examples/Test/index.php/Index

__ACTION__is/Examples/Test/index.php/Index/index

__SELF__is/Examples/Test/index.php

__APP__is/Examples/Test/index.php

更改常用字符规则

TMPL_PARSE_STRING =>array(

'__PUBLIC__' =>'/Common', // 更改默认癿__PUBLIC__替换觃则

'__JS__' =>'/Public/JS/', // 增加新癿JS类库路徂替换觃则

)

6、引入公共html片段

<layout name="Public:header" cache="60"/>

<layout name="Public:footer" cache="60"/>

7、生成静态HTML

在config配置文件里面配置

return array(

'HTML_CACHE_ON'=>true,

'HTML_CACHE_TIME'=>10,//

'HTML_READ_TYPE'=>0,

);

同时增加htmls.php

<?php

return array(

'*'=>array('{$_SERVER.REQUEST_URI|md5}'),

);

?>

8、异常与错误处理

修改默认的异常配置文件

'EXCEPTION_TMPL_FILE'=> APP_PATH.'/Public/exception.php'

异常模板中可用的异常变量有

$e['file'] 异常文件名

$e['line'] 异常发生的文件行数

$e['message'] 异常信息

$e['trace'] 异常的详细Trace信息

关闭异常信息显示并设置统一错误提示信息

'SHOW_ERROR_MSG' =>false,

'ERROR_MESSAGE' => '发生错误!'

或者配置ERROR_PAGE参数,将所有的异常和错误指向同一个页面。

'ERROR_PAGE' => '/Public/error.html'或者

'ERROR_PAGE' => 'http://www.myDomain.com/Public/error.html'

9、页面变量

系统变量:包括server、session、post、get、request、cookie

{$Think.server.script_name } // 输出$_SERVER变量

{$Think.get.pageNumber } // 输出$_GET变量

{$Think.cookie.name } // 输出$_COOKIE变量

server、cookie、config不区分大小写,但是变量区分大小写

支持二维数组

{$Think.CONFIG.user.user_name}

{$Think.session.user.user_name}

或者简写为

{$_SERVER.script_name } // 输出$_SERVER变量

{$_SESSION.session_id|md5 } // 输出$_SESSION变量

{$_GET.pageNumber } // 输出$_GET变量

{$_COOKIE.name } // 输出$_COOKIE变量

特殊变量

{$Think.version } //版本

{$Think.now } //现在旪间

{$Think.template|basename } //模板页面

{$Think.LDELIM } //模板标签起始符号

{$Think.RDELIM } //模板标签绌束符号

配置参数

{$Think.config.db_charset}

输出的值和C('db_charset') 的返回结果是一样的。

语言变量

{$Think.lang.page_error}

输出的值和L('page_error') 的返回结果是一样的。

快捷输出

{@var} //输出Session变量和 {$Think.session.var} 等效

{#var} //输出Cookie变量和 {$Think.cookie.var} 等效

{&var} //输出配置参数 和 {$Think.config.var} 等效

{%var} //输出询觊变量 和 {$Think.lang.var} 等效

{.var} //输出GET变量和 {$Think.get.var} 等效

{^var} //输出POST变量和{$Think.post.var} 等效

{*var} //输出常量 和 {$Think.const.var} 等效

默认值输出

如果输出的模板变量没有值

{$变量 |default="默认值"}

10、包含文件

<include file="完整模板文件名" />

<include file="./Tpl/default/Public/header.html"/>

如果使用相对路径的话,是基亍项目的入口文件位置

包含当前模块的其他操作模板

<include file="操作名" />

<include file="read" />

导入当前模块下面的read操作模版:

导入其他模块的操作模板

格式:<include file="模块名:操作名"/>

例如,包含Public模块的header操作模版:

<includefile="Public:header" />

导入js和css

<script type='text/javascript'src='/Public/Js/Util/Array.js'>

<linkrel="stylesheet" type="text/css" href="/App/Tpl/default/Public/css/style.css"/>

<import type='js' file="Js.Util.Array" />

多文件批量导入<import file="Js.Util.Array,Js.Util.Date" />

<import type='css' file="Css.common" />

Import的起始目录是网站的Public目录

<load href="../Public/Js/Common.js" />

<load href="../Public/Css/common.css" />

<load href="__PUBLIC__/Js/Common.js" />

<js href="__PUBLIC__/Js/Common.js" />

<css href="../Public/Css/common.css" />

24、日志

25、调试

26、缓存

27、安全

28、widget

需要继承Widget类,必须定义render方法实现

class ShowCommentWidget extendsWidget{

public function render($data){

return '得到顶顶顶顶顶顶顶顶顶顶';

}

}

Render必须使用return返回要输出的字符串信息而不是直接输出。

或者调用renderFile方法,渲染模板后进行输出。

class ShowCommentWidget extendsWidget{

public function render($data){

$content = $this->renderFile('Article:comment',$data);

return $content;

}

}

页面调用widget

{:W('ShowComment')}

也可以传递参数

{:W('ShowComment',array('count'=>5))}

在action中也可以调用widget

$content = W('ShowComment', array('count'=>5),true);

True表示返回字符串,如果是false则会直接输出
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  thinkphp