HTTPレスポンス

Responseクラスは、それを呼び出したクライアントに応答するサーバーにのみ適切なメソッドを使用して、HTTPメッセージクラスを拡張します。

レスポンスの操作

Responseクラスはインスタンス化され、コントローラーに渡されます。$this->response を通じてアクセスできます。これは、Services::response() が返すのと同じインスタンスです。これをグローバルレスポンスインスタンスと呼びます。

CodeIgniterはヘッダーとボディの送信を処理するため、多くの場合、クラスに直接触れる必要はありません。これは、ページが要求されたコンテンツを正常に作成した場合に最適です。問題が発生した場合、または非常に具体的なステータスコードを返す必要がある場合、または強力なHTTPキャッシングを利用する場合でも、利用できます。

出力の設定

スクリプトの出力を直接設定する必要があり、CodeIgniterに自動的に取得させる必要がない場合は、setBody メソッドを使用して手動で行います。これは通常、レスポンスのステータスコードを設定する場合と組み合わせて使用されます。

<?php

$this->response->setStatusCode(404)->setBody($body);

理由フレーズ(「OK」、「作成済み」、「恒久的に移動」)は自動的に追加されますが、setStatusCode() メソッドの2番目のパラメーターとしてカスタム理由を追加できます。

<?php

$this->response->setStatusCode(404, 'Nope. Not here.');

配列をJSONまたはXMLにフォーマットし、コンテンツタイプヘッダーを適切なMIMEに設定するには、setJSON() および setXML() メソッドを使用します。通常、変換するデータの配列を送信します。

<?php

$data = [
    'success' => true,
    'id'      => 123,
];

return $this->response->setJSON($data);

// or
return $this->response->setXML($data);

ヘッダーの設定

setHeader()

多くの場合、レスポンスに対して設定するヘッダーを設定する必要があります。Responseクラスでは、setHeader() メソッドを使用して、これを非常に簡単に行うことができます。

最初のパラメーターはヘッダーの名前です。2番目のパラメーターは値であり、クライアントに送信するときに正しく結合される文字列または値の配列のいずれかになります。

<?php

$this->response->setHeader('Location', 'http://example.com')
    ->setHeader('WWW-Authenticate', 'Negotiate');

ネイティブPHP関数を使用する代わりにこれらの関数を使用すると、ヘッダーが早期に送信されてエラーが発生することを防ぎ、テストを可能にすることができます。

注釈

このメソッドは、レスポンスインスタンスにヘッダーを設定するだけです。したがって、別のレスポンスインスタンスを作成して返す場合(たとえば、redirect() を呼び出した場合)、ここで設定されたヘッダーは自動的に送信されません。

appendHeader()

ヘッダーが存在し、複数の値を持つことができる場合は、appendHeader() および prependHeader() メソッドを使用して、それぞれ値のリストの末尾または先頭に値を追加できます。最初のパラメーターはヘッダーの名前、2番目のパラメーターは追加または先頭に追加する値です。

<?php

$this->response->setHeader('Cache-Control', 'no-cache')
    ->appendHeader('Cache-Control', 'must-revalidate');

removeHeader()

ヘッダーは、ヘッダー名を唯一のパラメーターとして受け取る removeHeader() メソッドを使用して、レスポンスから削除できます。これは大文字と小文字を区別しません。

<?php

$this->response->removeHeader('Location');

リダイレクト

リダイレクトを作成する場合は、redirect() 関数を使用します。

これにより、RedirectResponse インスタンスが返されます。これは、Services::response() が返すグローバルレスポンスインスタンスとは異なるインスタンスです。

警告

redirect() を呼び出す前にクッキーまたはレスポンスヘッダーを設定すると、それらはグローバルレスポンスインスタンスに設定され、RedirectResponse インスタンスに自動的にコピーされません。それらを送信するには、withCookies() または withHeaders() メソッドを手動で呼び出す必要があります。

重要

リダイレクトする場合は、コントローラーまたはコントローラーフィルターのメソッドで、RedirectResponse のインスタンスを返す必要があります。__construct() または initController() メソッドは値を返すことができないことに注意してください。RedirectResponse を返すのを忘れると、リダイレクトは発生しません。

URIパスへのリダイレクト

URIパス(baseURLに対する相対パス)を渡す場合は、redirect()->to() を使用します。

// Go to specific URI path. "admin/home" is the URI path relative to baseURL.
return redirect()->to('admin/home');

