私のコントローラーでは、条件をチェックして、ユーザーが何かを実行できるかどうかを確認します。チェックに失敗した場合は、403をブラウザに送り返したいと思います。 Cakephpでそれを行うにはどうすればよいですか?
[〜#〜] 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');
_$this->response->statusCode(403);
_
Cakeが応答を送信する準備ができたら、ステータスコードを設定します。 CakeResponse :: send()はステータスコードとメッセージを送信することを期待しているので、私のテストでは、header()
の使用が上書きされていたと思います。 Cakeは_$this->header
_の呼び出しがコロンで分割されることを想定しているため、$this->header('HTTP/1.1 400 Bad Request')
の使用も機能しません。例:$this->header('Location: ...')
これらの回答のいずれも、私が望んでいたほど完全にこのトピックをカバーしているとは思えないので、ここに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');
_
この質問を再検討し、以前の回答に対する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>
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();
)。ただし、 応答オブジェクト を使用することは意図した方法のようです。
おそらく何か 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();
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