joomla / input
Joomla 输入包
Requires
- php: ^8.1.0
- joomla/filter: ^3.0
- symfony/deprecation-contracts: ^2|^3
Requires (Dev)
- joomla/test: ^3.0
- phan/phan: ^5.4.2
- phpstan/phpstan: ^1.10.7
- phpunit/phpunit: ^9.5.28
- squizlabs/php_codesniffer: ^3.7.2
This package is auto-updated.
Last update: 2024-09-04 16:52:11 UTC
README
此包包含四个类,分别是Input\Input
及其几个继承自它的子类:Input\Cookie
、Input\Files
和Input\Json
。输入对象通常由应用程序拥有,并作为公共属性显式添加到应用程序类中,如可在Application\AbstractApplication
中找到。
此包的目的是抽象化输入源,以允许通过依赖注入在不同的应用程序和不同的上下文中重用代码。例如,控制器可以直接使用JRequest
检查请求变量。但是,如果有添加携带JSON负载的Web服务的需求,而不是编写一个处理不同输入源的第二个控制器,那么注入一个针对输入源类型的输入对象会更容易。
通过依赖注入使用Input\Input
对象也使得代码更容易测试。
Input\Input
构造函数
与先前的静态使用JRequest
不同,Input\Input
类旨在作为实例化的具体类使用。在众多事情中,这使得对类的测试以及与之耦合的类的测试变得更容易,但也意味着开发人员有更多的灵活性,因为这样可以进行依赖注入。
构造函数接受两个可选的数组参数。第一个是源数据,如果省略或为null,则默认为$_REQUEST
的副本。第二个是一组通用选项数组,其中“filter”是当前唯一支持的选项键。如果省略,Input\Input
将仅使用默认的Filter\Input
实例。
use Joomla\Filter\InputFilter; use Joomla\Input; // Default construction (data comes from $_REQUEST). $input = new Input\Input; // Construction with data injection. $input = new Input\Input(array('foo' => 'bar')); // Construction with a custom filter. $filter = new InputFilter(/* custom settings */); $input = new Input\Input(null, $filter);
用法
Input\Input
类的最常见用法是通过get方法,它大致相当于旧的JRequest::getVar
方法。get方法接受三个参数:一个键名、一个默认值和一个过滤器名称(如果省略,则默认为"cmd")。过滤器名称是Filter\Input
类或构造函数中提供的自定义类支持的任何有效过滤器类型。
set方法也与JRequest::setVar
相同,同样getMethod方法也是如此。
use Joomla\Input; $input = new Input\Input; // Get the "foo" variable from the request. $foo = $input->get('foo'); // If the variable is not available, use a default. $foo = $input->get('foo', 'bar'); // Apply a custom filter to the variable, in this case, get the raw value. $foo = $input->get('body', null, 'raw'); // Explicitly set an input value. $input->set('hidemainmenu', true); // Get the request method used (assuming a web application example), returned in upper case. if ($input->getMethod() == 'POST') { // Do something. }
使用Filter\InputFilter
时,可用的过滤器类型如下
- INT, INTEGER - 匹配第一个有符号整数。
- UINT - 匹配第一个无符号整数。
- FLOAT, DOUBLE - 匹配第一个浮点数。
- BOOL, BOOLEAN - 将值转换为布尔数据类型。
- WORD - 只允许不区分大小写的A-Z和下划线。
- ALNUM - 只允许不区分大小写的A-Z和数字。
- CMD - 只允许不区分大小写的A-Z、下划线、点和中划线。
- BASE64 - 只允许不区分大小写的A-Z、正斜杠、加号和等号。
- STRING - 返回一个完全解码的字符串。
- HTML - 返回一个包含HTML实体和标签的字符串,受过滤器中的白名单或黑名单约束。
- ARRAY - 返回未应用额外过滤的源数组。
- PATH - 匹配路径的有效字符。
- USERNAME - 从源中删除一组选定的字符(\x00, -, \x1F, \x7F, <, >, ", ', %, &)。
- RAW - 返回未过滤的原始字符串
如果没有指定过滤器类型,Filter\Input
的默认处理方式是返回一个经过积极清洗和裁剪的字符串,去除了任何 HTML 或编码字符。
此外,还有魔法获取器作为特定过滤器类型的快捷方式。
use Joomla\Input; $input = new Input\Input; // Apply the "INT" filter type. $id = $input->getInt('id'); // Apply the "WORD" filter type. $folder = $input->getWord('folder', 'images'); // Apply the "USERNAME" filter. $ntLogin = $input->getUsername('login'); // Using an unknown filter. It works, but is treated the same as getString. $foo = $input->getFoo('foo');
该类还支持一个魔法获取方法,允许您快速访问其他超全局变量,如 $_POST
等,但以 Input\Input
对象的形式返回。
use Joomla\Input; $input = new Input\Input; // Get the $_POST superglobal. $post = $input->post; // Access a server setting as if it's a Input\Input object. if ($input->server->get('SERVER_ADDR')) { // Do something with the IP address. } // Access an ENV variable. $host = $input->env->get('HOSTNAME');
序列化
Input\Input
类实现了 Serializable
接口,因此它可以安全地进行序列化和反序列化。注意,在序列化时,会从类中移除 "ENV" 和 "SERVER" 输入,因为它们在反序列化过程中可能冲突或不恰当地覆盖设置。这允许 Input\Input
对象安全地与缓存数据一起使用。
Input\Cookie
您能帮助改进这部分 README 吗?
Input\Files
Input\Files
类提供了一种处理 POST 表单有效负载中文件附件的方法。考虑以下表单,它假定要处理要附加的文件数组(通过某些 JavaScript 行为)
<form method="POST" action="/files" enctype="multipart/form-data"> Attachments: <input type="file" name="attachments[]" /> <button>Add another file</button> </form>
可以从请求中访问文件,如下所示
use Joomla\Input; // By default, a new Input\Files will inspect $_FILES. $input = new Input\Files; $files = $input->get('attachments'); echo 'Inspecting $_FILES:'; var_dump($_FILES); echo 'Inspecting $files:'; var_dump($files);
Inspecting $_FILES:
array
'name' =>
array
0 => string 'aje_sig_small.png' (length=17)
1 => string '' (length=0)
'type' =>
array
0 => string 'image/png' (length=9)
1 => string '' (length=0)
'tmp_name' =>
array
0 => string '/private/var/tmp/phpPfGfnN' (length=26)
1 => string '' (length=0)
'error' =>
array
0 => int 0
1 => int 4
'size' =>
array
0 => int 16225
1 => int 0
Inspecting $files:
array
0 =>
array
'name' => string 'sig_small.png' (length=17)
'type' => string 'image/png' (length=9)
'tmp_name' => string '/private/var/tmp/phpybKghO' (length=26)
'error' => int 0
'size' => int 16225
1 =>
array
'name' => string '' (length=0)
'type' => string '' (length=0)
'tmp_name' => string '' (length=0)
'error' => int 4
'size' => int 0
与 PHP 的 $_FILES
超全局变量不同,这个数组更容易解析。上面的例子假设提交了两个文件,但只指定了一个。'空白'文件包含一个错误代码(请参阅 PHP 文件上传错误)。
在 Input\Files
中禁用了 set
方法。
Input\Json
您能帮助改进这部分 README 吗?
模拟 Input 包
对于只需要模拟 Input\Input
类的简单情况,可以使用以下代码片段
$mockInput = $this->getMockBuilder('Joomla\Input\Input')->getMock();
1.x 版本以来的更改
自 1.x 版本以来,对 Input
包进行了以下更改。
按引用传递
在 1.x 版本中,Input
、Input\Cookie
和 Input\Files
都使用源超全局变量按引用。在 2.0 版本中,引用已被移除。
通过 Composer 安装
将 "joomla/input": "~2.0"
添加到 composer.json 中的 require 块,然后运行 composer install
。
{ "require": { "joomla/input": "~2.0" } }
或者,您可以直接从命令行运行以下命令
composer require joomla/input "~2.0"
如果您想包含测试源,请使用
composer require --prefer-source joomla/input "~2.0"