joomla/input

Joomla 输入包

3.0.0 2023-10-07 21:27 UTC

README

Latest Stable Version Total Downloads Latest Unstable Version License

此包包含四个类,分别是Input\Input及其几个继承自它的子类:Input\CookieInput\FilesInput\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 版本中,InputInput\CookieInput\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"