1 关注者

类 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',
    // ...
]

有关响应的更多详细信息和使用信息,请参阅 响应指南文章

公共属性

隐藏继承属性

属性 类型 描述 定义于
$acceptMimeType string 请求 ACCEPT 标头中为此响应选择的 MIME 类型(例如 application/json)。 yii\web\Response
$acceptParams array 所选 MIME 类型 关联的参数(例如 ['q' => 1, 'version' => '1.0'])。 yii\web\Response
$behaviors yii\base\Behavior[] 附加到此组件的行为列表。 yii\base\Component
$charset string|null 文本响应的字符集。 yii\web\Response
$content string|null 响应内容。 yii\web\Response
$cookies yii\web\CookieCollection Cookie 集合。 yii\web\Response
$data mixed 原始响应数据。 yii\web\Response
$downloadHeaders string 附件文件名。 yii\web\Response
$exitStatus integer 退出状态。 yii\base\Response
$format string 响应格式。 yii\web\Response
$formatters array 用于将数据转换为指定$format 的响应内容的格式化器。 yii\web\Response
$headers yii\web\HeaderCollection 标头集合。 yii\web\Response
$httpStatuses array HTTP 状态码及其对应文本的列表 yii\web\Response
$isClientError boolean 此响应是否指示客户端错误。 yii\web\Response
$isEmpty boolean 此响应是否为空。 yii\web\Response
$isForbidden boolean 此响应是否指示当前请求被禁止。 yii\web\Response
$isInformational boolean 此响应是否为信息性响应。 yii\web\Response
$isInvalid boolean 此响应是否具有有效的$statusCode yii\web\Response
$isNotFound boolean 此响应是否指示当前请求的资源未找到。 yii\web\Response
$isOk boolean 此响应是否正常。 yii\web\Response
$isRedirection boolean 此响应是否为重定向。 yii\web\Response
$isSent boolean 响应是否已发送。 yii\web\Response
$isServerError boolean 此响应是否指示服务器错误。 yii\web\Response
$isSuccessful boolean 此响应是否成功。 yii\web\Response
$statusCode integer 要与响应一起发送的 HTTP 状态码。 yii\web\Response
$statusCodeByException Throwable 异常对象。 yii\web\Response
$statusText string 与状态码一起出现的 HTTP 状态描述。 yii\web\Response
$stream resource|array|callable 要发送的流。 yii\web\Response
$version string|null 要使用的 HTTP 协议版本。 yii\web\Response

公共方法

隐藏继承方法

方法 描述 定义于
__call() 调用不是类方法的命名方法。 yii\base\Component
__clone() 此方法在通过克隆现有对象创建对象后调用。 yii\base\Component
__construct() 构造函数。 yii\base\BaseObject
__get() 返回组件属性的值。 yii\base\Component
__isset() 检查属性是否已设置,即已定义且不为 null。 yii\base\Component
__set() 设置组件属性的值。 yii\base\Component
__unset() 将组件属性设置为 null。 yii\base\Component
attachBehavior() 将行为附加到此组件。 yii\base\Component
attachBehaviors() 将行为列表附加到组件。 yii\base\Component
behaviors() 返回此组件应表现为的行为列表。 yii\base\Component
canGetProperty() 返回一个值,指示属性是否可以读取。 yii\base\Component
canSetProperty() 返回一个值,指示属性是否可以设置。 yii\base\Component
className() 返回此类的完全限定名称。 yii\base\BaseObject
clear() 清除响应的标头、Cookie、内容、状态码。 yii\web\Response
clearOutputBuffers() 删除所有现有的输出缓冲区。 yii\base\Response
detachBehavior() 从组件中分离行为。 yii\base\Component
detachBehaviors() 从组件中分离所有行为。 yii\base\Component
ensureBehaviors() 确保在behaviors() 中声明的行为附加到此组件。 yii\base\Component
getBehavior() 返回命名的行为对象。 yii\base\Component
getBehaviors() 返回附加到此组件的所有行为。 yii\base\Component
getCookies() 返回 Cookie 集合。 yii\web\Response
getHeaders() 返回标头集合。 yii\web\Response
getIsClientError() yii\web\Response
getIsEmpty() yii\web\Response
getIsForbidden() yii\web\Response
getIsInformational() yii\web\Response
getIsInvalid() yii\web\Response
getIsNotFound() yii\web\Response
getIsOk() yii\web\Response
getIsRedirection() yii\web\Response
getIsServerError() yii\web\Response
getIsSuccessful() yii\web\Response
getStatusCode() yii\web\Response
hasEventHandlers() 返回一个值,指示是否有名为事件的事件有任何处理程序附加到事件。 yii\base\Component
hasMethod() 返回一个值,指示是否定义了方法。 yii\base\Component
hasProperty() 返回一个值,指示是否为该组件定义了属性。 yii\base\Component
init() 初始化此组件。 yii\web\Response
off() 从该组件中分离现有的事件处理程序。 yii\base\Component
on() 将事件处理程序附加到事件。 yii\base\Component
redirect() 将浏览器重定向到指定的 URL。 yii\web\Response
refresh() 刷新当前页面。 yii\web\Response
send() 将响应发送到客户端。 yii\web\Response
sendContentAsFile() 将指定内容作为文件发送到浏览器。 yii\web\Response
sendFile() 将文件发送到浏览器。 yii\web\Response
sendStreamAsFile() 将指定流作为文件发送到浏览器。 yii\web\Response
setDownloadHeaders() 为文件下载目的设置一组默认的 HTTP 标头。 yii\web\Response
setStatusCode() 设置响应状态码。 yii\web\Response
setStatusCodeByException() 根据异常设置响应状态码。 yii\web\Response
trigger() 触发事件。 yii\base\Component
xSendFile() 使用 x-sendfile 将现有文件作为下载发送到浏览器。 yii\web\Response