注釈

削除したいURLにフラグメントがある場合は、メソッドで refresh パラメーターを使用できます。return redirect()->to('admin/home', null, 'refresh'); のようにします。

定義されたルートへのリダイレクト

ルート名またはリバースルーティング用のController::methodを渡す場合は、redirect()->route() を使用します。

// Go to a named route. "user_gallery" is the route name, not a URI path.
return redirect()->route('user_gallery');

関数に引数を渡すと、相対/完全なURIではなく、リバースルーティングのルート名またはController::methodとして扱われ、redirect()->route() を使用するのと同じように扱われます。

// Go to a named/reverse-routed URI.
return redirect('named_route');

リダイレクトバック

リダイレクトバックする場合は、redirect()->back() を使用します。

// Go back to the previous page.
return redirect()->back();

// Keep the old input values upon redirect so they can be used by the `old()` function.
return redirect()->back()->withInput();

// Set a flash message.
return redirect()->back()->with('foo', 'message');

注釈

redirect()->back() はブラウザの「戻る」ボタンと同じではありません。セッションが利用可能な場合、「セッション中に最後に表示されたページ」に訪問者を移動します。セッションがロードされていない場合、またはその他の理由で利用できない場合は、HTTP_REFERER のサニタイズされたバージョンが使用されます。

クッキー付きのリダイレクト

redirect() を呼び出す前にクッキーを設定すると、それらはグローバルレスポンスインスタンスに設定され、RedirectResponse インスタンスに自動的にコピーされません。

クッキーを送信するには、withCookies() メソッドを手動で呼び出す必要があります。

// Copies all cookies from global response instance.
return redirect()->back()->withCookies();

ヘッダー付きリダイレクト

redirect() を呼び出す前にレスポンスヘッダーを設定した場合、それらはグローバルレスポンスインスタンスに設定され、RedirectResponse インスタンスに自動的にコピーされることはありません。

ヘッダーを送信するには、手動で withHeaders() メソッドを呼び出す必要があります。

// Copies all headers from the global response instance.
return redirect()->back()->withHeaders();

リダイレクトステータスコード

GET リクエストのデフォルトの HTTP ステータスコードは 302 です。ただし、HTTP/1.1 以降を使用する場合、POST/PUT/DELETE リクエストには 303 が使用され、他のすべてのリクエストには 307 が使用されます。

ステータスコードを指定できます。

// Redirect to a URI path relative to baseURL with status code 301.
return redirect()->to('admin/home', 301);

// Redirect to a route with status code 308.
return redirect()->route('user_gallery', [], 308);

// Redirect back with status code 302.
return redirect()->back(302);

注釈

バグのため、v4.3.3 以前のバージョンでは、ステータスコードが指定されている場合でも、実際のリダイレクトレスポンスのステータスコードが変更される可能性がありました。 ChangeLog v4.3.4 を参照してください。

リダイレクトの HTTP ステータスコードがわからない場合は、HTTP のリダイレクト を読むことをお勧めします。

ファイルの強制ダウンロード

Response クラスは、ファイルをクライアントに送信する簡単な方法を提供し、ブラウザーにデータをコンピューターにダウンロードするように促します。これは、それを実現するための適切なヘッダーを設定します。

最初のパラメーターは**ダウンロードされたファイルに付けたい名前**であり、2 番目のパラメーターはファイルデータです。

2 番目のパラメーターを null に設定し、$filename が存在する読み取り可能なファイルパスである場合、代わりにその内容が読み取られます。

3 番目のパラメーターをブール値 true に設定すると、実際のファイル MIME タイプ (ファイル名拡張子に基づく) が送信され、ブラウザーがそのタイプ用のハンドラーを持っている場合は、それを使用できます。

<?php

$data = 'Here is some text!';
$name = 'mytext.txt';

return $this->response->download($name, $data);

サーバーから既存のファイルをダウンロードする場合は、2 番目のパラメーターに null を明示的に渡す必要があります。

<?php

// Contents of photo.jpg will be automatically read
return $this->response->download('/path/to/photo.jpg', null);

クライアントのブラウザーに送信されるファイル名を変更するには、オプションの setFileName() メソッドを使用します。

<?php

return $this->response->download('awkwardEncryptedFileName.fakeExt', null)->setFileName('expenses.csv');

注釈

ダウンロードをクライアントに送信するには、レスポンスオブジェクトを返す必要があります。これにより、レスポンスがクライアントに送信される前に、すべての**after**フィルターを通過できるようになります。

