popphp / pop-filter
Pop PHP 框架的 Pop Filter 组件
Requires
- php: >=8.1.0
- popphp/pop-utils: ^2.1.0
Requires (Dev)
- phpunit/phpunit: ^10.0.0
README
概述
pop-filter
是一个组件,用于将过滤回调应用于需要由应用程序的其他区域使用的值。它可以用于输入安全以及一般输入清理。
pop-filter
是 Pop PHP 框架 的一个组件。
安装
使用 Composer 安装 pop-filter
。
composer require popphp/pop-filter
或者,在你的 composer.json 文件中引入它
"require": {
"popphp/pop-filter" : "^4.0.0"
}
快速入门
简单过滤器
如果你想创建一个简单的单个过滤器并使用它来过滤一些值,你可以这样做
$filter = new Pop\Filter\Filter('strip_tags'); $values = [ 'username' => '<b>admin</b>', 'email' => '<a href="mailto:test@test.com">test@test.com</a>' ]; $values = $filter->filter($values);
上面的值已经被过滤并去除了标签
$values = [
'username' => 'admin',
'email' => 'test@test.com'
];
扩展
可过滤特性
组件附带一个名为 Pop\Filter\FilterableTrait
的特性。如果你想将过滤器组件及其功能包含在你的应用程序中,你可以创建一个使用此特性的类。使用它,你的类将能够添加过滤器并调用方法来过滤必要的值。这些过滤器可以是 Pop\Filter\FilterInterface
(例如,Pop\Filter\Filter
)的实例或一个基本的可调用对象。
namespace MyApp\Model use Pop\Filter\FilterableTrait; class User { use FilterableTrait; /** * Filter values * * @param array $values * @return array */ public function filter(array $values) { foreach ($this->filters as $filter) { foreach ($values as $key => $value) { $values[$key] = $filter->filter($value, $key); } } return $values; } }
使用上面的代码,你可以创建一个用户模型,向其添加过滤器并使用它来过滤值
$user = new User(); $user->addFilters([ 'strip_tags', new Pop\Filter\Filter('htmlentities', [ENT_QUOTES, 'UTF-8']), ]); $values = [ 'username' => '<script>"Admin"</script>', 'first_name' => '<b>John\'s</b>', 'last_name' => '<b>Doe</b>' ]; $values = $user->filter($values);
值现在已经被过滤,看起来像这样
$values = [
'username' => '"Admin"',
'first_name' => 'John's',
'last_name' => 'Doe'
];
标签已经被去除,实体已经被转换为 HTML。注意第一个添加的过滤器是可调用的 strip_tags
,第二个添加的过滤器是带有参数的 Pop\Filter\Filter
的实例。
排除
精细控制
在 Pop\Filter\AbstractFilter
类的 filter
方法中,有两个属性可供使用。它们是 excludeByName
和 excludeByType
。使用它们,你可以精细控制实际被过滤的值。例如,如果你不想过滤名为 username
的任何值,你可以这样做
$filter = new Pop\Filter\Filter('strip_tags', null, 'username'); $values = [ 'username' => '<b>admin</b>', 'email' => '<a href="mailto:test@test.com">test@test.com</a>' ]; foreach ($values as $key => $value) { $values[$key] = $filter->filter($value, $key); }
由于上述构造函数中的第三个参数,username
被排除在过滤之外,值看起来像这样
$values = [
'username' => '<b>admin</b>',
'email' => 'test@test.com'
];
过滤器构造函数的第四个参数是 $excludeByType
,这对于一次性排除多个同类型的值非常有用,例如,表单对象中的文本区域。