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
インスタンスに自動的にコピーされることはありません。
ヘッダーを送信するには、手動で 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);
name
とvalue
のみが必要です。クッキーを削除するには、expire
を空白にして設定します。expire
は秒単位で設定され、現在の時刻に追加されます。時刻を含めるのではなく、クッキーを有効にする現在からの秒数のみを含めます。expire
がゼロに設定されている場合、クッキーはブラウザが開いている間のみ有効になります。注釈
ただし、
value
が空の文字列に設定され、expire
が0
に設定されている場合、クッキーは削除されます。サイトがどのように要求されたかにかかわらず、サイト全体のクッキーについては、次のようにピリオドで始まる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[]
レスポンスインスタンス内に現在設定されているすべてのクッキーを返します。これらは、現在のリクエスト中にのみ設定するように具体的に指定したクッキーです。