ブラウザでファイルを開く

一部のブラウザーは PDF などのファイルを表示できます。ファイルを保存する代わりにブラウザーに表示させるには、DownloadResponse::inline() メソッドを呼び出します。

<?php

$data = 'Here is some text!';
$name = 'mytext.txt';

return $this->response->download($name, $data)->inline();

HTTP キャッシュ

HTTP 仕様には、クライアント (多くの場合、Web ブラウザー) が結果をキャッシュするのに役立つツールが組み込まれています。正しく使用すると、何も変更されていないため、クライアントがサーバーにまったく連絡する必要がないことをクライアントに伝えるため、アプリケーションのパフォーマンスが大幅に向上する可能性があります。そして、それよりも速くすることはできません。

これらは Cache-Control ヘッダーと ETag ヘッダーを介して処理されます。このガイドは、すべてのキャッシュヘッダーの機能の徹底的な入門書としては適切ではありませんが、Google Developers で十分に理解できます。

デフォルトでは、CodeIgniter を介して送信されるすべてのレスポンスオブジェクトでは、HTTP キャッシュが無効になっています。オプションと正確な状況は、オフにすること以外に適切なデフォルトを作成することができないほど多岐にわたります。setCache() メソッドを使用して、必要なキャッシュ値を設定するのは簡単です。

<?php

$options = [
    'max-age'  => 300,
    's-maxage' => 900,
    'etag'     => 'abcde',
];
$this->response->setCache($options);

$options 配列は、いくつかの例外を除いて、Cache-Control ヘッダーに割り当てられるキーと値のペアの配列を受け取るだけです。特定の状況に必要なすべてのオプションを自由に設定できます。ほとんどのオプションは Cache-Control ヘッダーに適用されますが、etag および last-modified オプションを適切なヘッダーにインテリジェントに処理します。

クラスリファレンス

注釈

ここにリストされているメソッドに加えて、このクラスは Message Class のメソッドを継承します。

親クラスによって提供される利用可能なメソッドは次のとおりです。

  • CodeIgniter\HTTP\Message::body()

  • CodeIgniter\HTTP\Message::setBody()

  • CodeIgniter\HTTP\Message::populateHeaders()

  • CodeIgniter\HTTP\Message::headers()

  • CodeIgniter\HTTP\Message::header()

  • CodeIgniter\HTTP\Message::headerLine()

  • CodeIgniter\HTTP\Message::setHeader()

  • CodeIgniter\HTTP\Message::removeHeader()

  • CodeIgniter\HTTP\Message::appendHeader()

  • CodeIgniter\HTTP\Message::protocolVersion()

  • CodeIgniter\HTTP\Message::setProtocolVersion()

  • CodeIgniter\HTTP\Message::negotiateMedia()

  • CodeIgniter\HTTP\Message::negotiateCharset()

  • CodeIgniter\HTTP\Message::negotiateEncoding()

  • CodeIgniter\HTTP\Message::negotiateLanguage()

  • CodeIgniter\HTTP\Message::negotiateLanguage()

class CodeIgniter\HTTP\Response
getStatusCode()
戻り値:

このレスポンスの現在の HTTP ステータスコード

戻り値の型:

int

このレスポンスの現在のステータスコードを返します。ステータスコードが設定されていない場合は、BadMethodCallException がスローされます。

<?php

echo $response->getStatusCode();
setStatusCode($code[, $reason=''])
パラメーター:
  • $code (int) – HTTP ステータスコード

  • $reason (string) – オプションの理由句。

戻り値:

現在のレスポンスインスタンス

戻り値の型:

CodeIgniter\HTTP\Response

このレスポンスで送信する必要がある HTTP ステータスコードを設定します。

<?php

$response->setStatusCode(404);

理由句は、公式リストに基づいて自動的に生成されます。カスタムステータスコードに独自に設定する必要がある場合は、2 番目のパラメーターとして理由句を渡すことができます。

<?php

$response->setStatusCode(230, 'Tardis initiated');
getReasonPhrase()
戻り値:

現在の理由句。

戻り値の型:

string

このレスポンスの現在のステータスコードを返します。ステータスが設定されていない場合は、空の文字列が返されます。

<?php

echo $response->getReasonPhrase();
setDate($date)
パラメーター:
  • $date (DateTime) – このレスポンスに設定する時間を持つ DateTime インスタンス。

