类 yii\web\Response
继承关系 | yii\web\Response » yii\base\Response » yii\base\Component » yii\base\BaseObject |
---|---|
实现接口 | yii\base\Configurable |
可用版本 | 2.0 |
源代码 | https://github.com/yiisoft/yii2/blob/master/framework/web/Response.php |
Web 响应类表示一个 HTTP 响应。
它包含要发送给客户端的$headers、$cookies 和 $content。它还控制 HTTP 状态码。
响应默认情况下在yii\web\Application 中配置为应用程序组件。可以通过 Yii::$app->response
访问该实例。
您可以在应用程序配置的 components
下添加一个数组来修改其配置,如下面的示例所示
'response' => [
'format' => yii\web\Response::FORMAT_JSON,
'charset' => 'UTF-8',
// ...
]
有关响应的更多详细信息和使用信息,请参阅 响应指南文章。
公共属性
公共方法
保护方法
方法 | 描述 | 定义于 |
---|---|---|
defaultFormatters() | yii\web\Response | |
getDispositionHeaderValue() | 返回可安全用于旧浏览器和新浏览器的 Content-Disposition 标头值。 | yii\web\Response |
getHttpRange() | 确定请求中给出的 HTTP 范围。 | yii\web\Response |
prepare() | 准备发送响应。 | yii\web\Response |
sendContent() | 将响应内容发送到客户端。 | yii\web\Response |
sendCookies() | 将 Cookie 发送到客户端。 | yii\web\Response |
sendHeaders() | 将响应标头发送到客户端。 | yii\web\Response |
事件
事件 | 类型 | 描述 | 定义于 |
---|---|---|---|
EVENT_AFTER_PREPARE | yii\base\Event | 在send() 中调用prepare() 后触发的事件。 | yii\web\Response |
EVENT_AFTER_SEND | yii\base\Event | 在send() 结束时触发的事件。 | yii\web\Response |
EVENT_BEFORE_SEND | yii\base\Event | 在 send() 方法开始时触发的事件。 | yii\web\Response |
常量
常量 | 值 | 描述 | 定义于 |
---|---|---|---|
FORMAT_HTML | 'html' | yii\web\Response | |
FORMAT_JSON | 'json' | yii\web\Response | |
FORMAT_JSONP | 'jsonp' | yii\web\Response | |
FORMAT_RAW | 'raw' | yii\web\Response | |
FORMAT_XML | 'xml' | yii\web\Response |
属性详情
来自请求 ACCEPT 头部的 MIME 类型(例如 application/json
),用于此响应。此属性主要由 yii\filters\ContentNegotiator 设置。
与 选定的 MIME 类型 关联的参数(例如 ['q' => 1, 'version' => '1.0']
)。这是一个与 $acceptMimeType 关联的名称-值对列表,来自 ACCEPT HTTP 头部。此属性主要由 yii\filters\ContentNegotiator 设置。
文本响应的字符集。如果未设置,它将使用 yii\web\Application::$charset 的值。
响应格式。这决定了如何将 $data 转换为 $content,当后者未设置时。此属性的值必须是 $formatters 数组中声明的键之一。默认情况下,支持以下格式
- FORMAT_RAW: 数据将被视为响应内容,不会进行任何转换。不会添加额外的 HTTP 头部。
- FORMAT_HTML: 数据将被视为响应内容,不会进行任何转换。"Content-Type" 头部将设置为 "text/html"。
- FORMAT_JSON: 数据将被转换为 JSON 格式,"Content-Type" 头部将设置为 "application/json"。
- FORMAT_JSONP: 数据将被转换为 JSONP 格式,"Content-Type" 头部将设置为 "text/javascript"。注意,在这种情况下,
$data
必须是一个包含 "data" 和 "callback" 元素的数组。前者指的是要发送的实际数据,而后者指的是 JavaScript 回调函数的名称。 - FORMAT_XML: 数据将被转换为 XML 格式。有关更多详细信息,请参阅 yii\web\XmlResponseFormatter。
您可以通过配置 $formatters 来自定义格式化过程或支持其他格式。
另见 $formatters。
HTTP 状态码及其对应文本的列表
100 => 'Continue',
101 => 'Switching Protocols',
102 => 'Processing',
118 => 'Connection timed out',
200 => 'OK',
201 => 'Created',
202 => 'Accepted',
203 => 'Non-Authoritative',
204 => 'No Content',
205 => 'Reset Content',
206 => 'Partial Content',
207 => 'Multi-Status',
208 => 'Already Reported',
210 => 'Content Different',
226 => 'IM Used',
300 => 'Multiple Choices',
301 => 'Moved Permanently',
302 => 'Found',
303 => 'See Other',
304 => 'Not Modified',
305 => 'Use Proxy',
306 => 'Reserved',
307 => 'Temporary Redirect',
308 => 'Permanent Redirect',
310 => 'Too many Redirect',
400 => 'Bad Request',
401 => 'Unauthorized',
402 => 'Payment Required',
403 => 'Forbidden',
404 => 'Not Found',
405 => 'Method Not Allowed',
406 => 'Not Acceptable',
407 => 'Proxy Authentication Required',
408 => 'Request Time-out',
409 => 'Conflict',
410 => 'Gone',
411 => 'Length Required',
412 => 'Precondition Failed',
413 => 'Request Entity Too Large',
414 => 'Request-URI Too Long',
415 => 'Unsupported Media Type',
416 => 'Requested range unsatisfiable',
417 => 'Expectation failed',
418 => 'I\'m a teapot',
421 => 'Misdirected Request',
422 => 'Unprocessable entity',
423 => 'Locked',
424 => 'Method failure',
425 => 'Unordered Collection',
426 => 'Upgrade Required',
428 => 'Precondition Required',
429 => 'Too Many Requests',
431 => 'Request Header Fields Too Large',
449 => 'Retry With',
450 => 'Blocked by Windows Parental Controls',
451 => 'Unavailable For Legal Reasons',
500 => 'Internal Server Error',
501 => 'Not Implemented',
502 => 'Bad Gateway or Proxy Error',
503 => 'Service Unavailable',
504 => 'Gateway Time-out',
505 => 'HTTP Version not supported',
507 => 'Insufficient storage',
508 => 'Loop Detected',
509 => 'Bandwidth Limit Exceeded',
510 => 'Not Extended',
511 => 'Network Authentication Required',
]
要发送的流。可以是流句柄或流句柄数组,起始位置和结束位置。或者,它可以设置为可调用对象,该对象返回(或生成)一个字符串数组,这些字符串应该逐个回显并刷新。
方法详情
定义于: yii\base\Component::__call()
调用不是类方法的命名方法。
此方法将检查任何附加的行为是否具有命名方法,如果可用,将执行该方法。
不要直接调用此方法,因为它是当调用未知方法时隐式调用的 PHP 魔术方法。
public mixed __call ( $name, $params ) | ||
$name | string |
方法名 |
$params | array |
方法参数 |
return | mixed |
方法返回值 |
---|---|---|
throws | yii\base\UnknownMethodException |
调用未知方法时 |
public function __call($name, $params)
{
$this->ensureBehaviors();
foreach ($this->_behaviors as $object) {
if ($object->hasMethod($name)) {
return call_user_func_array([$object, $name], $params);
}
}
throw new UnknownMethodException('Calling unknown method: ' . get_class($this) . "::$name()");
}
public void __clone ( ) |
public function __clone()
{
$this->_events = [];
$this->_eventWildcards = [];
$this->_behaviors = null;
}
定义于: yii\base\BaseObject::__construct()
构造函数。
默认实现会做两件事
- 使用给定的配置
$config
初始化对象。 - 调用 init().
如果此方法在子类中被覆盖,建议
- 构造函数的最后一个参数是一个配置数组,就像这里的
$config
一样。 - 在构造函数的末尾调用父类实现。
public void __construct ( $config = [] ) | ||
$config | array |
将用于初始化对象属性的名称-值对 |
public function __construct($config = [])
{
if (!empty($config)) {
Yii::configure($this, $config);
}
$this->init();
}
定义于: yii\base\Component::__get()
返回组件属性的值。
此方法将按以下顺序检查并相应地执行
- 由 getter 定义的属性:返回 getter 的结果
- 行为的属性:返回行为属性的值
不要直接调用此方法,因为它是一个 PHP 魔术方法,在执行 $value = $component->property;
时会隐式调用。
另请参阅 __set().
public mixed __get ( $name ) | ||
$name | string |
属性名称 |
return | mixed |
属性值或行为属性的值 |
---|---|---|
throws | yii\base\UnknownPropertyException |
如果未定义属性 |
throws | yii\base\InvalidCallException |
如果属性是只写。 |
public function __get($name)
{
$getter = 'get' . $name;
if (method_exists($this, $getter)) {
// read property, e.g. getName()
return $this->$getter();
}
// behavior property
$this->ensureBehaviors();
foreach ($this->_behaviors as $behavior) {
if ($behavior->canGetProperty($name)) {
return $behavior->$name;
}
}
if (method_exists($this, 'set' . $name)) {
throw new InvalidCallException('Getting write-only property: ' . get_class($this) . '::' . $name);
}
throw new UnknownPropertyException('Getting unknown property: ' . get_class($this) . '::' . $name);
}
定义于: yii\base\Component::__isset()
检查属性是否已设置,即已定义且不为 null。
此方法将按以下顺序检查并相应地执行
- 由 setter 定义的属性:返回属性是否已设置
- 行为的属性:返回属性是否已设置
- 对于不存在的属性,返回
false
不要直接调用此方法,因为它是一个 PHP 魔术方法,在执行 isset($component->property)
时会隐式调用。
public boolean __isset ( $name ) | ||
$name | string |
属性名称或事件名称 |
return | boolean |
命名属性是否已设置 |
---|
public function __isset($name)
{
$getter = 'get' . $name;
if (method_exists($this, $getter)) {
return $this->$getter() !== null;
}
// behavior property
$this->ensureBehaviors();
foreach ($this->_behaviors as $behavior) {
if ($behavior->canGetProperty($name)) {
return $behavior->$name !== null;
}
}
return false;
}
定义于: yii\base\Component::__set()
设置组件属性的值。
此方法将按以下顺序检查并相应地执行
- 由 setter 定义的属性:设置属性值
- "on xyz" 格式的事件:将处理程序附加到事件 "xyz"
- "as xyz" 格式的行为:附加名为 "xyz" 的行为
- 行为的属性:设置行为属性值
不要直接调用此方法,因为它是一个 PHP 魔术方法,在执行 $component->property = $value;
时会隐式调用。
另请参阅 __get().
public void __set ( $name, $value ) | ||
$name | string |
属性名称或事件名称 |
$value | mixed |
属性值 |
throws | yii\base\UnknownPropertyException |
如果未定义属性 |
---|---|---|
throws | yii\base\InvalidCallException |
如果属性是只读。 |
public function __set($name, $value)
{
$setter = 'set' . $name;
if (method_exists($this, $setter)) {
// set property
$this->$setter($value);
return;
} elseif (strncmp($name, 'on ', 3) === 0) {
// on event: attach event handler
$this->on(trim(substr($name, 3)), $value);
return;
} elseif (strncmp($name, 'as ', 3) === 0) {
// as behavior: attach behavior
$name = trim(substr($name, 3));
$this->attachBehavior($name, $value instanceof Behavior ? $value : Yii::createObject($value));
return;
}
// behavior property
$this->ensureBehaviors();
foreach ($this->_behaviors as $behavior) {
if ($behavior->canSetProperty($name)) {
$behavior->$name = $value;
return;
}
}
if (method_exists($this, 'get' . $name)) {
throw new InvalidCallException('Setting read-only property: ' . get_class($this) . '::' . $name);
}
throw new UnknownPropertyException('Setting unknown property: ' . get_class($this) . '::' . $name);
}
定义于: yii\base\Component::__unset()
将组件属性设置为 null。
此方法将按以下顺序检查并相应地执行
- 由 setter 定义的属性:将属性值设置为 null
- 行为的属性:将属性值设置为 null
不要直接调用此方法,因为它是一个 PHP 魔术方法,在执行 unset($component->property)
时会隐式调用。
public void __unset ( $name ) | ||
$name | string |
属性名称 |
throws | yii\base\InvalidCallException |
如果属性是只读。 |
---|
public function __unset($name)
{
$setter = 'set' . $name;
if (method_exists($this, $setter)) {
$this->$setter(null);
return;
}
// behavior property
$this->ensureBehaviors();
foreach ($this->_behaviors as $behavior) {
if ($behavior->canSetProperty($name)) {
$behavior->$name = null;
return;
}
}
throw new InvalidCallException('Unsetting an unknown or read-only property: ' . get_class($this) . '::' . $name);
}
定义于: yii\base\Component::attachBehavior()
将行为附加到此组件。
此方法将根据给定的配置创建行为对象。之后,行为对象将通过调用 yii\base\Behavior::attach() 方法附加到此组件。
另请参阅 detachBehavior().
public yii\base\Behavior attachBehavior ( $name, $behavior ) | ||
$name | string |
行为的名称。 |
$behavior | string|array|yii\base\Behavior |
行为配置。可以是以下之一
|
return | yii\base\Behavior |
行为对象 |
---|
public function attachBehavior($name, $behavior)
{
$this->ensureBehaviors();
return $this->attachBehaviorInternal($name, $behavior);
}
定义于: yii\base\Component::attachBehaviors()
将行为列表附加到组件。
每个行为都由其名称索引,并且应该是一个 yii\base\Behavior 对象,一个指定行为类的字符串,或者一个用于创建行为的配置数组。
另请参阅 attachBehavior().
public void attachBehaviors ( $behaviors ) | ||
$behaviors | array |
要附加到组件的行为列表 |
public function attachBehaviors($behaviors)
{
$this->ensureBehaviors();
foreach ($behaviors as $name => $behavior) {
$this->attachBehaviorInternal($name, $behavior);
}
}
定义于: yii\base\Component::behaviors()
返回此组件应表现为的行为列表。
子类可以覆盖此方法来指定它们想要表现的行为。
此方法的返回值应该是一个行为对象或配置的数组,由行为名称索引。行为配置可以是指定行为类的字符串,也可以是以下结构的数组
'behaviorName' => [
'class' => 'BehaviorClass',
'property1' => 'value1',
'property2' => 'value2',
]
请注意,行为类必须扩展自 yii\base\Behavior。行为可以使用名称或匿名方式附加。当使用名称作为数组键时,可以使用此名称,行为稍后可以使用 getBehavior() 检索,或者使用 detachBehavior() 分离。匿名行为无法检索或分离。
在此方法中声明的行为将自动附加到组件(按需)。
public array behaviors ( ) | ||
return | array |
行为配置。 |
---|
public function behaviors()
{
return [];
}
定义于: yii\base\Component::canGetProperty()
返回一个值,指示属性是否可以读取。
属性可读,如果
- 该类具有与指定名称关联的 getter 方法(在这种情况下,属性名称不区分大小写);
- 该类具有与指定名称相同的成员变量(当
$checkVars
为 true 时); - 附加的行为具有给定名称的可读属性(当
$checkBehaviors
为 true 时)。
另请参见 canSetProperty().
public boolean canGetProperty ( $name, $checkVars = true, $checkBehaviors = true ) | ||
$name | string |
属性名称 |
$checkVars | boolean |
是否将成员变量视为属性 |
$checkBehaviors | boolean |
是否将行为的属性视为此组件的属性 |
return | boolean |
属性是否可读 |
---|
public function canGetProperty($name, $checkVars = true, $checkBehaviors = true)
{
if (method_exists($this, 'get' . $name) || $checkVars && property_exists($this, $name)) {
return true;
} elseif ($checkBehaviors) {
$this->ensureBehaviors();
foreach ($this->_behaviors as $behavior) {
if ($behavior->canGetProperty($name, $checkVars)) {
return true;
}
}
}
return false;
}
定义于: yii\base\Component::canSetProperty()
返回一个值,指示属性是否可以设置。
属性可写,如果
- 该类具有与指定名称关联的 setter 方法(在这种情况下,属性名称不区分大小写);
- 该类具有与指定名称相同的成员变量(当
$checkVars
为 true 时); - 附加的行为具有给定名称的可写属性(当
$checkBehaviors
为 true 时)。
另请参见 canGetProperty().
public boolean canSetProperty ( $name, $checkVars = true, $checkBehaviors = true ) | ||
$name | string |
属性名称 |
$checkVars | boolean |
是否将成员变量视为属性 |
$checkBehaviors | boolean |
是否将行为的属性视为此组件的属性 |
return | boolean |
属性是否可写 |
---|
public function canSetProperty($name, $checkVars = true, $checkBehaviors = true)
{
if (method_exists($this, 'set' . $name) || $checkVars && property_exists($this, $name)) {
return true;
} elseif ($checkBehaviors) {
$this->ensureBehaviors();
foreach ($this->_behaviors as $behavior) {
if ($behavior->canSetProperty($name, $checkVars)) {
return true;
}
}
}
return false;
}
::class
代替。
定义于: yii\base\BaseObject::className()
返回此类的完全限定名称。
public static string className ( ) | ||
return | string |
此类的完全限定名称。 |
---|
public static function className()
{
return get_called_class();
}
清除响应的标头、Cookie、内容、状态码。
public void clear ( ) |
public function clear()
{
$this->_headers = null;
$this->_cookies = null;
$this->_statusCode = 200;
$this->statusText = 'OK';
$this->data = null;
$this->stream = null;
$this->content = null;
$this->isSent = false;
}
定义于: yii\base\Response::clearOutputBuffers()
删除所有现有的输出缓冲区。
public void clearOutputBuffers ( ) |
public function clearOutputBuffers()
{
// the following manual level counting is to deal with zlib.output_compression set to On
for ($level = ob_get_level(); $level > 0; --$level) {
if (!@ob_end_clean()) {
ob_clean();
}
}
}
protected array defaultFormatters ( ) | ||
return | array |
默认支持的格式化程序 |
---|
protected function defaultFormatters()
{
return [
self::FORMAT_HTML => [
'class' => 'yii\web\HtmlResponseFormatter',
],
self::FORMAT_XML => [
'class' => 'yii\web\XmlResponseFormatter',
],
self::FORMAT_JSON => [
'class' => 'yii\web\JsonResponseFormatter',
],
self::FORMAT_JSONP => [
'class' => 'yii\web\JsonResponseFormatter',
'useJsonp' => true,
],
];
}
public yii\base\Behavior|null detachBehavior ( $name ) | ||
$name | string |
行为的名称。 |
return | yii\base\Behavior|null |
分离的行为。如果行为不存在,则为 null。 |
---|
public function detachBehavior($name)
{
$this->ensureBehaviors();
if (isset($this->_behaviors[$name])) {
$behavior = $this->_behaviors[$name];
unset($this->_behaviors[$name]);
$behavior->detach();
return $behavior;
}
return null;
}
定义于: yii\base\Component::detachBehaviors()
从组件中分离所有行为。
public void detachBehaviors ( ) |
public function detachBehaviors()
{
$this->ensureBehaviors();
foreach ($this->_behaviors as $name => $behavior) {
$this->detachBehavior($name);
}
}
定义于: yii\base\Component::ensureBehaviors()
确保在behaviors() 中声明的行为附加到此组件。
public void ensureBehaviors ( ) |
public function ensureBehaviors()
{
if ($this->_behaviors === null) {
$this->_behaviors = [];
foreach ($this->behaviors() as $name => $behavior) {
$this->attachBehaviorInternal($name, $behavior);
}
}
}
定义于: yii\base\Component::getBehavior()
返回命名的行为对象。
public yii\base\Behavior|null getBehavior ( $name ) | ||
$name | string |
行为名称 |
return | yii\base\Behavior|null |
行为对象,如果行为不存在,则为 null |
---|
public function getBehavior($name)
{
$this->ensureBehaviors();
return isset($this->_behaviors[$name]) ? $this->_behaviors[$name] : null;
}
定义于: yii\base\Component::getBehaviors()
返回附加到此组件的所有行为。
public yii\base\Behavior[] getBehaviors ( ) | ||
return | yii\base\Behavior[] |
附加到此组件的行为列表 |
---|
public function getBehaviors()
{
$this->ensureBehaviors();
return $this->_behaviors;
}
返回 Cookie 集合。
通过返回的 cookie 集合,您可以添加或删除 cookie,如下所示,
// add a cookie
$response->cookies->add(new Cookie([
'name' => $name,
'value' => $value,
]);
// remove a cookie
$response->cookies->remove('name');
// alternatively
unset($response->cookies['name']);
public yii\web\CookieCollection getCookies ( ) | ||
return | yii\web\CookieCollection |
Cookie 集合。 |
---|
public function getCookies()
{
if ($this->_cookies === null) {
$this->_cookies = new CookieCollection();
}
return $this->_cookies;
}
返回可安全用于旧浏览器和新浏览器的 Content-Disposition 标头值。
后备名称
- 如果包含代码小于 32 或大于 126 的非 ASCII 字符,则会导致问题。
- 如果包含 URL 编码的字符(以
%
开头)或%
字符,则会导致问题。一些浏览器将filename="X"
解释为 URL 编码的名称,一些则不会。 - 如果包含路径分隔符字符,如
\
或/
,则会导致问题。 - 由于值用
"
括起来,因此应将其转义为\"
。 - 由于输入可能包含非 ASCII 字符,因此后备是通过音译获得的。
UTF 名称
- 如果包含路径分隔符字符,如
\
或/
,则会导致问题。 - 由于标头仅限 ASCII,因此应进行 URL 编码。
- 如果与回退名称完全匹配,可以省略。
受保护 字符串 getDispositionHeaderValue ( $disposition, $attachmentName ) | ||
$disposition | string | |
$attachmentName | string |
protected function getDispositionHeaderValue($disposition, $attachmentName)
{
$fallbackName = str_replace(
['%', '/', '\\', '"', "\x7F"],
['_', '_', '_', '\\"', '_'],
Inflector::transliterate($attachmentName, Inflector::TRANSLITERATE_LOOSE)
);
$utfName = rawurlencode(str_replace(['%', '/', '\\'], '', $attachmentName));
$dispositionHeader = "{$disposition}; filename=\"{$fallbackName}\"";
if ($utfName !== $fallbackName) {
$dispositionHeader .= "; filename*=utf-8''{$utfName}";
}
return $dispositionHeader;
}
返回标头集合。
标头集合包含当前注册的 HTTP 标头。
公共 yii\web\HeaderCollection getHeaders ( ) | ||
return | yii\web\HeaderCollection |
标头集合 |
---|
public function getHeaders()
{
if ($this->_headers === null) {
$this->_headers = new HeaderCollection();
}
return $this->_headers;
}
确定请求中给出的 HTTP 范围。
受保护 数组|布尔值 getHttpRange ( $fileSize ) | ||
$fileSize | integer |
将用于验证请求的 HTTP 范围的文件的大小。 |
return | 数组|布尔值 |
范围(开始,结束),如果范围请求无效,则为 false。 |
---|
protected function getHttpRange($fileSize)
{
$rangeHeader = Yii::$app->getRequest()->getHeaders()->get('Range', '-');
if ($rangeHeader === '-') {
return [0, $fileSize - 1];
}
if (!preg_match('/^bytes=(\d*)-(\d*)$/', $rangeHeader, $matches)) {
return false;
}
if ($matches[1] === '') {
$start = $fileSize - $matches[2];
$end = $fileSize - 1;
} elseif ($matches[2] !== '') {
$start = $matches[1];
$end = $matches[2];
if ($end >= $fileSize) {
$end = $fileSize - 1;
}
} else {
$start = $matches[1];
$end = $fileSize - 1;
}
if ($start < 0 || $start > $end) {
return false;
}
return [$start, $end];
}
公共 布尔值 getIsClientError ( ) | ||
return | boolean |
此响应是否指示客户端错误 |
---|
public function getIsClientError()
{
return $this->getStatusCode() >= 400 && $this->getStatusCode() < 500;
}
公共 布尔值 getIsEmpty ( ) | ||
return | boolean |
此响应是否为空 |
---|
public function getIsEmpty()
{
return in_array($this->getStatusCode(), [201, 204, 304]);
}
公共 布尔值 getIsForbidden ( ) | ||
return | boolean |
此响应是否指示当前请求被禁止 |
---|
public function getIsForbidden()
{
return $this->getStatusCode() == 403;
}
公共 布尔值 getIsInformational ( ) | ||
return | boolean |
此响应是否为信息性 |
---|
public function getIsInformational()
{
return $this->getStatusCode() >= 100 && $this->getStatusCode() < 200;
}
公共 布尔值 getIsInvalid ( ) | ||
return | boolean |
此响应是否具有有效的$statusCode。 |
---|
public function getIsInvalid()
{
return $this->getStatusCode() < 100 || $this->getStatusCode() >= 600;
}
公共 布尔值 getIsNotFound ( ) | ||
return | boolean |
此响应是否指示当前请求的资源未找到 |
---|
public function getIsNotFound()
{
return $this->getStatusCode() == 404;
}
公共 布尔值 getIsOk ( ) | ||
return | boolean |
此响应是否正常 |
---|
public function getIsOk()
{
return $this->getStatusCode() == 200;
}
公共 布尔值 getIsRedirection ( ) | ||
return | boolean |
此响应是否为重定向 |
---|
public function getIsRedirection()
{
return $this->getStatusCode() >= 300 && $this->getStatusCode() < 400;
}
公共 布尔值 getIsServerError ( ) | ||
return | boolean |
此响应是否指示服务器错误 |
---|
public function getIsServerError()
{
return $this->getStatusCode() >= 500 && $this->getStatusCode() < 600;
}
公共 布尔值 getIsSuccessful ( ) | ||
return | boolean |
此响应是否成功 |
---|
public function getIsSuccessful()
{
return $this->getStatusCode() >= 200 && $this->getStatusCode() < 300;
}
公共 整数 getStatusCode ( ) | ||
return | integer |
要与响应一起发送的 HTTP 状态码。 |
---|
public function getStatusCode()
{
return $this->_statusCode;
}
定义于: yii\base\Component::hasEventHandlers()
返回一个值,指示是否有名为事件的事件有任何处理程序附加到事件。
公共 布尔值 hasEventHandlers ( $name ) | ||
$name | string |
事件名称 |
return | boolean |
事件是否附加了任何处理程序。 |
---|
public function hasEventHandlers($name)
{
$this->ensureBehaviors();
if (!empty($this->_events[$name])) {
return true;
}
foreach ($this->_eventWildcards as $wildcard => $handlers) {
if (!empty($handlers) && StringHelper::matchWildcard($wildcard, $name)) {
return true;
}
}
return Event::hasHandlers($this, $name);
}
定义于: yii\base\Component::hasMethod()
返回一个值,指示是否定义了方法。
方法定义如下
- 该类是否具有指定名称的方法
- 附加的行为是否具有给定名称的方法(当
$checkBehaviors
为 true 时)。
公共 布尔值 hasMethod ( $name, $checkBehaviors = true ) | ||
$name | string |
属性名称 |
$checkBehaviors | boolean |
是否将行为的方法视为此组件的方法 |
return | boolean |
方法是否已定义 |
---|
public function hasMethod($name, $checkBehaviors = true)
{
if (method_exists($this, $name)) {
return true;
} elseif ($checkBehaviors) {
$this->ensureBehaviors();
foreach ($this->_behaviors as $behavior) {
if ($behavior->hasMethod($name)) {
return true;
}
}
}
return false;
}
定义于: yii\base\Component::hasProperty()
返回一个值,指示是否为该组件定义了属性。
属性被定义如果
- 类拥有与指定名称关联的 getter 或 setter 方法(在这种情况下,属性名称不区分大小写);
- 该类具有与指定名称相同的成员变量(当
$checkVars
为 true 时); - 附加的行为具有给定名称的属性(当
$checkBehaviors
为真时)。
另见
public boolean hasProperty ( $name, $checkVars = true, $checkBehaviors = true ) | ||
$name | string |
属性名称 |
$checkVars | boolean |
是否将成员变量视为属性 |
$checkBehaviors | boolean |
是否将行为的属性视为此组件的属性 |
return | boolean |
属性是否被定义 |
---|
public function hasProperty($name, $checkVars = true, $checkBehaviors = true)
{
return $this->canGetProperty($name, $checkVars, $checkBehaviors) || $this->canSetProperty($name, false, $checkBehaviors);
}
初始化此组件。
public void init ( ) |
public function init()
{
if ($this->version === null) {
if (isset($_SERVER['SERVER_PROTOCOL']) && $_SERVER['SERVER_PROTOCOL'] === 'HTTP/1.0') {
$this->version = '1.0';
} else {
$this->version = '1.1';
}
}
if ($this->charset === null) {
$this->charset = Yii::$app->charset;
}
$this->formatters = array_merge($this->defaultFormatters(), $this->formatters);
}
定义于: yii\base\Component::off()
从该组件中分离现有的事件处理程序。
此方法与 on() 相反。
注意:如果为事件名称传递通配符模式,则只删除使用此通配符注册的处理程序,而使用与该通配符匹配的普通名称注册的处理程序将保留。
另请参阅 on()。
public boolean off ( $name, $handler = null ) | ||
$name | string |
事件名称 |
$handler | callable|null |
要删除的事件处理程序。如果它是 null,则将删除附加到该命名事件的所有处理程序。 |
return | boolean |
如果找到并分离了处理程序 |
---|
public function off($name, $handler = null)
{
$this->ensureBehaviors();
if (empty($this->_events[$name]) && empty($this->_eventWildcards[$name])) {
return false;
}
if ($handler === null) {
unset($this->_events[$name], $this->_eventWildcards[$name]);
return true;
}
$removed = false;
// plain event names
if (isset($this->_events[$name])) {
foreach ($this->_events[$name] as $i => $event) {
if ($event[0] === $handler) {
unset($this->_events[$name][$i]);
$removed = true;
}
}
if ($removed) {
$this->_events[$name] = array_values($this->_events[$name]);
return true;
}
}
// wildcard event names
if (isset($this->_eventWildcards[$name])) {
foreach ($this->_eventWildcards[$name] as $i => $event) {
if ($event[0] === $handler) {
unset($this->_eventWildcards[$name][$i]);
$removed = true;
}
}
if ($removed) {
$this->_eventWildcards[$name] = array_values($this->_eventWildcards[$name]);
// remove empty wildcards to save future redundant regex checks:
if (empty($this->_eventWildcards[$name])) {
unset($this->_eventWildcards[$name]);
}
}
}
return $removed;
}
将事件处理程序附加到事件。
事件处理程序必须是有效的 PHP 回调。以下是几个示例
function ($event) { ... } // anonymous function
[$object, 'handleClick'] // $object->handleClick()
['Page', 'handleClick'] // Page::handleClick()
'handleClick' // global function handleClick()
事件处理程序必须使用以下签名定义,
function ($event)
其中 $event
是一个 yii\base\Event 对象,其中包含与事件关联的参数。
从 2.0.14 开始,您可以将事件名称指定为通配符模式
$component->on('event.group.*', function ($event) {
Yii::trace($event->name . ' is triggered.');
});
另请参阅 off()。
public void on ( $name, $handler, $data = null, $append = true ) | ||
$name | string |
事件名称 |
$handler | callable |
事件处理程序 |
$data | mixed |
要传递给事件处理程序的数据,当事件被触发时。当事件处理程序被调用时,可以通过 yii\base\Event::$data 访问此数据。 |
$append | boolean |
是否将新的事件处理程序追加到现有处理程序列表的末尾。如果为 false,则新处理程序将被插入到现有处理程序列表的开头。 |
public function on($name, $handler, $data = null, $append = true)
{
$this->ensureBehaviors();
if (strpos($name, '*') !== false) {
if ($append || empty($this->_eventWildcards[$name])) {
$this->_eventWildcards[$name][] = [$handler, $data];
} else {
array_unshift($this->_eventWildcards[$name], [$handler, $data]);
}
return;
}
if ($append || empty($this->_events[$name])) {
$this->_events[$name][] = [$handler, $data];
} else {
array_unshift($this->_events[$name], [$handler, $data]);
}
}
protected void prepare ( ) | ||
throws | yii\base\InvalidConfigException |
如果指定格式的格式化程序无效或 $format 不受支持 |
---|
protected function prepare()
{
if (in_array($this->getStatusCode(), [204, 304])) {
// A 204/304 response cannot contain a message body according to rfc7231/rfc7232
$this->content = '';
$this->stream = null;
return;
}
if ($this->stream !== null) {
return;
}
if (isset($this->formatters[$this->format])) {
$formatter = $this->formatters[$this->format];
if (!is_object($formatter)) {
$this->formatters[$this->format] = $formatter = Yii::createObject($formatter);
}
if ($formatter instanceof ResponseFormatterInterface) {
$formatter->format($this);
} else {
throw new InvalidConfigException("The '{$this->format}' response formatter is invalid. It must implement the ResponseFormatterInterface.");
}
} elseif ($this->format === self::FORMAT_RAW) {
if ($this->data !== null) {
$this->content = $this->data;
}
} else {
throw new InvalidConfigException("Unsupported response format: {$this->format}");
}
if (is_array($this->content)) {
throw new InvalidArgumentException('Response content must not be an array.');
} elseif (is_object($this->content)) {
if (method_exists($this->content, '__toString')) {
$this->content = $this->content->__toString();
} else {
throw new InvalidArgumentException('Response content must be a string or an object implementing __toString().');
}
}
}
将浏览器重定向到指定的 URL。
此方法在当前响应中添加一个 "Location" 头。请注意,它不会在调用 send() 之前发送头。在控制器动作中,您可以按如下方式使用此方法
return Yii::$app->getResponse()->redirect($url);
在其他地方,如果您想立即发送 "Location" 头,您应该使用以下代码
Yii::$app->getResponse()->redirect($url)->send();
return;
在 AJAX 模式下,这通常不会按预期工作,除非有一些客户端 JavaScript 代码处理重定向。为了帮助实现此目标,此方法将发送一个 "X-Redirect" 头而不是 "Location"。
如果您使用 "yii" JavaScript 模块,它将像上面描述的那样处理 AJAX 重定向。否则,您应该编写以下 JavaScript 代码来处理重定向
$document.ajaxComplete(function (event, xhr, settings) {
var url = xhr && xhr.getResponseHeader('X-Redirect');
if (url) {
window.location = url;
}
});
public $this redirect ( $url, $statusCode = 302, $checkAjax = true ) | ||
$url | string|array |
要重定向到的 URL。可以采用以下格式之一
任何以单个正斜杠 "/" 开头的相对 URL 将通过在前面添加当前请求的主机信息而转换为绝对 URL。 |
$statusCode | integer |
HTTP 状态代码。默认为 302。有关 HTTP 状态代码的详细信息,请参阅 https://tools.ietf.org/html/rfc2616#section-10 |
$checkAjax | boolean |
是否要特别处理 AJAX(和 PJAX)请求。默认为 true,这意味着如果当前请求是 AJAX 或 PJAX 请求,则调用此方法将导致浏览器重定向到给定 URL。如果为 false,则将发送一个 |
return | $this |
响应对象本身 |
---|
public function redirect($url, $statusCode = 302, $checkAjax = true)
{
if (is_array($url) && isset($url[0])) {
// ensure the route is absolute
$url[0] = '/' . ltrim($url[0], '/');
}
$request = Yii::$app->getRequest();
$normalizedUrl = Url::to($url);
if ($normalizedUrl !== null) {
if (preg_match('/\n/', $normalizedUrl)) {
throw new InvalidRouteException('Route with new line character detected "' . $normalizedUrl . '".');
}
if (strncmp($normalizedUrl, '/', 1) === 0 && strncmp($normalizedUrl, '//', 2) !== 0) {
$normalizedUrl = $request->getHostInfo() . $normalizedUrl;
}
}
if ($checkAjax && $request->getIsAjax()) {
if (
in_array($statusCode, [301, 302])
&& preg_match('/Trident\/|MSIE /', (string)$request->userAgent)
) {
$statusCode = 200;
}
if ($request->getIsPjax()) {
$this->getHeaders()->set('X-Pjax-Url', $normalizedUrl);
} else {
$this->getHeaders()->set('X-Redirect', $normalizedUrl);
}
} else {
$this->getHeaders()->set('Location', $normalizedUrl);
}
$this->setStatusCode($statusCode);
return $this;
}
刷新当前页面。
此方法调用的效果与用户按下其浏览器的刷新按钮(不重新发布数据)相同。
在控制器动作中,您可以像这样使用此方法
return Yii::$app->getResponse()->refresh();
public yii\web\Response refresh ( $anchor = '' ) | ||
$anchor | string |
应该附加到重定向 URL 的锚点。默认为空。如果您想指定它,请确保锚点以 '#' 开头。 |
return | yii\web\Response |
响应对象本身 |
---|
public function refresh($anchor = '')
{
return $this->redirect(Yii::$app->getRequest()->getUrl() . $anchor);
}
将响应发送到客户端。
public void send ( ) |
public function send()
{
if ($this->isSent) {
return;
}
$this->trigger(self::EVENT_BEFORE_SEND);
$this->prepare();
$this->trigger(self::EVENT_AFTER_PREPARE);
$this->sendHeaders();
$this->sendContent();
$this->trigger(self::EVENT_AFTER_SEND);
$this->isSent = true;
}
将响应内容发送到客户端。
protected void sendContent ( ) |
protected function sendContent()
{
if ($this->stream === null) {
echo $this->content;
return;
}
// Try to reset time limit for big files
if (!function_exists('set_time_limit') || !@set_time_limit(0)) {
Yii::warning('set_time_limit() is not available', __METHOD__);
}
if (is_callable($this->stream)) {
$data = call_user_func($this->stream);
foreach ($data as $datum) {
echo $datum;
flush();
}
return;
}
$chunkSize = 8 * 1024 * 1024; // 8MB per chunk
if (is_array($this->stream)) {
list($handle, $begin, $end) = $this->stream;
// only seek if stream is seekable
if ($this->isSeekable($handle)) {
fseek($handle, $begin);
}
while (!feof($handle) && ($pos = ftell($handle)) <= $end) {
if ($pos + $chunkSize > $end) {
$chunkSize = $end - $pos + 1;
}
echo fread($handle, $chunkSize);
flush(); // Free up memory. Otherwise large files will trigger PHP's memory limit.
}
fclose($handle);
} else {
while (!feof($this->stream)) {
echo fread($this->stream, $chunkSize);
flush();
}
fclose($this->stream);
}
}
将指定内容作为文件发送到浏览器。
请注意,此方法仅准备用于发送文件的响应。在显式或隐式调用 send() 之前,文件不会被发送。在您从控制器操作返回后,会隐式调用该方法。
另请参阅 sendFile() 获取示例实现。
public $this sendContentAsFile ( $content, $attachmentName, $options = [] ) | ||
$content | string |
要发送的内容。现有的 $content 将被丢弃。 |
$attachmentName | string |
向用户显示的文件名。 |
$options | array |
发送文件的其他选项。支持以下选项
|
return | $this |
响应对象本身 |
---|---|---|
throws | yii\web\RangeNotSatisfiableHttpException |
如果请求的范围无法满足 |
public function sendContentAsFile($content, $attachmentName, $options = [])
{
$headers = $this->getHeaders();
$contentLength = StringHelper::byteLength($content);
$range = $this->getHttpRange($contentLength);
if ($range === false) {
$headers->set('Content-Range', "bytes */$contentLength");
throw new RangeNotSatisfiableHttpException();
}
list($begin, $end) = $range;
if ($begin != 0 || $end != $contentLength - 1) {
$this->setStatusCode(206);
$headers->set('Content-Range', "bytes $begin-$end/$contentLength");
$this->content = StringHelper::byteSubstr($content, $begin, $end - $begin + 1);
} else {
$this->setStatusCode(200);
$this->content = $content;
}
$mimeType = isset($options['mimeType']) ? $options['mimeType'] : 'application/octet-stream';
$this->setDownloadHeaders($attachmentName, $mimeType, !empty($options['inline']), $end - $begin + 1);
$this->format = self::FORMAT_RAW;
return $this;
}
将 Cookie 发送到客户端。
protected void sendCookies ( ) |
protected function sendCookies()
{
if ($this->_cookies === null) {
return;
}
$request = Yii::$app->getRequest();
if ($request->enableCookieValidation) {
if ($request->cookieValidationKey == '') {
throw new InvalidConfigException(get_class($request) . '::cookieValidationKey must be configured with a secret key.');
}
$validationKey = $request->cookieValidationKey;
}
foreach ($this->getCookies() as $cookie) {
$value = $cookie->value;
$expire = $cookie->expire;
if (is_string($expire)) {
$expire = strtotime($expire);
} elseif (interface_exists('\\DateTimeInterface') && $expire instanceof \DateTimeInterface) {
$expire = $expire->getTimestamp();
}
if ($expire === null || $expire === false) {
$expire = 0;
}
if ($expire != 1 && isset($validationKey)) {
$value = Yii::$app->getSecurity()->hashData(serialize([$cookie->name, $value]), $validationKey);
}
if (PHP_VERSION_ID >= 70300) {
setcookie($cookie->name, $value, [
'expires' => $expire,
'path' => $cookie->path,
'domain' => $cookie->domain,
'secure' => $cookie->secure,
'httpOnly' => $cookie->httpOnly,
'sameSite' => !empty($cookie->sameSite) ? $cookie->sameSite : null,
]);
} else {
// Work around for setting sameSite cookie prior PHP 7.3
// https://stackoverflow.com/questions/39750906/php-setcookie-samesite-strict/46971326#46971326
$cookiePath = $cookie->path;
if (!is_null($cookie->sameSite)) {
$cookiePath .= '; samesite=' . $cookie->sameSite;
}
setcookie($cookie->name, $value, $expire, $cookiePath, $cookie->domain, $cookie->secure, $cookie->httpOnly);
}
}
}
将文件发送到浏览器。
请注意,此方法仅准备用于发送文件的响应。在显式或隐式调用 send() 之前,文件不会被发送。在您从控制器操作返回后,会隐式调用该方法。
以下是如何实现一个允许从不可从 Web 访问的目录中请求文件的控制器操作的示例。
public function actionFile($filename)
{
$storagePath = Yii::getAlias('@app/files');
// check filename for allowed chars (do not allow ../ to avoid security issue: downloading arbitrary files)
if (!preg_match('/^[a-z0-9]+\.[a-z0-9]+$/i', $filename) || !is_file("$storagePath/$filename")) {
throw new \yii\web\NotFoundHttpException('The file does not exists.');
}
return Yii::$app->response->sendFile("$storagePath/$filename", $filename);
}
另见
public $this sendFile ( $filePath, $attachmentName = null, $options = [] ) | ||
$filePath | string |
要发送的文件的路径。 |
$attachmentName | string|null |
向用户显示的文件名。如果为 null,则将从 |
$options | array |
发送文件的其他选项。支持以下选项
|
return | $this |
响应对象本身 |
---|
public function sendFile($filePath, $attachmentName = null, $options = [])
{
if (!isset($options['mimeType'])) {
$options['mimeType'] = FileHelper::getMimeTypeByExtension($filePath);
}
if ($attachmentName === null) {
$attachmentName = basename($filePath);
}
$handle = fopen($filePath, 'rb');
$this->sendStreamAsFile($handle, $attachmentName, $options);
return $this;
}
将响应标头发送到客户端。
protected void sendHeaders ( ) |
protected function sendHeaders()
{
if (headers_sent($file, $line)) {
throw new HeadersAlreadySentException($file, $line);
}
if ($this->_headers) {
foreach ($this->getHeaders() as $name => $values) {
$name = str_replace(' ', '-', ucwords(str_replace('-', ' ', $name)));
// set replace for first occurrence of header but false afterwards to allow multiple
$replace = true;
foreach ($values as $value) {
header("$name: $value", $replace);
$replace = false;
}
}
}
$statusCode = $this->getStatusCode();
header("HTTP/{$this->version} {$statusCode} {$this->statusText}");
$this->sendCookies();
}
将指定流作为文件发送到浏览器。
请注意,此方法仅准备用于发送文件的响应。在显式或隐式调用 send() 之前,文件不会被发送。在您从控制器操作返回后,会隐式调用该方法。
另请参阅 sendFile() 获取示例实现。
public $this sendStreamAsFile ( $handle, $attachmentName, $options = [] ) | ||
$handle | 资源 |
要发送的流的句柄。 |
$attachmentName | string |
向用户显示的文件名。 |
$options | array |
发送文件的其他选项。支持以下选项
|
return | $this |
响应对象本身 |
---|---|---|
throws | yii\web\RangeNotSatisfiableHttpException |
如果请求的范围无法满足 |
public function sendStreamAsFile($handle, $attachmentName, $options = [])
{
$headers = $this->getHeaders();
if (isset($options['fileSize'])) {
$fileSize = $options['fileSize'];
} else {
if ($this->isSeekable($handle)) {
fseek($handle, 0, SEEK_END);
$fileSize = ftell($handle);
} else {
$fileSize = 0;
}
}
$range = $this->getHttpRange($fileSize);
if ($range === false) {
$headers->set('Content-Range', "bytes */$fileSize");
throw new RangeNotSatisfiableHttpException();
}
list($begin, $end) = $range;
if ($begin != 0 || $end != $fileSize - 1) {
$this->setStatusCode(206);
$headers->set('Content-Range', "bytes $begin-$end/$fileSize");
} else {
$this->setStatusCode(200);
}
$mimeType = isset($options['mimeType']) ? $options['mimeType'] : 'application/octet-stream';
$this->setDownloadHeaders($attachmentName, $mimeType, !empty($options['inline']), $end - $begin + 1);
$this->format = self::FORMAT_RAW;
$this->stream = [$handle, $begin, $end];
return $this;
}
为文件下载目的设置一组默认的 HTTP 标头。
public $this setDownloadHeaders ( $attachmentName, $mimeType = null, $inline = false, $contentLength = null ) | ||
$attachmentName | string |
附件文件名 |
$mimeType | string|null |
响应的 MIME 类型。如果为 null,则不会设置 |
$inline | boolean |
指示浏览器是否应在浏览器窗口中打开文件。默认为 false,表示会弹出下载对话框。 |
$contentLength | integer|null |
正在下载的文件的字节长度。如果为 null,则不会设置 |
return | $this |
响应对象本身 |
---|
public function setDownloadHeaders($attachmentName, $mimeType = null, $inline = false, $contentLength = null)
{
$headers = $this->getHeaders();
$disposition = $inline ? 'inline' : 'attachment';
$headers->setDefault('Pragma', 'public')
->setDefault('Accept-Ranges', 'bytes')
->setDefault('Expires', '0')
->setDefault('Cache-Control', 'must-revalidate, post-check=0, pre-check=0')
->setDefault('Content-Disposition', $this->getDispositionHeaderValue($disposition, $attachmentName));
if ($mimeType !== null) {
$headers->setDefault('Content-Type', $mimeType);
}
if ($contentLength !== null) {
$headers->setDefault('Content-Length', $contentLength);
}
return $this;
}
设置响应状态码。
如果 $text
为 null,此方法将设置相应的状态文本。
public $this setStatusCode ( $value, $text = null ) | ||
$value | integer |
状态代码 |
$text | string|null |
状态文本。如果未设置,则将根据状态代码自动设置。 |
return | $this |
响应对象本身 |
---|---|---|
throws | yii\base\InvalidArgumentException |
如果状态代码无效。 |
public function setStatusCode($value, $text = null)
{
if ($value === null) {
$value = 200;
}
$this->_statusCode = (int) $value;
if ($this->getIsInvalid()) {
throw new InvalidArgumentException("The HTTP status code is invalid: $value");
}
if ($text === null) {
$this->statusText = isset(static::$httpStatuses[$this->_statusCode]) ? static::$httpStatuses[$this->_statusCode] : '';
} else {
$this->statusText = $text;
}
return $this;
}
根据异常设置响应状态码。
public $this setStatusCodeByException ( $e ) | ||
$e | Throwable |
异常对象。 |
return | $this |
响应对象本身 |
---|---|---|
throws | yii\base\InvalidArgumentException |
如果状态代码无效。 |
public function setStatusCodeByException($e)
{
if ($e instanceof HttpException) {
$this->setStatusCode($e->statusCode);
} else {
$this->setStatusCode(500);
}
return $this;
}
public void trigger ( $name, yii\base\Event $event = null ) | ||
$name | string |
事件名称 |
$event | yii\base\Event|null |
事件实例。如果未设置,将创建一个默认的 yii\base\Event 对象。 |
public function trigger($name, Event $event = null)
{
$this->ensureBehaviors();
$eventHandlers = [];
foreach ($this->_eventWildcards as $wildcard => $handlers) {
if (StringHelper::matchWildcard($wildcard, $name)) {
$eventHandlers[] = $handlers;
}
}
if (!empty($this->_events[$name])) {
$eventHandlers[] = $this->_events[$name];
}
if (!empty($eventHandlers)) {
$eventHandlers = call_user_func_array('array_merge', $eventHandlers);
if ($event === null) {
$event = new Event();
}
if ($event->sender === null) {
$event->sender = $this;
}
$event->handled = false;
$event->name = $name;
foreach ($eventHandlers as $handler) {
$event->data = $handler[1];
call_user_func($handler[0], $event);
// stop further handling if the event is handled
if ($event->handled) {
return;
}
}
}
// invoke class-level attached handlers
Event::trigger($this, $name, $event);
}
使用 x-sendfile 将现有文件作为下载发送到浏览器。
X-Sendfile 是一种功能,允许 Web 应用程序将对文件的请求重定向到 Web 服务器,Web 服务器反过来处理该请求,从而无需执行诸如读取文件并将其发送给用户之类的任务。在处理大量文件(或非常大的文件)时,这可以显着提高性能,因为允许 Web 应用程序在 Web 服务器处理请求时提前终止。
请求通过特殊的非标准 HTTP 标头发送到服务器。当 Web 服务器遇到此类标头的存在时,它将丢弃所有输出,并使用 Web 服务器内部机制(包括所有优化,如缓存标头)发送该标头指定的
由于此标头指令是非标准的,因此针对不同的 Web 服务器应用程序存在不同的指令
- Apache: X-Sendfile
- Lighttpd v1.4: X-LIGHTTPD-send-file
- Lighttpd v1.5: X-Sendfile
- Nginx: X-Accel-Redirect
- Cherokee: X-Sendfile 和 X-Accel-Redirect
因此,要使此方法正常工作,Web 服务器应启用 X-SENDFILE 选项/模块,并应发送正确的 xHeader。
注意
此选项允许下载不在 Web 文件夹中的文件,甚至下载以其他方式受保护的文件(例如 .htaccess
,拒绝所有访问)。
副作用
如果此选项被 Web 服务器禁用,当调用此方法时,将打开一个下载配置对话框,但下载的文件将只有 0 字节。
已知问题
当使用 SSL 连接时,Internet Explorer 6、7 和 8 在使用 X-SENDFILE 时存在一个错误,它将显示类似于以下的错误消息:"Internet Explorer 无法打开此 Internet 网站。请求的网站不可用或无法找到。"。您可以通过删除Pragma
头来解决此问题。
示例
Yii::$app->response->xSendFile('/home/user/Pictures/picture1.jpg');
另请参阅 sendFile().
public $this xSendFile ( $filePath, $attachmentName = null, $options = [] ) | ||
$filePath | string |
包含完整路径的文件名 |
$attachmentName | string|null |
显示给用户的文件名。如果为 null,则将从 |
$options | array |
发送文件的其他选项。支持以下选项
|
return | $this |
响应对象本身 |
---|
public function xSendFile($filePath, $attachmentName = null, $options = [])
{
if ($attachmentName === null) {
$attachmentName = basename($filePath);
}
if (isset($options['mimeType'])) {
$mimeType = $options['mimeType'];
} elseif (($mimeType = FileHelper::getMimeTypeByExtension($filePath)) === null) {
$mimeType = 'application/octet-stream';
}
if (isset($options['xHeader'])) {
$xHeader = $options['xHeader'];
} else {
$xHeader = 'X-Sendfile';
}
$disposition = empty($options['inline']) ? 'attachment' : 'inline';
$this->getHeaders()
->setDefault($xHeader, $filePath)
->setDefault('Content-Type', $mimeType)
->setDefault('Content-Disposition', $this->getDispositionHeaderValue($disposition, $attachmentName));
$this->format = self::FORMAT_RAW;
return $this;
}
注册 或者 登录 发表评论。