保护方法

隐藏继承方法

方法 描述 定义于
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

属性详情

隐藏继承属性

$acceptMimeType 公共属性

来自请求 ACCEPT 头部的 MIME 类型(例如 application/json),用于此响应。此属性主要由 yii\filters\ContentNegotiator 设置。

public string $acceptMimeType null
$acceptParams 公共属性

选定的 MIME 类型 关联的参数(例如 ['q' => 1, 'version' => '1.0'])。这是一个与 $acceptMimeType 关联的名称-值对列表,来自 ACCEPT HTTP 头部。此属性主要由 yii\filters\ContentNegotiator 设置。

public array $acceptParams = []
$charset 公共属性

文本响应的字符集。如果未设置,它将使用 yii\web\Application::$charset 的值。

public string|null $charset null
$content 公共属性

响应内容。当 $data 不为空时,它将根据 $format 转换为 $content,当响应被发送出去时。

另见 $data

public string|null $content null
$cookies 公共属性

Cookie 集合。

$data 公共属性

原始响应数据。当此属性不为空时,它将根据 $format 转换为 $content,当响应被发送出去时。

另见 $content

public mixed $data null
$downloadHeaders 公共属性

附件文件名。

public string $downloadHeaders null
$format 公共属性

响应格式。这决定了如何将 $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

public string $format self::FORMAT_HTML
$formatters 公共属性

用于将数据转换为指定 $format 的响应内容的格式化程序。数组键是格式名称,数组值是创建格式化程序对象的相应配置。

另见

public array $formatters = []
$headers 公共属性

标头集合。

$httpStatuses 公共静态属性

HTTP 状态码及其对应文本的列表

public static array $httpStatuses = [
    
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',
]
$isClientError 公共属性

此响应是否指示客户端错误。

public boolean $isClientError null
$isEmpty 公共属性

此响应是否为空。

public boolean $isEmpty null
$isForbidden 公共属性

此响应是否指示当前请求被禁止。

public boolean $isForbidden null
$isInformational 公共属性

此响应是否为信息性响应。

public boolean $isInformational null
$isInvalid 公共属性

此响应是否具有有效的$statusCode

public boolean $isInvalid null
$isNotFound 公共属性

此响应是否指示当前请求的资源未找到。

public boolean $isNotFound null
$isOk 公共属性

此响应是否正常。

public boolean $isOk null
$isRedirection 公共属性

此响应是否为重定向。

public boolean $isRedirection null
$isSent 公共属性

响应是否已发送。如果为真,则调用 send() 将不会执行任何操作。

public boolean $isSent false
$isServerError 公共属性

此响应是否指示服务器错误。

public boolean $isServerError null
$isSuccessful 公共属性

此响应是否成功。

public boolean $isSuccessful null
$statusCode 公共属性

要与响应一起发送的 HTTP 状态码。

public integer $statusCode null
$statusCodeByException 公共属性

异常对象。

$statusText 公共属性

与状态码一起出现的 HTTP 状态描述。

另请参阅 $httpStatuses.

public string $statusText 'OK'
$stream 公共属性

要发送的流。可以是流句柄或流句柄数组,起始位置和结束位置。或者,它可以设置为可调用对象,该对象返回(或生成)一个字符串数组,这些字符串应该逐个回显并刷新。

