クラス 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 |
ウェブレスポンスクラスは、HTTPレスポンスを表します。
クライアントに送信される$headers、$cookies、および$contentを保持します。また、HTTPステータスコードも制御します。
Responseは、デフォルトでyii\web\Applicationでアプリケーションコンポーネントとして構成されています。そのインスタンスには、`Yii::$app->response` を介してアクセスできます。
次の例のように、アプリケーション設定の`components`の下に配列を追加することで、その設定を変更できます。
'response' => [
'format' => yii\web\Response::FORMAT_JSON,
'charset' => 'UTF-8',
// ...
]
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() | クッキーをクライアントに送信します。 | yii\web\Response |
sendHeaders() | レスポンスヘッダーをクライアントに送信します。 | yii\web\Response |
イベント
イベント | 型 | 説明 | 定義元 |
---|---|---|---|
EVENT_AFTER_PREPARE | yii\base\Event | prepare() が send() で呼び出された直後にトリガーされるイベントです。 | 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']`)。これは、ACCEPT HTTPヘッダーからの$acceptMimeTypeに関連付けられた名前と値のペアのリストです。このプロパティは主にyii\filters\ContentNegotiatorによって設定されます。
テキストレスポンスの文字セット。設定されていない場合、yii\web\Application::$charsetの値が使用されます。
レスポンスのフォーマット。これは、$contentが設定されていない場合に$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"の要素を持つ配列である必要があります。"data"は実際に送信されるデータを表し、"callback"はJavaScriptコールバックの名前を表します。
- FORMAT_XML:データはXML形式に変換されます。詳細はyii\web\XmlResponseFormatterを参照してください。
$formattersを構成することで、フォーマット処理をカスタマイズしたり、追加のフォーマットをサポートしたりできます。
$formattersも参照してください。
指定された$formatのレスポンスコンテンツにデータを変換するためのフォーマッタです。配列のキーはフォーマット名、配列の値はフォーマッタオブジェクトを作成するための対応する設定です。
参照
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',
]
このレスポンスが現在のリクエストが禁止されていることを示しているかどうか。
このレスポンスが現在リクエストされたリソースが見つからないことを示しているかどうか。
レスポンスが送信済みかどうかを示します。これがtrueの場合、send()を呼び出しても何も行われません。
ステータスコードとともに表示されるHTTPステータス説明。
$httpStatusesも参照してください。
メソッドの詳細
定義されている場所: yii\base\Component::__call()
クラスメソッドではない名前付きメソッドを呼び出します。
このメソッドは、アタッチされたビヘイビアに指定されたメソッドが存在するかどうかをチェックし、存在する場合は実行します。
これはPHPのマジックメソッドであり、未知のメソッドが呼び出されたときに暗黙的に呼び出されるため、直接呼び出さないでください。
public mixed __call ( $name, $params ) | ||
$name | string |
メソッド名 |
$params | array |
メソッドパラメータ |
戻り値 | mixed |
メソッドの戻り値 |
---|---|---|
例外 | 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()");
}
定義されている場所: yii\base\Component::__clone()
このメソッドは、既存のオブジェクトをクローンしてオブジェクトが作成された後に呼び出されます。
古いオブジェクトにアタッチされているため、すべてのビヘイビアを削除します。
public void __clone ( ) |
public function __clone()
{
$this->_events = [];
$this->_eventWildcards = [];
$this->_behaviors = null;
}
定義されている場所: yii\base\BaseObject::__construct()
コンストラクタ。
デフォルトの実装では、次の2つのことを行います。
- 指定された設定
$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()
コンポーネントプロパティの値を返します。
このメソッドは、次の順序でチェックし、それに応じて動作します。
- ゲッターによって定義されたプロパティ: ゲッターの結果を返す
- ビヘイビアのプロパティ: ビヘイビアのプロパティ値を返す
これはPHPのマジックメソッドであり、$value = $component->property;
を実行したときに暗黙的に呼び出されるため、直接呼び出さないでください。
こちらも参照してください __set().
public mixed __get ( $name ) | ||
$name | string |
プロパティ名 |
戻り値 | mixed |
プロパティ値またはビヘイビアのプロパティの値 |
---|---|---|
例外 | yii\base\UnknownPropertyException |
プロパティが定義されていない場合 |
例外 | 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ではないかどうか)を確認します。
このメソッドは、次の順序でチェックし、それに応じて動作します。
- セッターによって定義されたプロパティ: プロパティが設定されているかどうかを返す
- ビヘイビアのプロパティ: プロパティが設定されているかどうかを返す
- 存在しないプロパティの場合は
false
を返す
これはPHPのマジックメソッドであり、isset($component->property)
を実行したときに暗黙的に呼び出されるため、直接呼び出さないでください。
こちらも参照してください https://www.php.net/manual/en/function.isset.php.
public boolean __isset ( $name ) | ||
$name | string |
プロパティ名またはイベント名 |
戻り値 | 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()
コンポーネントプロパティの値を設定します。
このメソッドは、次の順序でチェックし、それに応じて動作します。
- セッターによって定義されたプロパティ: プロパティ値を設定する
- "on xyz"形式のイベント: "xyz"イベントにハンドラーをアタッチする
- "as xyz"形式のビヘイビア: "xyz"という名前のビヘイビアをアタッチする
- ビヘイビアのプロパティ: ビヘイビアのプロパティ値を設定する
これはPHPのマジックメソッドであり、$component->property = $value;
を実行したときに暗黙的に呼び出されるため、直接呼び出さないでください。
こちらも参照してください __get().
public void __set ( $name, $value ) | ||
$name | string |
プロパティ名またはイベント名 |
$value | mixed |
プロパティ値 |
例外 | yii\base\UnknownPropertyException |
プロパティが定義されていない場合 |
---|---|---|
例外 | 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に設定します。
このメソッドは、次の順序でチェックし、それに応じて動作します。
- セッターによって定義されたプロパティ: プロパティ値をnullに設定する
- ビヘイビアのプロパティ: プロパティ値をnullに設定する
これはPHPのマジックメソッドであり、unset($component->property)
を実行したときに暗黙的に呼び出されるため、直接呼び出さないでください。
こちらも参照してください https://www.php.net/manual/en/function.unset.php.
public void __unset ( $name ) | ||
$name | string |
プロパティ名 |
例外 | 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 |
ビヘイビアの設定。次のいずれかになります。
|
戻り値 | 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 ( ) | ||
戻り値 | array |
ビヘイビアのコンフィグレーション。 |
---|
public function behaviors()
{
return [];
}
定義位置: yii\base\Component::canGetProperty()
プロパティを読み取ることができるかどうかを示す値を返します。
プロパティは、以下の場合に読み取ることができます。
- クラスに指定された名前と関連付けられたゲッターメソッドがある場合(この場合、プロパティ名はケースインセンシティブです)。
- クラスに指定された名前のメンバ変数がある場合(
$checkVars
がtrueの場合)。 - アタッチされたビヘイビアに、指定された名前の読み取り可能なプロパティがある場合(
$checkBehaviors
がtrueの場合)。
こちらも参照してください canSetProperty()。
public boolean canGetProperty ( $name, $checkVars = true, $checkBehaviors = true ) | ||
$name | string |
プロパティ名 |
$checkVars | boolean |
メンバ変数をプロパティとして扱うかどうか |
$checkBehaviors | boolean |
ビヘイビアのプロパティをこのコンポーネントのプロパティとして扱うかどうか |
戻り値 | 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()
プロパティを設定できるかどうかを示す値を返します。
プロパティは、以下の場合に書き込むことができます。
- クラスに指定された名前と関連付けられたセッターメソッドがある場合(この場合、プロパティ名はケースインセンシティブです)。
- クラスに指定された名前のメンバ変数がある場合(
$checkVars
がtrueの場合)。 - アタッチされたビヘイビアに、指定された名前の書き込み可能なプロパティがある場合(
$checkBehaviors
がtrueの場合)。
こちらも参照してください canGetProperty()。
public boolean canSetProperty ( $name, $checkVars = true, $checkBehaviors = true ) | ||
$name | string |
プロパティ名 |
$checkVars | boolean |
メンバ変数をプロパティとして扱うかどうか |
$checkBehaviors | boolean |
ビヘイビアのプロパティをこのコンポーネントのプロパティとして扱うかどうか |
戻り値 | 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 ( ) | ||
戻り値 | 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 ( ) | ||
戻り値 | 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,
],
];
}
定義位置: yii\base\Component::detachBehavior()
コンポーネントから動作をデタッチします。
ビヘイビアのyii\base\Behavior::detach()メソッドが呼び出されます。
public yii\base\Behavior|null detachBehavior ( $name ) | ||
$name | string |
ビヘイビアの名前。 |
戻り値 | 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()
コンポーネントからすべての動作をデタッチします。
公開メソッド `detachBehaviors()` |
public function detachBehaviors()
{
$this->ensureBehaviors();
foreach ($this->_behaviors as $name => $behavior) {
$this->detachBehavior($name);
}
}
定義: yii\base\Component::ensureBehaviors()
behaviors()で宣言された動作がこのコンポーネントにアタッチされていることを確認します。
公開メソッド `ensureBehaviors()` |
public function ensureBehaviors()
{
if ($this->_behaviors === null) {
$this->_behaviors = [];
foreach ($this->behaviors() as $name => $behavior) {
$this->attachBehaviorInternal($name, $behavior);
}
}
}
定義: yii\base\Component::getBehavior()
名前付きの動作オブジェクトを返します。
公開メソッド `getBehavior()` ($name) | ||
$name | string |
ビヘイビア名 |
戻り値 | yii\base\Behavior|null |
ビヘイビアオブジェクト、またはビヘイビアが存在しない場合はnull |
---|
public function getBehavior($name)
{
$this->ensureBehaviors();
return isset($this->_behaviors[$name]) ? $this->_behaviors[$name] : null;
}
定義: yii\base\Component::getBehaviors()
このコンポーネントにアタッチされたすべての動作を返します。
公開メソッド `getBehaviors()` | ||
戻り値 | 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']);
公開メソッド `getCookies()` | ||
戻り値 | 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ヘッダーが含まれています。
公開メソッド `getHeaders()` | ||
戻り値 | yii\web\HeaderCollection |
ヘッダーコレクション |
---|
public function getHeaders()
{
if ($this->_headers === null) {
$this->_headers = new HeaderCollection();
}
return $this->_headers;
}
リクエストで指定されたHTTP範囲を判別します。
保護されたメソッド `getHttpRange()` ($fileSize) | ||
$fileSize | integer |
要求されたHTTP範囲の検証に使用されるファイルのサイズ。 |
戻り値 | 配列|ブール値 |
範囲(開始、終了)、または範囲要求が無効な場合は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()` | ||
戻り値 | boolean |
このレスポンスがクライアントエラーを示しているかどうか |
---|
public function getIsClientError()
{
return $this->getStatusCode() >= 400 && $this->getStatusCode() < 500;
}
公開メソッド `getIsEmpty()` | ||
戻り値 | boolean |
このレスポンスが空かどうか |
---|
public function getIsEmpty()
{
return in_array($this->getStatusCode(), [201, 204, 304]);
}
公開メソッド `getIsForbidden()` | ||
戻り値 | boolean |
このレスポンスが現在の要求が禁止されていることを示しているかどうか |
---|
public function getIsForbidden()
{
return $this->getStatusCode() == 403;
}
公開メソッド `getIsInformational()` | ||
戻り値 | boolean |
このレスポンスが情報提供用かどうか |
---|
public function getIsInformational()
{
return $this->getStatusCode() >= 100 && $this->getStatusCode() < 200;
}
公開メソッド `getIsInvalid()` | ||
戻り値 | boolean |
このレスポンスに有効な$statusCodeがあるかどうか。 |
---|
public function getIsInvalid()
{
return $this->getStatusCode() < 100 || $this->getStatusCode() >= 600;
}
public boolean getIsNotFound ( ) | ||
戻り値 | boolean |
現在要求されているリソースが見つからないことを示すレスポンスかどうか |
---|
public function getIsNotFound()
{
return $this->getStatusCode() == 404;
}
public boolean getIsOk ( ) | ||
戻り値 | boolean |
このレスポンスが正常かどうか |
---|
public function getIsOk()
{
return $this->getStatusCode() == 200;
}
public boolean getIsRedirection ( ) | ||
戻り値 | boolean |
このレスポンスがリダイレクトかどうか |
---|
public function getIsRedirection()
{
return $this->getStatusCode() >= 300 && $this->getStatusCode() < 400;
}
public boolean getIsServerError ( ) | ||
戻り値 | boolean |
このレスポンスがサーバーエラーを示しているかどうか |
---|
public function getIsServerError()
{
return $this->getStatusCode() >= 500 && $this->getStatusCode() < 600;
}
public boolean getIsSuccessful ( ) | ||
戻り値 | boolean |
このレスポンスが成功したかどうか |
---|
public function getIsSuccessful()
{
return $this->getStatusCode() >= 200 && $this->getStatusCode() < 300;
}
public integer getStatusCode ( ) | ||
戻り値 | integer |
レスポンスとともに送信するHTTPステータスコード。 |
---|
public function getStatusCode()
{
return $this->_statusCode;
}
定義されている場所: yii\base\Component::hasEventHandlers()
名前付きイベントにアタッチされたハンドラーがあるかどうかを示す値を返します。
public boolean hasEventHandlers ( $name ) | ||
$name | string |
イベント名 |
戻り値 | 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 の場合)。
public boolean hasMethod ( $name, $checkBehaviors = true ) | ||
$name | string |
プロパティ名 |
$checkBehaviors | boolean |
ビヘイビアのメソッドをこのコンポーネントのメソッドとして扱うかどうか |
戻り値 | 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()
このコンポーネントにプロパティが定義されているかどうかを示す値を返します。
プロパティが定義されている場合
- そのクラスに、指定された名前と関連付けられたゲッターまたはセッターメソッドが存在する場合(この場合、プロパティ名はケースインセンシティブです)。
- クラスに指定された名前のメンバ変数がある場合(
$checkVars
がtrueの場合)。 - アタッチされたビヘイビアに指定された名前のプロパティが存在する場合(`$checkBehaviors` が true の場合)。
参照
public boolean hasProperty ( $name, $checkVars = true, $checkBehaviors = true ) | ||
$name | string |
プロパティ名 |
$checkVars | boolean |
メンバ変数をプロパティとして扱うかどうか |
$checkBehaviors | boolean |
ビヘイビアのプロパティをこのコンポーネントのプロパティとして扱うかどうか |
戻り値 | 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 の場合、指定されたイベントにアタッチされているすべてのハンドラーが削除されます。 |
戻り値 | 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;
}
定義されている場所: 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]);
}
}
protected void prepare ( ) | ||
例外 | 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コードでリダイレクトを処理していない限り、通常は期待通りに動作しません。この目標を達成するために、このメソッドは "Location" の代わりに "X-Redirect" ヘッダーを送信します。
"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の場合、「Location」ヘッダーが送信され、AJAX/PJAXレスポンスとして受信された場合、ブラウザのリダイレクトが行われない場合があります。リクエストヘッダーの`X-Ie-Redirect-Compatibility`が存在しない場合にのみ有効です。 |
戻り値 | $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に追加するアンカー。デフォルトは空です。指定する場合は、アンカーが「#」で始まることを確認してください。 |
戻り値 | 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 |
ファイル送信のための追加オプション。次のオプションがサポートされています。
|
戻り値 | $this |
レスポンスオブジェクト自体 |
---|---|---|
例外 | 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;
}
クッキーをクライアントに送信します。
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の場合、`$filePath`から決定されます。 |
$options | array |
ファイル送信のための追加オプション。次のオプションがサポートされています。
|
戻り値 | $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 |
ファイル送信のための追加オプション。次のオプションがサポートされています。
|
戻り値 | $this |
レスポンスオブジェクト自体 |
---|---|---|
例外 | 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の場合、 |
戻り値 | $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 |
ステータステキスト。設定されていない場合、ステータスコードに基づいて自動的に設定されます。 |
戻り値 | $this |
レスポンスオブジェクト自体 |
---|---|---|
例外 | 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 |
例外オブジェクト。 |
戻り値 | $this |
レスポンスオブジェクト自体 |
---|---|---|
例外 | yii\base\InvalidArgumentException |
ステータスコードが無効な場合。 |
public function setStatusCodeByException($e)
{
if ($e instanceof HttpException) {
$this->setStatusCode($e->statusCode);
} else {
$this->setStatusCode(500);
}
return $this;
}
定義されている場所: 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);
}
x-sendfile を使用して既存のファイルをブラウザにダウンロードとして送信します。
X-Sendfileは、ウェブアプリケーションがファイルのリクエストをウェブサーバにリダイレクトすることを可能にする機能です。これにより、ファイルの読み込みやユーザーへの送信などのタスクを実行する必要がなくなり、多くのファイル(または非常に大きなファイル)を扱う場合、ウェブアプリケーションはより早く終了できるため、パフォーマンスの大幅な向上につながります。
リクエストは特別な非標準のHTTPヘッダーを介してサーバに送信されます。ウェブサーバはこのようなヘッダーの存在を検出すると、すべての出力を破棄し、キャッシングヘッダーなどの最適化を含むウェブサーバの内部機能を使用して、そのヘッダーで指定されたファイルを送信します。
このヘッダーディレクティブは非標準であるため、異なるウェブサーバアプリケーションで異なるディレクティブが存在します。
- Apache: X-Sendfile
- Lighttpd v1.4: X-LIGHTTPD-send-file
- Lighttpd v1.5: X-Sendfile
- Nginx: X-Accel-Redirect
- Cherokee: X-Sendfile and X-Accel-Redirect
そのため、このメソッドが動作するには、ウェブサーバでX-SENDFILEオプション/モジュールが有効になっており、適切なxHeaderが送信されている必要があります。
注意
このオプションを使用すると、ウェブフォルダにないファイル、または`.htaccess`など、それ以外の方法で保護されている(deny from all)ファイルもダウンロードできます。
副作用
このオプションがウェブサーバで無効になっている場合、このメソッドが呼び出されるとダウンロード設定ダイアログが開きますが、ダウンロードされたファイルのサイズは0バイトになります。
既知の問題
SSL接続を介してX-SENDFILEを使用する場合、Internet Explorer 6、7、8にはバグがあり、「Internet Explorerはこのインターネットサイトを開くことができませんでした。要求されたサイトは利用できないか、見つかりません。」のようなエラーメッセージが表示されます。この問題は、`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 |
ファイル送信のための追加オプション。次のオプションがサポートされています。
|
戻り値 | $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;
}
サインアップ または ログイン してコメントしてください。