thinkphp基础
__DIR__ :当前内容写在哪个文件就显示这个文件目录
is_file() 函数检查指定的文件名是否是正常的文件
strpos() 函数查找字符串在另一字符串中第一次出现的位置。
注释:strpos() 函数对大小写敏感。
$_SERVER 是一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组。这个数组中的项目由 Web 服务器创建
读取配置
\think\Config::get('配置参数');
config('配置参数');
判断是否存在某个设置:
\think\Config::has('配置参数名');
或者
config('?配置参数名');
读取二级配置,可以使用:
echo \think\Config::get('配置参数.二级参数');
//或者
echo config('配置参数.二级参数');
用Config 的set方法动态设置参数,如:
\think\Config::set('配置参数','配置值');
// 或者使用助手函数
config('配置参数','配置值');
批量设置,如:
\think\Config::set([
'配置参数1'=>'配置值',
'配置参数2'=>'配置值'
]);
// 或者使用助手函数
config([
'配置参数1'=>'配置值',
'配置参数2'=>'配置值'
]);
path_info 方式访问;
http://yourServerName/index.php/应用/控制器/操作/[参数名/参数值...]
url('portal/List/index',['id'=>1,'name'=>'cmf5']);
url('portal/List/index','id=1&name=cmf5');
指定 url 后缀名
url('portal/List/index','id=1&name=cmf5','shtml');
自动生成域名
url('portal/List/index','id=1&name=cmf5','shtml',true);
// 不带后缀名
url('portal/List/index','id=1&name=cmf5',false,true);
控制器模板赋值
// 单个变量赋值
$this->assign("hello", "Hello ThinkCMF Portal!");
// 多个变量批量赋值
$this->assign([
'hello' => 'Hello ThinkCMF Portal!',
'username' => '老猫'
]);
控制器基类的fetch 和display 方法都可以通过参数传入模版变量
方法支持在任何地方使用进行模板变量赋值,如:
\think\View::share('public_name', 'this is a name');
// 或者批量赋值
\think\View::share([
'public_name1' => 'this is a name1',
'public_name2' => 'this is a name2'
]);
fetch 调用方法如下:
1.不带任何参数:
return $this->fetch();
系统会按照默认规则自动定位模板文件,其规则是:
当前主题目录/当前应用/当前控制器(小写+下划线)/当前操作(小写)+.html
2.指定渲染当前控制器下的某个模板文件
return $this->fetch('edit');
模板定位规则是:
当前主题目录/当前应用/当前控制器(小写+下划线)/edit.html
3.指定渲染某个控制器下的某个模板文件
return $this->fetch('UserArticle/list');
模板定位规则是:
当前主题目录/当前应用/user_article/list.html
4.跨模块渲染模板(非特殊情况下这种方法在 cmf 中不推荐使用)
return $this->fetch('portal@UserArticle/list');
模板定位规则是:
当前主题目录/portal/user_article/list.html
5.从视图根目录开始读取模板
return $this->fetch('/list');
或
return $this->fetch(':list');
模板定位规则是:
当前主题目录/当前应用/list.html
注:以上调用方式,控制器和操作并不要求有实际对应的控制器和操作,它只是目录名称和文件名称而已;
6.渲染实际存在的模板文件
return $this->fetch('./themes/home/index.html');
内容渲染
有时你的模板内容可能存在数据库或者其它地方,需要直接解析内容,而不用通过模板文件,这时就可以使用控制器的 display 方法
$content='你的模板内容';
return $this->display($content);
ThinkPHP的I方法是众多单字母函数中的新成员,其命名来自于英文Input(输入),主要用于更加方便和安全的获取系统输入变量,可以用于任何地方,用法格式如下:
I('变量类型.变量名',['默认值'],['过滤方法'])
依赖注入(也称控制反转)其实本质上是指对类的依赖通过构造器完成自动注入。
依赖注入通过构造器自动注入对象、属性、数组等。
array_merge()合并两个数组
A(“[模块/]控制器标志”) 实例化控制器对象
R([模块/]控制器标志/操作方法) 实例化对象同时调用指定方法
实例化Model的三种方式:
$goods = new 命名空间GoodsModel();
$goods = D(‘模型标志’);
$obj = M();
find()如果我们查询的结果只有一个信息,使用select()会返回一个二维数组
目录安全文件
为了避免某些服务器开启了目录浏览权限后可以直接在浏览器输入URL地址查看目录,系统默认开启了目录安全文件机制,会在自动生成目录的时候生成空白的index.html文件
define('DIR_SECURE_FILENAME', 'index.html');
如果你的环境足够安全,不希望生成目录安全文件,可以在入口文件里面关闭目录安全文件的生成
define('BUILD_DIR_SECURE', false);
ThinkPHP框架中所有配置文件的定义格式均采用返回PHP数组的方式
配置参数不区分大小写(因为无论大小写定义都会转换成小写)
在ThinkPHP中,一般来说应用的配置文件是自动加载的,加载的顺序是
- 惯例配置->应用配置->模式配置->调试配置->状态配置->模块配置->扩展配置->动态配置
框架内置有一个惯例配置文件(位于ThinkPHP/Conf/convention.php),按照大多数的使用对常用参数进行了默认配置
应用配置文件也就是调用所有模块之前都会首先加载的公共配置文件(默认位于Application/Common/Conf/config.php)
模式配置
Application/Common/Conf/config_应用模式名称.php(仅在运行该模式下面才会加载)
如果开启调试模式的话,则会自动加载框架的调试配置文件(位于ThinkPHP/Conf/debug.php)和应用调试配置文件(位于Application/Common/Conf/debug.php)
状态配置
define('APP_STATUS','office')
那么就会自动加载该状态对应的配置文件(位于Application/Common/Conf/office.php)
每个模块会自动加载自己的配置文件(位于Application/当前模块名/Conf/config.php)
读取配置
获取已经设置的参数值:C('参数名称')
如果url_model尚未存在设置,则返回NULL
- //获取用户配置中的用户类型设置
- C('USER_CONFIG.USER_TYPE');
http://serverName/index.php(或者其它应用入口文件)/模块/控制器/操作/[参数名/参数值...]
http://serverName/index.php(或者其它应用入口文件)?s=/模块/控制器/操作/[参数名/参数值...]
创建控制器
php think make:controller index/test
视图输出字符串内容替换
'view_replace_str'
引用其他文件{include file="public/head,public/nav"}
控制器前置操作:
可以为某个或者某些操作指定前置执行的操作方法,设置 beforeActionList属性可以指定某个方法为其他方法的前置操作,数组键名为需要调用的前置方法名,无值的话为当前控制器下所有方法的前置方法。
['except' => '方法名,方法名']
表示这些方法不使用前置方法,
['only' => '方法名,方法名']
表示只有这些方法使用前置方法。
空操作是指系统在找不到指定的操作方法的时候,会定位到空操作(_empty)方法来执行,利用这个机制,我们可以实现错误页面和一些URL的优化。
空控制器的概念是指当系统找不到指定的控制器名称的时候,系统会尝试定位空控制器(Error),利用这个机制我们可以用来定制错误页面和进行URL的优化。
多级控制器
该控制器类的文件位置为:
application/index/controller/one/Blog.php
访问地址可以使用
http://serverName/index.php/index/one.blog/index
如果要在路由定义中使用多级控制器,可以使用:
\think\Route::get('blog/add','index/one.Blog/add');
定义其他分层控制器类,这些分层控制器是不能够被URL访问直接调用到的,只能在访问控制器、模型类的内部,或者视图模板文件中进行调用
$event = \think\Loader::controller('Blog', 'event');
echo $event->update(5); // 输出 update:5
$event = controller('Blog', 'event');
echo $event->update(5); // 输出 update:5
利用分层控制器的机制,我们可以用来实现Widget(其实就是在模板中调用分层控制器)
{:action('Blog/header', '', 'widget')}
{:action('Blog/menu', ['name' => 'think'], 'widget')}
{:widget('Blog/header')}
{:widget('Blog/menu', ['name' => 'think'])}
// 生成index模块的Blog资源控制器
php think make:controller index/Blog
// 获取当前请求的name变量
Request::instance()->param('name');
// 获取当前请求的所有变量(经过过滤)
Request::instance()->param();
// 获取当前请求的所有变量(原始数据)
Request::instance()->param(false);
// 获取当前请求的所有变量(包含上传文件)
Request::instance()->param(true);
input('param.name');
input('param.');
或者
input('name');
input('');
input('get.');
input('post.');
input('request.');
变量后加修饰符
input('get.id/d');
input('post.name/s');
input('post.ids/a');
HTTP请求头信息的名称不区分大小写,并且_会自动转换为-
所以下面的写法都是等效的:
$agent = Request::instance()->header('user-agent');
$agent = Request::instance()->header('User_Agent');
如果你需要在Request请求对象中添加自己的方法,可以使用Request对象的方法注入功能,例如:
// 通过hook方法注入动态方法
Request::hook('user','getUserInfo');
可以动态注入当前Request对象的属性,方法:
// 动态绑定属性
Request::instance()->bind('user',new User);
// 或者使用
Request::instance()->user = new User;
如果你的类库没有使用命名空间,则不支持自动加载,必须使用Loader::import方法先导入文件后才能使用
验证规则支持对表单的令牌验证,首先需要在你的表单里面增加下面隐藏域:
<input type="hidden" name="__token__" value="{$Request.token}" /> 或者{:token()}
如果你的令牌名称不是__token__,则表单需要改为:
<input type="hidden" name="__hash__" value="{$Request.token.__hash__}" /> 或者:{:token('__hash__')}
浙公网安备 33010602011771号