请注意,当设置此属性时,$data$content 属性将被 send() 忽略。

$version 公共属性

要使用的 HTTP 协议版本。如果未设置,它将通过 $_SERVER['SERVER_PROTOCOL'] 确定,如果不可用,则为 '1.1'。

public string|null $version null

方法详情

隐藏继承方法

__call() 公共方法

定义于: 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()");
}

            
__clone() 公共方法

定义于: yii\base\Component::__clone()

此方法在通过克隆现有对象创建对象后调用。

它会移除所有行为,因为它们已附加到旧对象。

public void __clone ( )

                public function __clone()
{
    $this->_events = [];
    $this->_eventWildcards = [];
    $this->_behaviors = null;
}

            
__construct() 公共方法

定义于: 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();
}

            
__get() 公共方法

定义于: 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);
}

            
__isset() 公共方法

定义于: yii\base\Component::__isset()

检查属性是否已设置,即已定义且不为 null。

此方法将按以下顺序检查并相应地执行

  • 由 setter 定义的属性:返回属性是否已设置
  • 行为的属性:返回属性是否已设置
  • 对于不存在的属性,返回 false

不要直接调用此方法,因为它是一个 PHP 魔术方法,在执行 isset($component->property) 时会隐式调用。

另请参阅 https://php.ac.cn/manual/en/function.isset.php.

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;
}

            
__set() 公共方法

定义于: 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);
}

            
__unset() 公共方法

定义于: yii\base\Component::__unset()

将组件属性设置为 null。

此方法将按以下顺序检查并相应地执行

  • 由 setter 定义的属性:将属性值设置为 null
  • 行为的属性:将属性值设置为 null

不要直接调用此方法,因为它是一个 PHP 魔术方法,在执行 unset($component->property) 时会隐式调用。

另请参阅 https://php.ac.cn/manual/en/function.unset.php.

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);
}

            
attachBehavior() 公共方法

定义于: 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);
}

            
attachBehaviors() 公共方法

定义于: 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);
    }
}

            
behaviors() 公共方法

定义于: 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 [];
}

            
canGetProperty() 公共方法

定义于: 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;
}

            
canSetProperty() 公共方法

定义于: 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;
}

            
className() 公共静态方法
自 2.0.14 起已弃用。在 PHP >=5.5 上,请使用 ::class 代替。

定义于: yii\base\BaseObject::className()

返回此类的完全限定名称。

public static string className ( )
return string

此类的完全限定名称。

                public static function className()
{
    return get_called_class();
}

            
clear() 公共方法

清除响应的标头、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;
}

            
clearOutputBuffers() 公共方法

定义于: 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();
        }
    }
}

            
defaultFormatters() 受保护的方法

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,
        ],
    ];
}

            
detachBehavior() 公共方法

定义于: yii\base\Component::detachBehavior()

从组件中分离行为。

将调用行为的 yii\base\Behavior::detach() 方法。

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;
}

            
detachBehaviors() 公共方法

定义于: yii\base\Component::detachBehaviors()

从组件中分离所有行为。

public void detachBehaviors ( )

                public function detachBehaviors()
{
    $this->ensureBehaviors();
    foreach ($this->_behaviors as $name => $behavior) {
        $this->detachBehavior($name);
    }
}

            
ensureBehaviors() 公共方法

定义于: 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);
        }
    }
}

            
getBehavior() 公共方法

定义于: 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;
}

            
getBehaviors() 公共方法

定义于: yii\base\Component::getBehaviors()

返回附加到此组件的所有行为。

public yii\base\Behavior[] getBehaviors ( )
return yii\base\Behavior[]

附加到此组件的行为列表

                public function getBehaviors()
{
    $this->ensureBehaviors();
    return $this->_behaviors;
}

            
getCookies() 公共方法

返回 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;
}

            
getDispositionHeaderValue() 受保护的方法 (自版本 2.0.10 起可用)

返回可安全用于旧浏览器和新浏览器的 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;
}

            
getHeaders() 公共方法

返回标头集合。

标头集合包含当前注册的 HTTP 标头。

公共 yii\web\HeaderCollection getHeaders ( )
return yii\web\HeaderCollection

标头集合

                public function getHeaders()
{
    if ($this->_headers === null) {
        $this->_headers = new HeaderCollection();
    }
    return $this->_headers;
}

            
getHttpRange() 受保护方法

确定请求中给出的 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() 公共方法

公共 布尔值 getIsClientError ( )
return boolean