戻り値:

現在のレスポンスインスタンス。

戻り値の型:

CodeIgniter\HTTP\Response

このレスポンスに使用する日付を設定します。$date 引数は、DateTime のインスタンスである必要があります。

setContentType($mime[, $charset='UTF-8'])
パラメーター:
  • $mime (string) – このレスポンスが表すコンテンツタイプ。

  • $charset (string) – このレスポンスが使用する文字セット。

戻り値:

現在のレスポンスインスタンス。

戻り値の型:

CodeIgniter\HTTP\Response

このレスポンスが表すコンテンツタイプを設定します。

<?php

$response->setContentType('text/plain');
$response->setContentType('text/html');
$response->setContentType('application/json');

デフォルトでは、メソッドは文字セットを UTF-8 に設定します。これを変更する必要がある場合は、2 番目のパラメーターとして文字セットを渡すことができます。

<?php

$response->setContentType('text/plain', 'x-pig-latin');
noCache()
戻り値:

現在のレスポンスインスタンス。

戻り値の型:

CodeIgniter\HTTP\Response

すべての HTTP キャッシュをオフにするように Cache-Control ヘッダーを設定します。これは、すべてのレスポンスメッセージのデフォルト設定です。

<?php

$response->noCache();
/*
 * Sets the following header:
 * Cache-Control: no-store, max-age=0, no-cache
 */
setCache($options)
パラメーター:
  • $options (array) – キーと値のキャッシュ制御設定の配列。

戻り値:

現在のレスポンスインスタンス。

戻り値の型:

CodeIgniter\HTTP\Response

ETags および Last-Modified を含む Cache-Control ヘッダーを設定します。一般的なキーは次のとおりです。

  • etag

  • last-modified

  • max-age

  • s-maxage

  • private

  • public

  • must-revalidate

  • proxy-revalidate

  • no-transform

last-modified オプションを渡す場合、日付文字列または DateTime オブジェクトのいずれかを指定できます。

setLastModified($date)
パラメーター:
  • $date (string|DateTime) – Last-Modified ヘッダーに設定する日付。

戻り値:

現在のレスポンスインスタンス。

戻り値の型:

CodeIgniter\HTTP\Response

Last-Modified ヘッダーを設定します。$date オブジェクトは、文字列または DateTime インスタンスのいずれかになります。

<?php

$response->setLastModified(date('D, d M Y H:i:s'));
$response->setLastModified(\DateTime::createFromFormat('!U', $timestamp));
send() Response
戻り値:

現在のレスポンスインスタンス。

戻り値の型:

CodeIgniter\HTTP\Response

クライアントにすべてを送信するためのレスポンスを指示します。まずヘッダーを送信し、続いてレスポンスボディを送信します。メインアプリケーションのレスポンスについては、CodeIgniterによって自動的に処理されるため、これを呼び出す必要はありません。

setCookie($name = ''[, $value = ''[, $expire = ''[, $domain = ''[, $path = '/'[, $prefix = ''[, $secure = false[, $httponly = false[, $samesite = null]]]]]]]])
パラメーター:
  • $name (array|Cookie|string) – クッキーの名前、またはこのメソッドで利用可能なすべてのパラメータの連想配列、または CodeIgniter\Cookie\Cookie のインスタンス

  • $value (string) – クッキーの値

  • $expire (int) – クッキーの有効期限(秒単位)。 0 に設定すると、クッキーはブラウザが開いている間のみ有効になります。

  • $domain (string) – クッキーのドメイン

  • $path (string) – クッキーのパス

  • $prefix (string) – クッキー名のプレフィックス。 '' に設定すると、app/Config/Cookie.php のデフォルト値が使用されます。

  • $secure (bool) – HTTPS経由でのみクッキーを転送するかどうか。 null に設定すると、app/Config/Cookie.php のデフォルト値が使用されます。

  • $httponly (bool) – HTTPリクエスト(JavaScriptなし)でのみクッキーをアクセス可能にするかどうか。 null に設定すると、app/Config/Cookie.php のデフォルト値が使用されます。

  • $samesite (string) – SameSiteクッキーパラメータの値。'' に設定すると、クッキーに SameSite 属性は設定されません。 null に設定すると、app/Config/Cookie.php のデフォルト値が使用されます。

戻り値の型:

void

注釈

v4.2.7より前では、バグのため、$secure および $httponly のデフォルト値は false であり、app/Config/Cookie.php のこれらの値は使用されませんでした。

