ThinkPHP 变量&变量过滤

ThinkPHP变量获取与处理
本文介绍ThinkPHP框架中如何灵活地获取各种类型的输入变量,包括GET、POST等,并提供了安全的数据过滤和验证方法。同时介绍了如何使用修饰符来转换变量类型。

ThinkPHP中传统方式获取变量外,也可以使用thinkphp提供的更加方便和安全的获取系统,输入变量。

I('变量类型.变量名/修饰符',['默认值'],['过滤方法'],['额外数据源'])
变量类型 
get 获取GET参数
post    获取POST参数
param   自动判断请求类型获取GET、POST或者PUT参数
request 获取REQUEST 参数
put 获取PUT 参数
session 获取 $_SESSION 参数
cookie  获取 $_COOKIE 参数
server  获取 $_SERVER 参数
globals 获取 $GLOBALS参数
path    获取 PATHINFO模式的URL参数
data    获取 其他类型的参数,需要配合额外数据源参数

注意:变量类型不区分大小写。 
变量名则严格区分大小写。 
默认值和过滤方法均属于可选参数。

ThinkPHP 获取get post参数:
I(‘get.id’) GET方式
I(‘post.id’) POST方式
I(‘id’) param 自动区分GET POST方法 类似于PHP中的$_REQUEST

I(‘get.’) / I(‘post.’) 返回输入参数的数组集合

I(‘path.1’) I(‘path.2’) 对访问的URL或者传入的GET参数进行分割

I(‘id’,’default_value’);参数2 为默认值设置 如果不填则返回默认值

I(‘id’,’default_value’,’function_name’);参数3为进行验证过滤的方法名字,在变量时数组的情况下会自动使用array_map进行过滤处理,否则会调用PHP内置的filter_var方法进行处理

I('post.email','error email',FILTER_VALIDATE_EMAIL);
FILTER_VALIDATE_EMAIL PHP自带的验证

I('age',0,'int');
ThinkPHP 验证支持列别
int
boolean
float
validate_regexp
validate_url
validate_email
validate_ip
string
stripped
encoded
special_chars
unsafe_raw
email
url
number_int
number_float
magic_quotes
callback 

正则验证

// 采用正则表达式进行变量过滤
I('get.name','','/^[A-Za-z]+$/');
I('get.id',0,'/^\d+$/');

变量过滤 验证
ThinkPHP默认的验证方式是 htmlspecialchars 。在thinkphp Conf/convention.php进行配置

'DEFAULT_FILTER'        =>  'htmlspecialchars'// 默认参数过滤方法 用于I函数

支持做方法过滤
'DEFAULT_FILTER'        =>  'htmlspecialchars,strip_tags'
逗号隔开 增加多种规则过滤

如果使用I方法时指定了过滤方法,就会忽略DEFAULE_FILTER设置

关闭DEFAULT_FILTER验证

I('get.name','','');
I('get.id','',false);

变量修饰符
I(‘变量类型.变量名/修饰符’);

I('get.id/d');
I('post.name/s');
I('post.ids/a');