此响应是否指示客户端错误

                public function getIsClientError()
{
    return $this->getStatusCode() >= 400 && $this->getStatusCode() < 500;
}

            
getIsEmpty() 公共方法

公共 布尔值 getIsEmpty ( )
return boolean

此响应是否为空

                public function getIsEmpty()
{
    return in_array($this->getStatusCode(), [201, 204, 304]);
}

            
getIsForbidden() 公共方法

公共 布尔值 getIsForbidden ( )
return boolean

此响应是否指示当前请求被禁止

                public function getIsForbidden()
{
    return $this->getStatusCode() == 403;
}

            
getIsInformational() 公共方法

公共 布尔值 getIsInformational ( )
return boolean

此响应是否为信息性

                public function getIsInformational()
{
    return $this->getStatusCode() >= 100 && $this->getStatusCode() < 200;
}

            
getIsInvalid() 公共方法

公共 布尔值 getIsInvalid ( )
return boolean

此响应是否具有有效的$statusCode

                public function getIsInvalid()
{
    return $this->getStatusCode() < 100 || $this->getStatusCode() >= 600;
}

            
getIsNotFound() 公共方法

公共 布尔值 getIsNotFound ( )
return boolean

此响应是否指示当前请求的资源未找到

                public function getIsNotFound()
{
    return $this->getStatusCode() == 404;
}

            
getIsOk() 公共方法

公共 布尔值 getIsOk ( )
return boolean

此响应是否正常

                public function getIsOk()
{
    return $this->getStatusCode() == 200;
}

            
getIsRedirection() 公共方法

公共 布尔值 getIsRedirection ( )
return boolean

此响应是否为重定向

                public function getIsRedirection()
{
    return $this->getStatusCode() >= 300 && $this->getStatusCode() < 400;
}

            
getIsServerError() 公共方法

公共 布尔值 getIsServerError ( )
return boolean

此响应是否指示服务器错误

                public function getIsServerError()
{
    return $this->getStatusCode() >= 500 && $this->getStatusCode() < 600;
}

            
getIsSuccessful() 公共方法

公共 布尔值 getIsSuccessful ( )
return boolean

此响应是否成功

                public function getIsSuccessful()
{
    return $this->getStatusCode() >= 200 && $this->getStatusCode() < 300;
}

            
getStatusCode() 公共方法

公共 整数 getStatusCode ( )
return integer

要与响应一起发送的 HTTP 状态码。

                public function getStatusCode()
{
    return $this->_statusCode;
}

            
hasEventHandlers() 公共方法

定义于: 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);
}

            
hasMethod() 公共方法

定义于: 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;
}

            
hasProperty() 公共方法

定义于: 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);
}

            
init() 公共方法

初始化此组件。

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);
}

            
off() 公共方法

定义于: 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;
}

            
on() 公共方法

定义于: yii\base\Component::on()

将事件处理程序附加到事件。

事件处理程序必须是有效的 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]);
    }
}

            
prepare() 受保护方法

准备发送响应。

默认实现将 $data 转换为 $content 并相应地设置头信息。

另见

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().');
        }
    }
}

            
redirect() 公共方法

将浏览器重定向到指定的 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 的字符串(例如 "https://example.com")
  • 表示 URL 别名的字符串(例如 "@example.com")
  • 格式为 [$route, ...name-value pairs...] 的数组(例如 ['site/index', 'ref' => 1])。请注意,该路由是相对于整个应用程序而言,而不是相对于控制器或模块而言。yii\helpers\Url::to() 将用于将该数组转换为 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,则将发送一个 Location 头,当作为 AJAX/PJAX 响应接收时,可能不会导致浏览器重定向。仅在请求头 X-Ie-Redirect-Compatibility 缺失时生效。

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;
}

            
refresh() 公共方法

刷新当前页面。

此方法调用的效果与用户按下其浏览器的刷新按钮(不重新发布数据)相同。

在控制器动作中,您可以像这样使用此方法

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);
}

            
send() 公共方法

将响应发送到客户端。

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;
}

            
sendContent() 受保护方法

将响应内容发送到客户端。

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);
    }
}

            
sendContentAsFile() 公共方法

将指定内容作为文件发送到浏览器。

请注意,此方法仅准备用于发送文件的响应。在显式或隐式调用 send() 之前,文件不会被发送。在您从控制器操作返回后,会隐式调用该方法。

另请参阅 sendFile() 获取示例实现。

public $this sendContentAsFile ( $content, $attachmentName, $options = [] )
$content string

要发送的内容。现有的 $content 将被丢弃。

$attachmentName string

向用户显示的文件名。

$options array