指定した値を含むクッキーをレスポンスインスタンスに設定します。

クッキーを設定するために、このメソッドに情報を渡すには2つの方法があります。配列メソッドと個別パラメータです。

配列メソッド

このメソッドを使用すると、連想配列が最初のパラメータとして渡されます。

<?php

$cookie = [
    'name'     => 'The Cookie Name',
    'value'    => 'The Value',
    'expire'   => '86500',
    'domain'   => '.some-domain.com',
    'path'     => '/',
    'prefix'   => 'myprefix_',
    'secure'   => true,
    'httponly' => false,
    'samesite' => 'Lax',
];

$response->setCookie($cookie);

namevalue のみが必要です。クッキーを削除するには、expire を空白にして設定します。

expire単位で設定され、現在の時刻に追加されます。時刻を含めるのではなく、クッキーを有効にする現在からの秒数のみを含めます。 expire がゼロに設定されている場合、クッキーはブラウザが開いている間のみ有効になります。

注釈

ただし、value が空の文字列に設定され、expire0 に設定されている場合、クッキーは削除されます。

サイトがどのように要求されたかにかかわらず、サイト全体のクッキーについては、次のようにピリオドで始まるURLを domain に追加します。 .your-domain.com

このメソッドはルートパスを設定するため、通常は path は必要ありません。

サーバーの他の同じ名前のクッキーとの名前の衝突を回避する必要がある場合にのみ、prefix が必要になります。

secure フラグは、true に設定してセキュアクッキーにしたい場合にのみ必要です。

samesite 値は、ドメインとサブドメイン間でクッキーがどのように共有されるかを制御します。使用可能な値は、'None''Lax''Strict'、または空の文字列 '' です。空の文字列に設定すると、デフォルトの SameSite 属性が設定されます。

個別パラメータ

必要に応じて、個別のパラメータを使用してデータを渡すことでクッキーを設定できます。

<?php

$response->setCookie($name, $value, $expire, $domain, $path, $prefix, $secure, $httponly, $samesite);
deleteCookie($name = ''[, $domain = ''[, $path = '/'[, $prefix = '']]])
パラメーター:
  • $name (mixed) – クッキー名またはパラメータの配列

  • $domain (string) – クッキーのドメイン

  • $path (string) – クッキーのパス

  • $prefix (string) – クッキー名のプレフィックス

戻り値の型:

void

既存のクッキーを削除します。

注釈

これは、クッキーを削除するためのブラウザクッキーも設定します。

name のみが必要です。

サーバーの他の同じ名前のクッキーとの名前の衝突を回避する必要がある場合にのみ、prefix が必要になります。

クッキーをそのサブセットでのみ削除する必要がある場合は prefix を指定します。クッキーをそのドメインでのみ削除する必要がある場合は domain 名を指定します。クッキーをそのパスでのみ削除する必要がある場合は path 名を指定します。

オプションのパラメータがいずれも空の場合、同じ名前のクッキーは該当するすべてで削除されます。

<?php

$response->deleteCookie($name);
hasCookie($name = ''[, $value = null[, $prefix = '']])
パラメーター:
  • $name (mixed) – クッキー名またはパラメータの配列

  • $value (string) – クッキーの値

  • $prefix (string) – クッキー名のプレフィックス

戻り値の型:

bool

レスポンスに指定されたクッキーがあるかどうかを確認します。

注記

name のみが必要です。 prefix が指定されている場合、クッキー名の先頭に付加されます。

value が指定されていない場合、メソッドは名前付きクッキーの存在のみを確認します。 value が指定されている場合、メソッドはクッキーが存在し、規定された値を持っていることを確認します。

<?php

if ($response->hasCookie($name)) {
    // ...
}
getCookie($name = ''[, $prefix = ''])
パラメーター:
  • $name (string) – クッキー名

  • $prefix (string) – クッキー名のプレフィックス

戻り値の型:

Cookie|Cookie[]|null

見つかった場合は、名前付きクッキーを返し、見つからなかった場合は null を返します。 name が指定されていない場合は、Cookie オブジェクトの配列を返します。

<?php

$cookie = $response->getCookie($name);
getCookies()
戻り値の型:

Cookie[]

レスポンスインスタンス内に現在設定されているすべてのクッキーを返します。これらは、現在のリクエスト中にのみ設定するように具体的に指定したクッキーです。