




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
--PAGE2 Linux序序--PAGE9和手册阅读须知:本手册仅针 )翻页阅读和号外:双十一系列限时特价化企业应用开发而诞生的 从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简代码的同时,也注重易用性。遵 开源协议发布,意味着你可以免费使 ,甚至许基 开发的应用开源或商业产品发布/销售商业项目升级,但绝对是新项目的首选(无论是WEB还是API开发)支 5的用户请到给我们一 本手册不能替本手册不能替 ,新手建议先阅 的《5.0快 序序--PAGE10新手一群新手一群专家群开放制)允许扯谈(已满员开放制)允许扯谈(已满员制邀请制)发布本资料须遵守开放协议1.0或者更新版本者明确,本文档及其被实质上修改的版本者事先,将此作品及其衍生作品以标准(纸质)书籍形式如果有再或再版本手册的 有任何疑问或者建议,请进入讨论区[ /topic]发布相关讨论有 项目及本文档的资料,请及时项目主站 的,或散布,将导致相应的。我们的团队10年来一直在坚持不懈地努力,并坚持开源和免费提供使用,帮助开发人员更加方便的进行WEB应用的快速开发,如果您对我们的成果表示认同并且觉得对你有所帮助我们愿意接受来自各方面的捐赠用扫描进行支付宝捐推荐阅读( 5.0不可多得的指引 深给出了详尽的使用(新手建议首先阅读快速后再查完全开发手册)。 --PAGE13基安安--PAGE1455PHPPHP>=PDOPHPExtensionMBstringPHPExtensionCURLPHPExtension严格来说,无需安装过程,这里所说的安装其实就是 框架放 一、官网安
运行环境(获 的方式很多 )提供了稳定版本或者带扩展完整版本的官网官网 版本不一定 版本,GIT版本获取的才是保持更新的版本二、Composer安5
ComposerMacOS安装。MacOS/installer|在Windows中,你需要并运行Composer-Setup.execomposerself-Composer,Composer(英文),composerself-为版本
请确保使用的是版本,你可以
下面并执行下面令composercomposercreate-projecttopthink/thinktp5--prefer-如果国如果国 三、Git
Composer太慢,也可以使用
之所以设计为应用之所以设计为应用 仓库分离,是为了支持Composer单独更 框架首先克隆应用项目仓gitgit/top-think/think然后切换 下面,再克隆框架仓库gitgit
方式,如果需要更新框架的时候,只需gitgit如果不熟 命令行,可以使用任何一个GIT客户端进行操作,在此不再详细说明5恭喜你,现在已经完 的安装5如果你无法正常运行并显示的欢迎页面,那么请检查下你的服务器环境PHP5.4以上版本(注意:PHP5.4dev版本和PHP6均不支持)1元享Azure云试用,15--PAGE17开发规55
和文类库、函数文件统一 为后缀函数和类、属性命类名采用驼峰法,并且首字母大写,例 ,默认不需要添加后缀,例应该直接命名 函数名使用小写字母和下划线(小写字母开头)的方式,例 方法名使用驼峰法,并且首字母小写,例 属性名使用驼峰法,并且首字母小写,例 和以双下划线“和常量和配
数据表和字
和THINK_PATH 数据表和字段采用小写加下划线方式命名,并注意字段名不要以下划线开头,例 表应用类库命名空间规应用类库的根命名空间统一为app(可以设置app_namespace配置参数更改例如 ..php)量、类名和方法名,以及命名空 名,否则会造成系统错误结结--PAGE18版框架后,解压缩到 下面,可以看到初始 结构如下project 应 (可设置│公共模 (可更改│模 ││││││││││││└─││应用公共(函数)│应用(公共)│││ 扩展类 (可定义 WEB部 (对 │静态资源存 │应用文││用于apache 应用的运行 (可写,可设置 类 │ │ 框 类││ Think││ 系统│ │ 用于apache│ CI│ │ composer│ 控制 文│ │ 助手函数文件(可选│ │ │ README│ 自动生成定义文件(参考 composer README 命令 文
作为 内容,其它都是 之外,当然,你必须要修中的相关路径。如果没法做到这点,请记得设 权限或者添 列表启动命令:php-Slocalhost:8888router.php --PAGE20架架构总应用基 (模型-视图-控制器)的方式来组织5.0的URL受路由决定,如果关闭路由或者没有匹配路由的情况下,则是基于(或者其它应(或者其它应 文件)/模块/控制器/操作/参数/值,有时候也会为了某些特殊的需求而增加新的文件,例如给模块单独设置的一个文 或者一个控制器程
都属 文件应用 中是一个管理系统架构及生命周期的对象,由系统 类完成,应用通常 应用具有自己独立的配置文件、公共(函数)
)一个典型的应用是由多个模块组成的,这些模块通常都是应 下面的一个 ,每个模块都有自己'app_multi_module'=>
-21架架构总--PAGE22一个典型 控制器类如下namespacenamespaceapp\index\controller;classIndex{publicfunction{return }}一个控制器包含多个操作(方法),操作方法是一个URL的最小单元下面是一个典型 控制器的操作方法定义,包含了两个操作方法namespacenamespaceapp\index\controller;classIndex{publicfunction{return}public {return }}求,则通常 或
服务层 层等等视图通常会有一系列的模板文件对应不同的控制器和操作方法,并且支持动态设置模 系统很多的组件都采用驱动式设计,从而可以更灵活的扩展,驱动类的位置默认是放入类 下面也可以重新定义驱动类库名空间而改变驱动的文件位置
在app_init绑定行为到app_init55
生生命周--PAGE25
用户发起的请求都会经过应用的文件,通常加新的文件通 文件的代码都比较简单,一个普通 文件代码如下
//应 文
.'/../application/');require .'/../ 一般文件以定义一些常量为主,支持的常量请参考后续的内容或者附录部分通常,我们不建议在应用文件中加入过多的代码,尤其是和业务逻辑相关的代码
基础引导文件,某些特殊需求下面可能直接 文件中引如果在你的应用文件中更改了默认的引导文件,则上述执行流程可能会跟随发生变化 自动加系统会调用Loader::register()方法自动加载,在这一步完成后,所有符合规范的类库(包依赖加载的第类库)都将自动加载加载类库映射文件(如果存在如果存在Composer
错误和异常机执行 错误和异常处理机制应用关闭方法:错误处理方法:异常处理方法:应用关闭方法是为了便于一些系统错误加载应用(公共) 检
定义定义 检测,包 必须 如果是命令行下 文件的话,则通$php$phpindex.php
路由地址可能会受绑定的影响如果关闭路由或者路由检测无效则进行默认的模块/控制器/操作可以使用\think\App::dispatch()进行应用调度,例如:App::dispatch(['type'=>'module','module'=>'index/index']);
或 中断执行直 输出的数据将无法进行自动转换响应输出的便利模块/控制器/操用相应的控制器类,执行操作对应的方法控制器方和前式类似,只是无需判断模块、控制器和操作,直接分发请求到一个指定的控制器类的方法,因外部重定可以直接分发请求到一个外部的重定向地址,支持指定重定向代码,默认为301闭包函类的方
文文--PAGE28采用单一模式进行项目部署和,无论完成什么功能,一个应用都有一个统一(但不一定是唯一)的。应该说,所有应用都是从文件开始的,并且不同应用的文件是类似的文件主要完成:载入框架文件(必须5.0默认的应用文件位 ,内容如下
.'/../application/');require .'/../ 文件位置的设计是为了让应用部署更安全,文件位置的设计是为了让应用部署更安全,非 下面修改文件位置请查看章节<部署-虚拟主机环境文件中还可以定义一些系统变量,用于相关的绑定操作(通常用于多个的情况),这个会在后面 定义绝对路径会提高系统的加载效率
define('APP_PATH', .'/../application/');require .'/../ //--PAGE30
在没有启用路由的情况下典型的URL规则是(或者其它应(或者其它应 文件)/模块/控制器/操作/[参数名/参数值支持切换到命令行,如果切换到命令行模式下面的规则是>php.exe>php.exeindex.php(或者其它应 文件)模块/控制器/操作/[参数名/参数值可以看到,无论是URL还是命令行,都采用
取消了URL模式的概念,并且普通模式的URL不再支持,但参数可以支持普通方式传值,>php.exe>php.exeindex.php(或者其它应 文件)模块/控制器/操作?参数名=参数值(或者其它应(或者其它应
里面的模块/控制器/操作名如果下面的地在这种URL不区分大小写情况下,如果要驼峰法的控制器类,则需要使用如果希 严格区分大小写,可以在应用配置文件中设置关闭URL =>一旦关闭自动转换,URL地址中的控制器名就变成大小写敏感了,例如前面的地址就要写成但是下面的URL依然是有效的下面的URL则无效需要注意:路由规则中定义的路由地址是按照控制器名的实际名称定义(区分大小写)需要注意:路由规则中定义的路由地址是按照控制器名的实际名称定义(区分大小写)隐藏文 5.0中,出于优化的URL原则,还支持通过URL重写隐藏文件,下面隐藏应用文件index.php的设置1httpd.conf配置文件中加载了mod_rewrite.so
AllowOverride 将None改为AllowOverride3、在应用文件同 添 文件,内容如下<IfModule<IfModuleOptions+FollowSymlinks-MultiviewsRewriteEngineonRewriteCond%{REQUEST_FILENAME}!-dRewriteCond%{REQUEST_FILENAME}!-fRewriteRule^(.*)$index.php/$1[QSA,PT,L]其它环境的隐藏文件参考后面的URL重模块设均 作为根命名空间(可配置更改)标准的应用和模 结构如下(可设置│││││││││││││││││││││││││││└─││││││└─ 模型(可选视图(可选)模块模型(可选视图(可选)遵 名规范,模 全部采用小写和下划线命名..php),
模块是一个特殊的模块,默认是直接的,一般用于放置一些公共的类库用于其他模一个模块下面的类库文件名空间统一 开头,例如//index//index模块的Index控制器类index模块的User其 可以通过定义的方式更改,例如我们在应用配置文件中修改-33模块设'app_namespace''app_namespace'=>//index//index模块的Index控制器类index模块的User话,可以进行模块绑定,方法是应用的文件中添加如下代码绑定后,我们的URL地址则变成控制器/操作/[参数名/参数值控制器/操作/[参数名/参数值的模块 模块设置后,我们的URL地址则变成操作/[参数名/参数值操作/[参数名/参数值
'app_multi_module'=>然后,调整应 的结构为如下-34--PAGE35模块设││││├─││││ URL地址变(或者其它应(或者其它应 )/控制器/操作/[参数名/参数值同时,单一模块设计下的应用类库名空间也有所调整,例如:命命名空--PAGE365名空间问题,并且实现了更加高效的类库自动加载机制
类库之间特别注意的是,如果你需要调用PHP内置的类库,或者第没有使用命名空间的类库,记得在实例化\库的时候加 ,例如\$class=new$xml=new$class=new$xml=new 中,只需要给类库正确定义所在名空间,并且命名空间的路径与类库文件 一致例如 类的定义为namespacenamespacethink\cache\driver;classFile{}$class$class=new。 规范是小写,类文件命名是驼峰法,并且首字母大写$class=new $class=new命命名空--PAGE37根命名空间(类库包
类为例,think),系统内置的几个根命名空间(类库包)系统类如果需要增加新的根命名空间,有两种方式:新的根命名空间或者放入
(名空间的话,都表示指的是think请自行添加usethink\Route我们只需要把自己的类库 放应名空间,例如
(
,可配置),就可以自动
下面新增一个 ,然后定义一)
类(namespacenamespaceclass{publicfunction{echo }}$Test$Test=new
那 类文件的位置就变成 也可以通过手动的方式新的根命名空间,例如在应用文件中添加下面的代码如果要同时多个根命名空间,可以使用'my'=>'../application/extend/my/','org'=>'../application/extend/org/',也可以直接在应用的配置文件中添加配置,系统会在应用执行的时候自 'root_namespace''root_namespace'=>'my'=>'../application/extend/my/','org'=>'../application/extend/org/',]
自动加载的类库存 ,应用类 名空间的根都统一
namespaceapp\index\model;classnamespaceapp\index\model;classUserextends\think\Model{}其类文件位 namespacenamespaceapp\admin\event;classUser{}命名空
根命名空间不合适或者 ,可以在应用配置文件中修改'app_namespace''app_namespace'=>定义后,应用类库名空间改为namespacenamespaceapplication\index\model;classUserextends\think\Model{}namespacenamespaceapp\index\model;usethink\Model;classUserextends{}namespacenamespaceapp\index\controller;useapp\index\model\User;classIndex{publicfunction{$user=new}}如果我们在应用公共文件中命名空间别名如下namespaceapp\index\controller;usemodel\User;-39namespaceapp\index\controller;usemodel\User;--PAGE40命名空classclass{publicfunction{$user=new}}本手册后续的章节,均建立在你已经了解PHP命名空间的基础之上,如果不掌握请行补充PHP基础,否则你在后续的文档和 的学习过程中,对命名空间的缺乏理解会成为你最大的学习 。自自动加--PAGE41
真正实现了按需加载,所有类库采用自动加载机制,并且支持类库映射 类
由于新版完全采用了命名空间的特性,因此只需要给类库正确定义所在名空间,而命名空的路径与类库文件 一致,那么就可以实现类的自动加载 自动加载检测 自动加载检测遵循我们上面名空间定义规范的话,基本上可以完成类库的自动加载了,但是如果定义了较多名也可以利 方法批量导入类库映射定义,例如$map$map= 如果你不需要系统的自动加载功能,又或者没有使用命名空间的话,那么也可以使 类////引入extend/qrcode.phpLoader::import('qrcode'EXTEND_PATH);import('qrcode',//引入extend/wechat-sdk/wechat.class.phpLoader::import('wechat-sdk.wechat',EXTEND_PATH,'.class.php');import('wechat-sdk.wechat',EXTEND_PATH,@`Composer
trait是一种为类似PHP的单继承语言而准备的代码复用机制 为了减少单继承语言的限制使开发人员能够自由地在不同层次结构内独立的类中复用方法集。trait和类组合的语义是定义了一种 的自动加载,因此如果是PHP5.4版本,必须手动导入trait类库,系
namespaceapp\index\controller;load_trait('controller/Jump')namespaceapp\index\controller;load_trait('controller/Jump');//引入traits\controller\Jumpclassindex{usepublicfunction{}}
函数引 namespacenamespaceapp\index\controller;classindex{usepublicfunction{}}可以支持同时引入多 类库,例如namespaceclassnamespaceclass--PAGE44{{use\traits\controller\Other;use\traits\controller\Jump;publicfunction{}}namespacenamespaceclass{usepublicfunction{}}系统提供了一些封装好 类库,主要是用于控制器和模型类的扩展。这些系统内置
,是为了避免和系统的关键字 插入的成员所覆盖。优先顺序
决将会产生一个致命错误
在同一个类中名,需要使
操作符来明确指定使用方法以上方式仅允许排除掉其它方法 操作符可以将其中一个的方法以另一个名称来引入的关 内容可以参考PHP手册APIAPI友--PAGE45新版针
开发做了很多的优化,并且不依赖原来的API新版的控制器输出采用Response或者动态设置不同类型 输出就可以自动进行数据转换处理,一般namespacenamespaceclass{publicfunction{$data= }}支持明确指定输出类型的方式输出,例如下面指 数据输出namespacenamespaceclass{publicfunction{$data= 指定json}}或者指定输 类型数据namespacenamespaceclass{publicfunction{$data= 指定xml}}支持的数据类型包 55
由 开发不方便在客户端进行开发调试,
调试功能支
式,可以实现的开发调试'app_trace''app_trace'=>true, =>[socket服务器=>=>然后安 浏览器插件后即可进 调试,详细参考调试部分配配--PAGE47配置功能 类完成系统默认的配置文 就是应
),
配置(整个应用有效)和模块配置(仅针对该模块有效)││││││││
define('CONF_PATH',DIR配 下面的结构类似如下││││││││扩展配 开始增加了扩展配 的概念,在应用配 或者模块配 下面增
,下│││││││││││││││││││配配--PAGE49扩展配置文件的文件名(不含后缀)配配置格--PAGE50return[ =>=>=>还可以在配置文件中可以使用二维数组来配置的信息,例如return[ => =>'File', =>CACHE_PATH,'prefix'=>'','expire'=>0,
更改配置格式为inidefine('CONF_EXT',配置后,会自动解析支持的配置类型,包 在内的格式支持配配置格default_module=Index;default_module=Index;默认模块default_controller=index默认控制器default_action=index;默认操作{{}$config=$config='user'=> echoecho [-51--PAGE52配置格 --PAGE53配置加 中,一般来说应用的配置文件是自动加载的,加载的顺序是惯例重于配置是系统遵循的一个,框架内置有一个惯例配置文件(位),文件,往往只需要配置和惯例配置不同的或者新增的配置参数,如果你完全采用默认配置,甚至可以不需要定义任何配置文件。应用配置文件是应用初始化的时候首先加载的公共配置文件,默认位 扩展配置文件是由extra_config_list配置参数定义的额外的配置文件,默认会加 V5.0.1V5.0.1开始,取消了该配置参数,扩展配置文件直接放入 会自动加载每个应用都可以在不同的情况下设置自己的状态(或者称之为应用场景), 配置加那么就会自动加载该状态对应的配置文件(位 )每个模块会自动加载自己的配置文件(位加载配置配置文件一般位 下面,如果需要加载其它位置的配置文件,需要使用完整路径,例如returnreturn 如果你定义格式是其他格式的话,可以使 方法来导入,例如 配置文件外,也支持直接传入配置内容,例如
-54--PAGE55配置加$config='var1=val$config='var1=val--PAGE56配 配置了,例如echoechoConfig::get('配置参数系统定义了一个助手函 ,以上可以简化为echoechoconfig('配置参数或者或者config('?配置参数如果需 二级配置,可以使用echoechoConfig::get('配置参数.二级参数');echoconfig('配置参数.二级参数');--PAGE57动态配使 方法动态设置参数,例如独立配配置文件支持分离(也称为扩展配置),已经该写法)
/*/*数据库设置*/=>=>=>=>=> => => =>//数据库编码默认采用utf8 =>'utf8', => =>=>定义之后,数据库配置就可以独立使 文件,配置内容如下/*数据库设置*/return[/*数据库设置*/return[=>=>=>=> => =>独独立配--PAGE59=>//数据库编码默认采用utf8 =>'utf8', => =>
参数,并同时在config.php
文件的配置会覆 中的设置
版本要求以上版本支持自动扩展配置文件 配置参数废弃),只需要将扩展配文件放 ,即可自动自动的配置文件都是二级配置参数,一级配置名称就是扩展配置的文件名
独独立配--PAGE60
,那么扩展配置文 应该,模块的扩展配 则变
,模块配 则变。--PAGE61配置作用导入my_config.php中的配置参数,并纳入user解析并导入my_config.ini中的配置参数,读入test设置user_type参数,并纳入user批量设置配置参数,并纳入test echoConfig::get('user_type','user'); dump(config('',null,'user'))判断在test作用域下面是否存在user_type可以使 方法切换当前配置文件的作用域,例如环环境变量配--PAGE62在开发过程中,可以在应用 下面
方式,例如app_debugapp_debug=trueapp_trace=如果你的部署环境单独配置了环境变量,那么请删 配置文件,避 环境变量配置的参数会全部转换为大写,值
,值 等效
database_username=database_username=rootdatabase_password=123456username=rootpassword=123456////获取环境变量如果不存在则使用默认值rootreturnreturn环境变量中设置的app_debug和app_trace参数会自动生效(优先于应用的配置文件),其它参数则必须通过Env::get方法才能 --PAGE64路
子路由功能改进区分不同的设置(例如某些模块需要关闭路由,某些模块需要强制路由等),需要给该模块增加单独的
.'/../application/');require .'/../ //绑定当 关闭admin路路由模--PAGE65一、普通模关闭路由,完全使用默认 方式'url_route_on''url_route_on'=>路由关闭后,不会解析任何路由规则,采用默认 模 可以设 =>二、混合模
'url_route_on''url_route_on'三、强制模开启路由,并设置必须定义路由才能这种方式下面必须严格给每一 地址定义路由规则(包括首页),否则将抛出异常/首页的路由规则采 定义即可,例如下面 首页路由输/return' --PAGE67路由定路由可以采用方法动态单个和批量,也可以直接定义路由定义文件的方式进行集中动路由定义采用\think\Route类 方 ,通常是在应用的路由配置文进行,格式是例如如下路由规则useuse我们 开始,而不是基于模块名的并且原来的地址会自动失效路由表达式(第一个参数)定义new可以在rule路由定*Route::get('new/:id','News/read');//Route::get('new/:id','News/read');//定义GET请求路由规则Route::post('new/:id','News/update');//定义POST请求路由规则Route::put('new/:id','News/update');//定义PUT请求路由规则Route::delete('new/:id','News/delete');//定义DELETE请求路由规则Route::any('new/:id','News/read');//所有请求都支持的路由规则我们也可以批量路由规则,例如多个路由规则后,系统会依次遍历过的满足请求类型的路由规则,一旦匹配到正确的路由规则后则正则路由定义功能已正则路由定义功能已 ,改由变量规则定义完成规则表达'index''index' =>'Member/myinfo''blog/:id'=>'Blog/read'路路由定--PAGE69'new/:year/:month/:day'=>'News/read''new/:year/:month/:day'=>'News/read'/////
可选定[变量 包含起来后就表示该变量是路由匹配的可选变量[完全匹$完全匹配,可以在路由表达式最后使 符号,例如$'new/:cate$'=>'new/:cate$'=>'new/:cate'=>'new/:cate'=>路路由定--PAGE70 plete_match'=>候能够起到一定的安全防护作用,后面我们会提到)上面的路由规则定义中额外参数的传值方式都是等效的 批批--PAGE71批量路由规则可以使用两种方式,包括方法和路由配置定义如果不希望一个个,可以使用批量,规则如下'new/:id''blog/:id'以上的路 ,最 'new/:id''blog/:id''new/:id''blog/:id''new/:id''blog/:id''new/:id''blog/:id'除了支持动态,也可以直接在应 下面
returnreturn => =>['Blog/update',['method'=>'post|put'],['id'=>路由动 和配置定义的方式可以共存,例如
useuse return => =>['Blog/update',['method'=>'post|put'],['id'=>route.php,如果你需要定义多个路由文件,可以修改定义路由配置文件(数组'route_config_file'=>['route','route1',如果存在相同的路由规则,一样可以参面的批量方式进行定义由于检测机制问题,动 的性能比路由配置要高一些,尤其是多种请求类型混合定义的时候--PAGE73变量规全局变量规设置name变量规则(采用正则定义'name'=> =>局部变量规定义GET请求路由规则并设置name完整URL规 定义GET请求路由规则并设置完整URLRoute::get('new/:id','News/read',[],['url--PAGE74组合变路由参前置行为(检测后置行为(执行绑定模型(V5.0.1请求缓存(V5.0.1路由参数分隔符(V5.0.2Ajax检测(V5.0.2Pjax检测(V5.0.2版本 条件支 请求类如果指定请求类 路由的话,无需设
请求类型参数。如果使用了rule或 方
检测路由规则仅GET检测路由规则仅GET和POST定义GET请求路由规则并设置定义GET请求路由规则并设置URL后缀为html-75路路由参--PAGE76定义GET请求路由规则并设置检支持使用完整或者子进行检测,例如检测只在// 检HTTPS检支持检测当前是否前置行为检namespacenamespaceapp\index\behavior;classUserCheck{publicfunction{returnfalse;}}}后置行为执行为类定义如下:namespacenamespaceapp\index\behavior;useapp\index\model\User;classReadInfo{publicfunction$id=request()->route('id');request()->user=User::get($id);}}Callback检
路由后,就会执行行为类的run合并额外参/o会被匹配到,并 变量的值 /o配置文件中添加路由参returnreturn =>['Blog/update',['method'=>路由绑定模型 缓存路由请表示对当前路由请求缓存3600路路由地--PAGE79路由地址表示定义的路由表达式最终需要路由到的地址以及一些需要的额外参数,支持下面5方式2:'外部地址'(默认301重定向)方式3:方式4:'\完整名空间类::静态方法'或者'\完整名空间类@动态方法方式5:闭包函数定义(支持参数传入其中方式5会在下一个章节闭包支持中详细描述[模块/控制[模块/控制器/]操作?参数1=值1&参数2=值路由到indexnamespacenamespaceapp\index\controller;classBlog{publicfunctionreturn}}namespacenamespaceapp\index\controller\group;classBlog{publicfunctionreturn}}//action//action变量的值作为操作方法传入':action/blog/:id'index/blog/:action'变量传入index':c/:a'=>额外参中,有时候能够起到一定的安全防护作用,后面我们会提到)上面的路由规则定义中额外参 @[@[模块/控制器/]操模块/namespaceapp\index\controller;classBlog{publicnamespaceapp\index\controller;classBlog{publicfunctionreturn}}路由地址的格式为(动态方法\\ 名空间\类名@方法或者(静态方法\\ 名空间\类名::方法
类 方法和虽然都是路由到同一个地址,但是前者采用的是301重定向的方式路由跳转,这种方式的好处是R可以比较随意(包括可以在R里面传入的非标准格式的参数),而后者只是支持模块和操作地址。举个例子,如果我们希 重定向路由地址采用重定向地址的话,如果要动态变量,直接使用动态变量即可。表示当前(可能是h )的blog/123地址会直接重定向到 资源路
或者在路由配置文件中使用 添加资源路由定义:returnreturn'rest指向index模块的blog ]对应操作方法(默认namespaceapp\index\controller;classBlog{publicfunctionnamespaceapp\index\controller;classBlog{publicfunction}资资源路--PAGE84publicpublicfunction}publicfunction}}namespacenamespaceapp\index\controller;classBlog{publicfunction}publicfunction}publicfunction}}也可以在定义资源路由的时候限定执行的方法(标识),只允许indexreadeditupdate排除index和deleteRoute::rest('create',['GET',Route::rest('create',['GET',资资源路--PAGE85 =>['POST','','update'=>['PUT','/:id','delete'=>['DELETE','/:id',就可以如下地址namespacenamespaceapp\index\controller;classComment{publicfunction}}更改嵌套资源路由的blog更改嵌套资源路由的blog资源的资源变量名为 namespacenamespaceapp\index\controller;classComment{publicfunction{}}--PAGE87快捷路快捷路由允许你快速给控制器路由,并且针对不同的请求类型可以设置方法前缀,例如给Usernamespacenamespaceapp\index\controller;classUser{publicfunction{}publicfunction{}publicfunction{}publicfunction{}publicfunction{}}我们可以通过下面的路由别例如,我们希望使 可 user别名路由到index/User如果在路由配置文 中定义的话,使用returnreturn'alias''user'[//user路由别名指向User控制器类//user路由别名指向User控制器类user别名路由到index/user-88--PAGE89路由别returnreturn'alias''user'[操作方法黑白 路由别名的操作方法支持白或者机制,例如user别名路由到index/user或者使用机user别名路由到index/useruser别名路由到index/user路路由分--PAGE90 =>['Blog/read',['method'=>'get'],['id'=>'\d+']],'blog/:name'=>['Blog/read',['method'=>'post']], => =>['Blog/read',['method'=>'get'],['id'=>'\d+']],':name'=>['Blog/read',['method'=>'post']],可以使 类 方法进 ,如下 =>['Blog/read',['method'=>'get'],['id'=>'\d+']],':name'=>['Blog/read',['method'=>'post']], =>['Blog/read',[],['id'=>'\d+']],':name'=>['Blog/read',[],支持使用闭包方式路由分组,例如路路由分--PAGE91}--PAGE92MISS路
returnreturn =>'blog/:id'=>['Blog/update',['method'=>'post|put'],['id'=>'\d+']],'miss'=>'public/miss',或者使 方 路
分组支持独立 路由,例如如下定义returnreturn'[blog]'=>'edit/:id'=>['Blog/edit',['method'=>'get'],['id'=> =>['Blog/read',['method'=>'get'],['id'=>'\d+']],'miss'=>'blog/miss', =>'News/read','miss'=>'public/miss',如果使 方 路由的话,可以使用下面的方式--PAGE93闭包支return参数传return路路由绑--PAGE94绑定当前的URL到index模块绑定当前的URL到index模块的blog//绑定当前的URL到index模块的blog控制器的read操作
就可以直 如果我们需要给某个文件绑定模块,可以使用下面两种方式常量定只需 文件添 常量,即可把当 文件绑定到指定的模块或者控制器,例如define('APP_PATH', .'/../application/');绑定到indexrequire .'/../ 自 绑如果你 文件都是对应实际的模块名,那么可以使用文件自动绑定模块的功能,只需要在应用配'auto_bind_module'=>
.'/../application/');require .'/../
绑绑定模--PAGE97模型绑定 ['user'=>
['user'=>表示查 的值等于当前路由变量的模型数据 ['user'=>$model=new\app\index\model\User;return$model->where($param)->find();}路路_deploy'=>_deploy'=>定义部署规则支持两种方式:动态和配置定义可以在应用的公共文件或者配置文件中动态部署规则,例如////blog //完 IP绑定到admin 原来的URL绑定到blogblog子$_GET['var']=$_GET['var']='
blog子
原来的URL绑定到原来的URL绑定到blog路路如果你的后缀比较特殊,例如 或 之类的,需要配置泛部可以支持泛部署规则,例如////绑定泛二 并且可以直接通过$_GET['name']变量获取当前的泛。////绑定泛三 $_GET['name']=$_GET['name']=return return //泛=>=>-100路路--PAGE101]前面我们看到的部署规则blog子其实是把绑定到模块的方式,其实还有其他的绑定方式blog子绑定blog子blog子blog子绑定到闭包函如果需要,你也可以直接把绑定到一个闭包函数,例如////blog 绑定闭包函 echo' return ('www',//动态 Route::rule('new/:id','index/news/read');Route::rule(':user','index/user/info');////blog 绑定到闭包函 绑定路由规路路--PAGE102可以把绑定到一系列指定的路由规则,例如 //动 的路由规':id'=>['blog/read',['method'=>'GET'],['id'=>'\d+']],returnreturn '=>[ =>//动 的路由规':id'=>['blog/read',['method'=>'GET'],['id'=>'\d+']],]URLURL生--PAGE103
下面我们统一使用第式讲解使用模块/控制器/操作生////生成index模块blog控制器的read操作 地 ''使用控制器的方法生这里采用配置方式定义路由动态'blog/:id'=>////生成index模块blog控制器的read操作 地使用类的方法生这里采用配置方式定义路由动态URL生生成index模块blog控制器的read操作URL直接使用路由地'blog/:id''blog/:id'=>
=> =>-105URLURL生--PAGE106自自动生第四个参数传入true的话,表示自动生成,如果你开启了例如,我们了路由信息如下
指你也可以显式传入需要生成地址的,例如也可以直接在第一个参数里面传 ,例如 隐藏或者加上文
或者去掉index.php:
或者隐 --PAGE108控制--PAGE109控制器定V5.0的控制器定义比较灵活,可以无需继承任何的基础类,也可以继承封装的namespacenamespaceapp\index\controller;classIndex{publicfunction{return}}控制器类可以无需继承任何类,命名空间默认 为根命名空间'app_namespace'=>namespacenamespaceapplication\index\controller;classIndex{publicfunction{return}}控制器定namespacenamespaceapp\index\controller;usethink\View;class{publicfunction{$view=newreturn$view-}}namespacenamespaceapp\index\controller;classIndex{publicfunction{return}}
类的话,可以直接调
namespacenamespaceapp\index\controller;usethink\Controller;classIndexextends{publicfunction{//获取包 return$this-}}
namespaceclassnamespaceclass{public控控制器定--PAGE111{{return}publicfunction{return}publicfunction{return}}
namespacenamespaceapp\index\controller;classIndex{public {return }publicfunction{return }}当我们设置输出数据格式为 =>控控制器定--PAGE112""namespaceapp\index\controller;classIndex{namespaceapp\index\controller;classIndex{publicfunction{return }}当我们设置输出数据格式为 =>--PAGE113控制器初始
类的话,可以定义控制器初始化方 ,namespacenamespaceapp\index\controller;usethink\Controller;classIndexextends{publicfunction{echo}public{return}publicfunction{return}}如果o如果前前置操--PAGE114可以为某个或者某些操作指定前置执行的操作方法,设 属性可以指定某个方法为['except['except方法名,方法名['only['only方法名,方法名namespaceapp\index\controller;usethink\Controller;classIndexextends{protected$beforeActionList=['second'=> 'three'=> protectedfunction{echo}protectedfunction{echo}protectedfunction{echo}public {return }publicfunction{return}}oo跳跳转和重定--PAGE116
,用于namespacenamespaceapp\index\controller;usethink\Controller;useclassIndexextends{publicfunction{$UsernewUser实例化User$result=$User->save($data);$this->success('新增成功}else}}}跳转地址是可选的,success方法的默认跳转地址 地址 默认的等待时间都是3 方法都可以对应的模板,默认的设置是两个方法对应的模板都是THINK_PATHTHINK_PATH.'dispatch_error_tmpl'=>APP_PATH.'dispatch_success_tmpl'=>APP_PATH.'dispatch_error_tmpl'public/error','dispatch_success_tmpl'=>模板文件可以使用模板,并且可以使用下面的模板变量返回的自动判断当前请求是否属于Ajax请求,如果属于Ajaxdefault_ajax_returnsuccess在Ajax
类 方法可以实现页面的重定向功能 $this->redirect('News/category',['cate_id'=>//重定向到指定的URL//重定向到指定的URL地址并且使用--PAGE118空操
) (空操作)方法namespaceclass{publicfunction{return$this->showCity($name);}//注意showCity方法本身是protectedprotectedfunction{return当前城市$name;}}由于City并没有定义beijing、shanghai或者shenzhen_empty中去解当前城市V5.0.2开始,空操作方法不需要任何参数,如果要获取当前的操作方法名,直接调用当前请求对象来空空控制--PAGE119的index方法里面进行处理。可是如果使用空控制器功能,这个问题就可以迎刃而解了。namespaceapp\index\controller;usethink\Request;class{publicfunctionindex(Request{$cityName=$request->controller();return$this->city($cityName);}//注意city方法本身是protectedprotectedfunction{return当前城市$name;}}当前城市=>--PAGE121多级控制namespacenamespaceapp\index\controller\one;usethink\Controller;classBlogextends{publicfunction{return$this-}publicfunction{return$this-}publicfunction{return$this-}}分分层控制--PAGE122引入了分层控制器的概念,通过 的控制器 问控制器是 类负责调用和实例化的,无需手动实例化URL解析和路由后,会把当前的URL,其实也就是执行某个控制器类的某个namespacenamespaceapp\index\controller;classBlog{publicfunction{return}publicfunction{return}publicfunction{return}}输出输出输出只能在控制器、模型类的内部,或者视图模板文件中进行调用例如,我们定义 控制器如下namespacenamespaceapp\index\event;classBlog{publicfunction{return}publicfunction{return}publicfunction{return}}$event=\think\Loader::controller('Blog','event');echo$event->update(5);//$event=\think\Loader::controller('Blog','event');echo$event->update(5);//输出update:5echo$event->delete(5)输出$event=controller('Blog','event');echo$event=controller('Blog','event');echo$event->update(5)输出update:5echo$event->delete(5)输出$event$eventcontroller('Admin/Blog''event');echo$event->update(5);//输出update:5echoecho\think\Loader::action('Blog/update'['id5]'event')输出也可以使用助手函 实现相同的功能echoechoaction('Blog/update'['id5]'event')输出利用分层控制器的机制,我们可以用来实 (其实就是在模板中调用分层控制器),例如定 控制器类如下namespacenamespaceapp\index\widget;classBlog{publicfunction{return}publicfunction{return}public {return }}
{:action('Blog/header',{:action('Blog/header','', ',['name'=>'think'],
',['name'=>--PAGE125Rest控制namespacenamespaceapp\index\controller;usethink\controller\Rest;classBlogextendsRest{}//URL//URL伪静态后缀=>RESTFul方法定 namespaceapp\index\controller;usethink\controller\Rest;classBlogextendsRest{publicfunction{switch($this-case'get'getif($this->type==}elseif($this->type==}case'put'put请求处理代码case'post'post}}}
获取当 的资源类型,
Rest控制RESTFul使用Restresponse$this->response($data,$this->response($data,'json',使用使用think\ResponseResponse::create($data,'json')-json($data,json($data,输出jsonjson($data,输出jsonpjsonp($data,输出xmlxml($data,除了普通方式定义l是根据当前请求类型和资源类型自动调用相关操作方法。系统的自动调用规则是:操作名_提交类型_操作名_候,例如操作名_例如namespaceapp\index\controller;usethink\controller\Rest;classInfoextendsRest{publicfunction{namespaceapp\index\controller;usethink\controller\Rest;classInfoextendsRest{publicfunction{-126--PAGE127Rest控制输出id为1的Info的XML}publicfunction{输出id为1的Info的XML}publicfunction{输出id为1的Info的json}}假设我们没有定义路由,这样的是Info模块的read操作,那么上面的请求会调用Info类的read_get_xml方--PAGE128自动定位控制'controller_auto_search'=>'controller_auto_search'=>
参数开启自动定位控制器,便于namespacenamespaceapp\index\controller\one;usethink\Controller;classBlogextends{publicfunction{return$this-}publicfunction{return$this-}publicfunction{return$this-}}我们就可以直 --PAGE129资源控制资源控制器可以让你轻松的创 资源控制器,可以通过命令行生成需要的资源控制器,例如生成index模块的Blogphpthinkmake:controller或者使用完整名空间生phpphpthinkmake:controller然后你只需要为资源控制器一个资源路由设置后会自 --PAGE130请请请求信--131 $request$request=$request$request=$request=$request=echo:'.$request-().echo'file:'.$request->baseFile().获取当前URL地址不含echo'url:'.$request->url().//获取包 echo'url :'.$request->url(true).获取当前URL地址不含echo'urlwithoutquery:'.$request->baseUrl().//获取 echo'root:'.$request->root().//获取 echo'root :'.$request->root(true).获取URL地址中的PATH_INFOecho'pathinfo:'.$request->pathinfo().获取URL地址中的PATH_INFO信息不含后缀echo'pathinfo:'.$request->path().获取URLecho'ext:'.$request->ext().:file:/index.phpurl::file:/index.phpurl:/index/index/urlwith urlwithoutquery:/index/index/ root pathinfo: 请请求信--132pathinfo:pathinfo:index/index/ext:htmlo$request$request=echo当前模块名称是$request-echo"当前控制器名称是".$request->controller();echo"当前操作名称是".$request->action();如果当前的地址是当前模块名称是当前模块名称是当前控制器名称 当前操作名称是$request=$request=echo'请求方法 '.$request->method().'<br/>';echo'资源类型 '.$request->type().'<br/>';echo' '.$request->ip().'<br/>';echo'是否AJax请求 '.var_export($request->isAjax(),true).'<br/>';echo'请求参数 echo'请求参数 echo'请求参数 请求方 资源类 地 array'test'=>string'ddd'(length=3)'name'=>string' '(length=8) array(size=1)'name'=>string' array(size=1)--PAGE133请求信'test''test'=>string'ddd'o方法$request$request=Request::instance();echo'路由信息 echo'调度信息 returnreturn[o/:name'array(size=4)'rule'=>string'o/:name''route'=>string'index/ o'(length=11)'pattern'=>array'name'=>string'\w+'(length=3)'option'=>array(size=0)array'type'=>string'module'(length=6)'module'=>array0=>1=>string'index'2=>string o'$request$request=--PAGE134请求信输输入变--PAGE137
对象完成全局输入变量的检测、获取和安全过滤,支持包
等系统变量,以及文件上传信息可以使 方法来检测一个变量参数是否设置,如下变量获取使 类的如下方法及参数变变量类型方法('变量名/变量修饰符','默认值','过滤方法$_GET$_POSTPUTDELETE$_SESSION获取$_变$_REQUEST$_SERVER$_ENV$_FILES获 变
或 请求的一种变量获取方式,是系统推荐的获取当前请求的name获取当前请求的所有变量(经过过滤获取当前请求的所有变量(原始数据获取当前请求的所有变量(包含上传文件因 方式获获取GET变Request::instance()->get('id');//获取某个get变量Request::instance()->get('name');//获取get变量Request::instance()->get();//获取所有的get变量(经过过滤的数组)Request::instance()->get(false)获取所有的get变量(原始数组或者使用内置的助手函 方法实现相同的功能获获取POST变Request::instance()->post('name');//获取某个post变量Request::instance()->post();//获取经过过滤的全部post变量Request::instance()->post(false);//获取全部的post原始变量获取PUT变Request::instance()->put('name');//获取某个put变量Request::instance()->put();//获取全部的put变量(经过过滤)Request::instance()->put(false);//获取全部的put原始变量获取REQUEST变Request::instance()->request('id');//获取某个request变量Request::instance()->request();//获取全部的request变量(经过过滤)Request::instance()->request(false);//获取全部的request原始变量数据获获取SERVER变Request::instance()->server('PHP_SELF')获取某个serverRequest::instance()->server()获取全部的server获获取SESSION变Request::instance()->session('user_id')获取某个sessionRequest::instance()->session()获取全部的session获获变('user_id')Request::instance()->get('name','','htmlspecialchars');//Request::instance()->get('name','','htmlspecialchars');//获取get变量并用htmlspecialchaRequest::instance()->param('username','','strip_tags');//获取param变量并用strip_tags函Request::instance()->post('name','','org\Filter::safeHtml');//获取post变量并用org\FiltRequest::instance()->param('username','','strip_tags,strtolower');//Request::instance()->param('username','','strip_tags,strtolower');//获取param变量并依
需要注意的是,采用FilterIDfalse,因此你需要配合默认就表示,如果不是规范的地址的话返回空字符串。
版本获取get只获取当前请求的id和name只获取当前请求的id和name只获取GET请求的id和name只获取POST请求的id和name排除id和name排除id和name排除GET请求的id和name排除POST请求的id和nameinput('input('变量类型.变量名/修饰符Request::instance()->Request::instance()->变量类型('变量名/修饰符 ,如果需要传入字符串之外的变量可以使用下面的修饰符,包括sdbaf如果你要获取的数据为数组,请一定注意要加上如果你要获取的数据为数组,请一定注意要加上/a--PAGE141更改变更改GET更改POST
--PAGE142请求类在很多情况下面,我们需要判断当前操作的请求类型
或 ,一5.0取消了用于判断请求类型的系统常量(如IS_GET,IS_POST等),统一采用 是否为GETif(Request::instance()->isGet()echo当前为GET请求是否为POSTif(Request::instance()->isPost()echo当前为POST请求是否为PUTif(Request::instance()->isPut()echo当前为PUT请求是否为DELETEif(Request::instance()->isDelete()echo当前为DELETE请求是否为Ajaxif(Request::instance()->isAjax()echo当前为Ajax请求是否为Pjaxif(Request::instance()->isPjax()echo当前为Pjax请求if(Request::instance()- ())echo"当前 是否为HEADif(Request::instan
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 大方天麻林下仿野生种植技术应用的环境条件和详细步骤分析
- 湖北省武汉市二中广雅中学2024-2025学年九年级下学期3月月考化学试题(原卷版+解析版)
- 新未来大学英语 视听说教程1(智慧版) 听力脚本 Unit 1
- 建筑电气系统修缮技术方案
- 2025年自动化X光检查机项目合作计划书
- 中西医结合外科学知到课后答案智慧树章节测试答案2025年春广州中医药大学
- 2025年双层客房车项目发展计划
- 医院外出进修、培训及参加学术会议的管理规定
- 江西省上饶市2023-2024学年高二下学期期末考试语文试题2
- 2017-2018学年人教课标高一英语必修4试题Unit5Themeparks单元测试题2
- 2025年湖南理工职业技术学院单招职业技能测试题库必考题
- 第十八届“地球小博士”全国地理知识科普竞赛题库(附答案)
- 2024年10月高等教育自学考试07454传感器技术应用试题及答案
- 室内采暖管道安装施工工艺标准规范标准
- 小型手推清扫车毕业设计说明书课件
- 监理大纲(范本)
- 受拉钢筋抗震锚固长度Lae
- 2018年湖北省襄阳市中考物理试卷
- 《沉淀滴定法》PPT课件.ppt
- 波程差与光程差
- 常用测井曲线符号及单位(最规范版)
评论
0/150
提交评论