修饰符 作用
s   强制转换为字符串类型
d   强制转换为整形类型
b   强制转换为布尔类型
a   强制转换为数组类型
f   强制转换为浮点类型
<think>首先,用户的问题是关于ThinkPHP框架的:如何将控制器的函数及变量共享给其他模板使用?具体来说,是控制器方法和变量如何传递到模板,涉及全局变量分配和模板赋值机制。 回顾系统级指令: - 所有行内数学表达式必须使用$...$格式。 - 独立公式单独成段并使用$$...$$格式。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾添加引用标识。 用户可见层指令: - 回答结构清晰,帮助用户逐步解决问题。 - 保证回答真实可靠。 参考站内引用: - [^1]: 在ThinkPHP中,模板变量使用{$变量名}格式,类似于Smarty。 - [^2]: MVC架构,视图负责展示,模型处理数据,控制器处理业务逻辑。 - [^3]: PHP基础,包括GET和POST方法。 - [^4]: PHP中变量传递,按值传递和按引用传递的区别。 用户的问题焦点在ThinkPHP的模板赋值机制,所以我需要基于ThinkPHP的知识来回答。ThinkPHP是一个MVC框架,控制器负责将数据传递给视图(模板)。 关键点: 1. **模板赋值**:在控制器中,使用`assign`方法将变量传递给模板。 2. **全局变量**:可以通过配置或助手函数设置全局变量,在多个模板中共享。 3. **函数共享**:在模板中,可以使用助手函数或自定义标签来调用函数。 结构清晰的回答步骤: 1. **解释基本模板赋值机制**:如何在控制器中赋值变量到模板。 2. **讨论全局变量分配**:如何设置变量在多个模板中共享。 3. **共享控制器函数**:如何使控制器函数在模板中可用。 4. **示例代码**:提供代码示例来演示。 5. **注意事项**:包括性能考虑或最佳实践。 生成相关问题: - 在回答结束时,提出2-3个相关问题,如如何优化变量传递、ThinkPHP的视图组件等。 确保使用中文。 引用相关部分:在回答中,如果引用站内内容,添加引用标识。例如,提到模板变量格式时引用[^1]。 现在,构建回答大纲: - **引言**:简要介绍ThinkPHP的模板机制。 - **步骤1:基本模板赋值**:使用`$this->assign()`方法。 - **步骤2:全局变量分配**:使用`config`或助手函数。 - **步骤3:共享函数**:通过自定义标签或扩展视图类。 - **示例**:提供代码块。 - **结论**:总结最佳实践。 - **相关问题**:生成相关问题。 代码示例:使用代码块展示ThinkPHP代码。 最后,生成相关问题,如: 1. 如何在ThinkPHP中实现模板继承? 2. ThinkPHP变量传递性能如何优化? 3. 如何自定义ThinkPHP模板标签?</think>### ThinkPHP 控制器方法和变量传递到模板的机制 在 ThinkPHP 框架中,控制器负责处理业务逻辑并将数据传递给视图(模板),遵循 MVC 架构模型。视图层通过特定语法展示变量或调用函数[^2]。以下是逐步实现控制器变量和函数共享到模板的方法,基于 ThinkPHP 的模板赋值机制。 #### 1. **基本模板赋值机制** - **控制器中赋值变量**:在控制器方法中,使用 `assign()` 方法将变量传递给模板。变量名在模板中以 `{$变量名}` 格式调用[^1]。 ```php // 控制器示例 (application/index/controller/Index.php) namespace app\index\controller; use think\Controller; class Index extends Controller { public function index() { // 赋值单个变量 $this->assign('time', date('Y-m-d H:i:s')); // 赋值数组 $data = ['name' => 'ThinkPHP', 'version' => '6.0']; $this->assign($data); // 渲染模板 return $this->fetch(); } } ``` - 在模板中,通过 `{$time}` 或 `{$name}` 直接输出变量值[^1]。 - **模板文件调用变量** (如 `application/index/view/index/index.html`): ```html <!DOCTYPE html> <html> <head> <title>示例</title> </head> <body> <p>当前时间:{$time}</p> <p>框架名称:{$name}, 版本:{$version}</p> </body> </html> ``` #### 2. **全局变量分配** - **配置文件设置全局变量**:在 `config/view.php` 中定义全局变量,所有模板均可访问。 ```php // config/view.php return [ 'tpl_replace_string' => [ '__STATIC__' => '/static', ], // 添加全局变量 'tpl_global_vars' => [ 'site_name' => '我的网站', ], ]; ``` - 在模板中直接使用 `{$site_name}`,无需控制器赋值。 - **助手函数全局赋值**:在公共文件(如 `app/common.php`)中使用 `think\facade\View::assign()`。 ```php // app/common.php use think\facade\View; View::assign('global_var', '全局值'); ``` - 所有控制器和模板均可访问 `{$global_var}`。 #### 3. **共享控制器函数** - **在模板中调用函数**:ThinkPHP 模板支持 PHP 函数和自定义助手函数。 - **直接调用 PHP 函数**: ```html <p>格式化时间:{$time|date='Y-m-d'}</p> <!-- 使用过滤器语法 --> ``` - **自定义助手函数**:创建助手函数文件(如 `app/helper.php`),并在模板中调用。 ```php // app/helper.php function formatText($text) { return strtoupper($text); } ``` 模板中调用: ```html <p>处理后的文本:{$name|formatText}</p> ``` - **通过控制器方法共享逻辑**:复杂逻辑应在控制器处理,结果通过变量传递。避免在模板中直接调用控制器方法,以保持视图层简洁[^2]。 #### 4. **性能与最佳实践** - **变量传递优化**:优先按需传递变量,避免在全局配置中加载大量未用数据。按引用传递可提升性能(如 `assign` 默认按值传递,对大对象需谨慎)[^4]。 - **模板继承机制**:使用 `{layout}` 实现模板继承,减少重复赋值。 ```html <!-- 父模板 base.html --> {block name="content"}默认内容{/block} ``` ```html <!-- 子模板 --> {extend name="base"} {block name="content"}子模板内容:{$time}{/block} ``` #### 总结 ThinkPHP 通过 `assign()` 方法实现控制器到模板的变量传递,全局变量可通过配置文件或助手函数设置。函数共享建议使用自定义助手函数或控制器预处理。保持 MVC 分层,确保视图层仅负责展示[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值