发送文件的其他选项。支持以下选项

  • mimeType: 内容的 MIME 类型。默认为 'application/octet-stream'。
  • inline: 布尔值,指示浏览器是否应在浏览器窗口中打开文件。默认为 false,表示会弹出下载对话框。
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;
}

            
sendCookies() 受保护方法

将 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);
        }
    }
}

            
sendFile() 公共方法

将文件发送到浏览器。

请注意,此方法仅准备用于发送文件的响应。在显式或隐式调用 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,则将从 $filePath 中确定。

$options array

发送文件的其他选项。支持以下选项

  • mimeType: 内容的 MIME 类型。如果未设置,将根据 $filePath 推测。
  • inline: 布尔值,指示浏览器是否应在浏览器窗口中打开文件。默认为 false,表示会弹出下载对话框。
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;
}

            
sendHeaders() 受保护方法

将响应标头发送到客户端。

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();
}

            
sendStreamAsFile() 公共方法

将指定流作为文件发送到浏览器。

请注意,此方法仅准备用于发送文件的响应。在显式或隐式调用 send() 之前,文件不会被发送。在您从控制器操作返回后,会隐式调用该方法。

另请参阅 sendFile() 获取示例实现。

public $this sendStreamAsFile ( $handle, $attachmentName, $options = [] )
$handle 资源

要发送的流的句柄。

$attachmentName string

向用户显示的文件名。

$options array

发送文件的其他选项。支持以下选项

  • mimeType: 内容的 MIME 类型。默认为 'application/octet-stream'。
  • inline: 布尔值,指示浏览器是否应在浏览器窗口中打开文件。默认为 false,表示会弹出下载对话框。
  • fileSize: 要流式传输的内容的大小,这在已知内容的大小并且内容不可搜索时非常有用。默认为使用 ftell() 的内容大小。此选项自版本 2.0.4 起可用。
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;
}

            
setDownloadHeaders() 公共方法

为文件下载目的设置一组默认的 HTTP 标头。

public $this setDownloadHeaders ( $attachmentName, $mimeType null, $inline false, $contentLength null )
$attachmentName string

附件文件名

$mimeType string|null

响应的 MIME 类型。如果为 null,则不会设置 Content-Type 标头。

$inline boolean

指示浏览器是否应在浏览器窗口中打开文件。默认为 false,表示会弹出下载对话框。

$contentLength integer|null

正在下载的文件的字节长度。如果为 null,则不会设置 Content-Length 标头。

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;
}

            
setStatusCode() 公共方法

设置响应状态码。

如果 $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;
}

            
setStatusCodeByException() 公共方法 (自版本 2.0.12 起可用)

根据异常设置响应状态码。

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;
}

            
trigger() 公共方法

定义于: yii\base\Component::trigger()

触发事件。

此方法表示事件的发生。它调用事件的所有附加处理程序,包括类级处理程序。

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);
}

            
xSendFile() 公共方法

使用 x-sendfile 将现有文件作为下载发送到浏览器。

X-Sendfile 是一种功能,允许 Web 应用程序将对文件的请求重定向到 Web 服务器,Web 服务器反过来处理该请求,从而无需执行诸如读取文件并将其发送给用户之类的任务。在处理大量文件(或非常大的文件)时,这可以显着提高性能,因为允许 Web 应用程序在 Web 服务器处理请求时提前终止。

请求通过特殊的非标准 HTTP 标头发送到服务器。当 Web 服务器遇到此类标头的存在时,它将丢弃所有输出,并使用 Web 服务器内部机制(包括所有优化,如缓存标头)发送该标头指定的

由于此标头指令是非标准的,因此针对不同的 Web 服务器应用程序存在不同的指令

因此,要使此方法正常工作,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,则将从$filePath中确定。

$options array

发送文件的其他选项。支持以下选项

  • mimeType: 内容的 MIME 类型。如果未设置,将根据 $filePath 推测。
  • inline: 布尔值,指示浏览器是否应在浏览器窗口中打开文件。默认为 false,表示会弹出下载对话框。
  • xHeader: 字符串,x-sendfile 标头的名称。默认为 "X-Sendfile"。
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;
}

            

事件详细信息

隐藏继承属性

EVENT_AFTER_PREPARE 事件类型 yii\base\Event

prepare()send() 中被调用后触发的事件。您可以响应此事件,在响应内容发送到客户端之前对其进行过滤。

EVENT_AFTER_SEND 事件类型 yii\base\Event

send() 结束时触发的事件。

EVENT_BEFORE_SEND 事件类型 yii\base\Event

send() 方法开始时触发的事件。