web-dev-qa-db-ja.com

CakephpでHTTPステータスコードをどのように指定しますか?

私のコントローラーでは、条件をチェックして、ユーザーが何かを実行できるかどうかを確認します。チェックに失敗した場合は、403をブラウザに送り返したいと思います。 Cakephpでそれを行うにはどうすればよいですか?

27
allyourcode

[〜#〜] edit [〜#〜]-この質問はかなり古く、CakePHPフレームワークのさまざまなバージョンをカバーしています。以下は、各回答が適用されるバージョンの要約です。最も役立つソリューションに投票することを忘れないでください。

EDIT#2-A より詳細な回答 CakePHP2.x用がMark37によって追加されました。

編集#3-CakePHPのソリューションを追加しました。 (2018年5月:CakePHP 3.5はいくつかの関数の名前変更を行いました、 Robertoによる解決策 はまだ有効です。)


前のコメントの関連する APIコード を見ると、 Controller :: header($ status) を呼び出して、リダイレクトせずにヘッダーを出力できるようです。あなたの場合、適切な使用法が最も可能性が高いです:

$this->header('HTTP/1.1 403 Forbidden');
39
deizel

CakePHP 2では、 推奨される方法例外をスローする

throw new ForbiddenException();
13
Brad Koch
_$this->response->statusCode(403);
_

Cakeが応答を送信する準備ができたら、ステータスコードを設定します。 CakeResponse :: send()はステータスコードとメッセージを送信することを期待しているので、私のテストでは、header()の使用が上書きされていたと思います。 Cakeは_$this->header_の呼び出しがコロンで分割されることを想定しているため、$this->header('HTTP/1.1 400 Bad Request')の使用も機能しません。例:$this->header('Location: ...')

13
Asa Ayers

これらの回答のいずれも、私が望んでいたほど完全にこのトピックをカバーしているとは思えないので、ここに2セントを追加します(少なくともCake 2.xの場合)。

エラーステータスをスローする場合は、(他の回答で説明されているように)Exceptionクラスを使用します。

_throw new BadRequestException(); // 400 Bad Request

// Or customize the code...
throw new BadRequestException('Custom error message', 405); // 405 Method Not Allowed
_

おもしろい事実:Cakeは、ExceptionRendererクラスを介したRESTful呼び出しに対しても、自動的に魔法のエラーレンダリングを実行します。事実のさらに楽しい点は、Exceptionがスローされた可能性があるという事実ではなく、ステータスコードに基づいていることです。したがって、ステータスコードを自分で> 400に設定すると、次のようになります。あなたがそれらを望まなかったとしても、エラーメッセージ。

REST JSON/XMLエンドポイントの特定のステータスコードを返したい場合は、新しいCakeResponseオブジェクトを利用しますが、特別な__serialize_変数を追加することも忘れないでください。ケーキがJSON/XMLをレンダリングするためのビューを見つけようとするため、「ビューが見つかりません」というエラーが発生します(これは仕様によるものです。JsonView/XmlViewクラスを参照してください)。

_$this->response->setStatus(201);  // 201 Created
$this->set('_serialize', array()); // Value must be something other than null
_

最後に、定期的にレンダリングされるページに200以外のステータスを送信する場合は、前の回答で述べたように、setStatus()メソッドを他に何もせずに使用できます。

_$this->response->setStatus(201);
_

更新:

_$this->response->setStatus('code');
_

使用できなくなりました。使用する

_$this->response->statusCode('code');
_
10
Mark G.

この質問を再検討し、以前の回答に対するAdrianoのコメント(ユーザーをわかりやすいページにリダイレクトすることに関して)を読んだとき、私は新しい解決策を思いつきました。

コントローラ内で$this->cakeError('error404')を呼び出して、わかりやすい404ページを生成できます。これは、「app/views/errors/error404.ctp」にファイルを作成することで(他のエラーと同様に)カスタマイズできます。

cakeErrorのコード を詳しく調べた後、 'app/error.php'または(おそらくより望ましい) 'app/app_error.phpにファイルを作成して、CakeのErrorHandlerを拡張してみることをお勧めします。 '。

error403のコード( error404コード を模倣)は次のようになります。

class AppError extends ErrorHandler {
    function error403($params) {
        extract($params, EXTR_OVERWRITE);
        $this->error(array(
            'code' => '403',
            'name' => 'Forbidden',
            'message' => sprintf(__("Access was forbidden to the requested address %s on this server.", true), $url, $message)));
            $this->_stop();
     }
}

'app/views/errors/error403.ctp'を作成することにより、shouldもこのエラーのカスタムビューを提供できるはずです。 error404ビュー の修正バージョンは次のとおりです。

<h2><?php echo $name; ?></h2>
<p class="error">
    <strong>Error: </strong>
    <?php echo sprintf(__("Access was forbidden to the requested address %s on this server.", true), "<strong>'{$message}'</strong>")?>
</p>
7
deizel

CakePHP 3.xに関する注記が欠落しているように思われるため、このスレッドを完成させるには、次のようにします。

CakePHP 3.xの場合:

_$response = $this->response->withStatus(403);
return $response;
_

CakePHP 3.3.xより前のバージョンでは、CakePHP2.xと同じスタイルを使用できます。

_$this->response->statusCode('code');
_

PHP関数を直接使用することもできます(http_response_code(403); die();)。ただし、 応答オブジェクト を使用することは意図した方法のようです。

6
Roberto

おそらく何か cakephpマニュアルのこのセクションで があなたを助けることができます。

redirect(string $ url、integer $ status、boolean $ exit)

最も頻繁に使用するフロー制御メソッドはredirect()です。このメソッドは、CakePHP相対URLの形式で最初のパラメーターを取ります。ユーザーが正常に注文したら、レシート画面にリダイレクトすることをお勧めします。 redirect()の2番目のパラメーターを使用すると、リダイレクトに付随するHTTPステータスコードを定義できます。リダイレクトの性質に応じて、301(永続的に移動)または303(他を参照)を使用することをお勧めします。

3番目のパラメーターをfalseに設定しない限り、メソッドはリダイレクト後にexit()を発行します。

カスタムメッセージにはcakephpresponseを使用できます。

$this->response->header('HTTP/1.0 201', 'custom message');
$this->response->send();
1
ralphjason

CakePHP 3.6以降、再び変更されました。

今すぐ使用

    $this->setResponse($this->response->withStatus(403) );
    return $this->response; // use this line also 

の代わりに

    $response = $this->response->withStatus(403);

https://api.cakephp.org/3.7/class-Cake.Controller.Controller.html#_setResponse

1
ksc