デバッグモードがイネーブルの場合、CakePHPは例外で非常に異なる動作をします。デバッグがtrue
の場合、すべての例外はデバッグ情報、スタックトレース、および開発者にやさしいメッセージで表示されます。
デバッグモードがfalse
の場合、例外は標準のHTTP応答タイプとしてレンダリングされます。 400と500のエラーコードのハンドル。
ルータがルートの一致を検出できない場合、コントローラは関与していません。 HTTP要求はディスパッチフェーズを過ぎることはありません。これは、400型の例外をスローするディスパッチャです。
フレームワークでは、404
というHTTPコードを使用してMissingControllerException
が投げられています。
エラーコードは、ErrorController
でレンダリングされます。 CakePHPにはデフォルトのエラーコントローラが付属していますが、コンポーザーテンプレートを使用して新しいアプリケーションを生成する場合は、アプリケーションのコントローラホルダーにデフォルトのErrorController
が必要です。
テンプレートには、400コードの応答を表示するsrc/Template/Error/error400.ctp
ファイルが必要です。デバッグモードが有効な場合、このテンプレートは使用されません。
このテンプレートを変更して、「緊密に一致する」ルートを検索し、エラーメッセージのフィードバックとしてユーザーに推奨事項として提示できます。
あなたは簡単にこのように設定されたすべてのルートを反復処理することができます。
foreach (Router::routes() as $route) {
$name = isset($route->options['_name']) ? $route->options['_name'] : $route->getName();
$output[] = [$name, $route->template, json_encode($route->defaults)];
}
以上は、CakePHP/SRC /シェル/ RoutesShell.phpから撮影:
これは技術的に404エラーですので。一致するルートがなく、あなたができることは、マッチに "近い"ルートを見つけることです。ここで問題となるのは、Routerクラスと同じルートマッチングの課題があることです。
ルータクラスでは、ダイナミックのルーティング手法を使用して、URLパラメータの一部を取得し、コントローラ名、アクション名、およびユーザ定義パラメータとしてそれらを埋め込みます。
は、使用しているデフォルトのルータクラスの種類によって異なります。例えば
、あなたは次のことを行いDashedRoute
ルーティングクラスを使用している場合があります。
/**
* This route class will transparently inflect the controller, action and plugin
* routing parameters, so that requesting `/my-plugin/my-controller/my-action`
* is parsed as `['plugin' => 'MyPlugin', 'controller' => 'MyController', 'action' => 'myAction']`
*/
class DashedRoute extends Route
あなたが代わりに以下のんInflectedRoute
ルーティングクラス使用している場合があります:そこので
/**
* This route class will transparently inflect the controller and plugin routing
* parameters, so that requesting `/my_controller` is parsed as `['controller' => 'MyController']`
*/
class InflectedRoute extends Route
をルーティングが動的ルーティングを使用する場合があります。 URLセグメントがコントローラ、アクション、または名前付きパラメータであるかどうかを知ることはできません。
また、/v1
という名前のスコープセグメントを使用しているという複雑さに加えて、目的のルートが何かを予測することはさらに困難になります。
これらのエッジのケースをキャッチしてエラーメッセージを表示するカスタムルートを作成するか、error400.ctp
にロジックを追加してより有益なエラーメッセージを表示できます。
最終オプションもあります。 CakePHPでは独自のカスタムRouteクラスを作成したり、独自のディスパッチャーでミドルウェアを変更することができます。
...
そして、それはまさに私が質問に望んでいたかのように動作します:私はに私のコードを変更しました。 404リクエストに対する冗長なフィードバックを提供するのは、RESTfulなサービスの範囲を超えています。 – cgTag
@MathewFoscarini経路が存在するが、パラメータの数が正しくないので、実際には404ではありませんが、あなたが何を意味しているのか分かります。ありがとう – Sammaye
一致するルートがないので、404です。 Cakeはオプションの名前付きパラメータをサポートしていません。オプションの場合は、クエリ '?'パラメータを使用する必要があります。 – cgTag