2017-11-27 9 views
0

のparamsでとせずに動作します。私がしなければCaekPHP 3メイクリソースルートは、私は私のルートにファイルをいくつかのコードを持っている

DELETE http://192.168.1.197/v1/files/1 

応答は、しかし、here次のとおりです。

DELETE http://192.168.1.197/v1/files 

応答は、V1Controllerが欠落しているという応答です。

代わりにCakePHPがターンアラウンドして「ああ、あなたは間違った数の必須パラメータを渡しました」と言います。

何か非常に奇妙なことがここで起こっているようだと私はかなり分からない。どのように私は2つの同じことを行い、コントローラを指摘することができますか?

+0

...

$routes->get('/files/*', ['controller' => 'Files', 'action' => 'view'], 'files:get'); $routes->post('/files', ['controller' => 'Files', 'action' => 'add'], 'files:post'); $routes->put('/files/*', ['controller' => 'Files', 'action' => 'edit'], 'files:put'); $routes->patch('/files/*', ['controller' => 'Files', 'action' => 'view'], 'files:patch'); $routes->delete('/files/*', ['controller' => 'Files', 'action' => 'delete'], 'files:delete'); 

そして、それはまさに私が質問に望んでいたかのように動作します:私はに私のコードを変更しました。 404リクエストに対する冗長なフィードバックを提供するのは、RESTfulなサービスの範囲を超えています。 – cgTag

+0

@MathewFoscarini経路が存在するが、パラメータの数が正しくないので、実際には404ではありませんが、あなたが何を意味しているのか分かります。ありがとう – Sammaye

+0

一致するルートがないので、404です。 Cakeはオプションの名前付きパラメータをサポートしていません。オプションの場合は、クエリ '?'パラメータを使用する必要があります。 – cgTag

答えて

2

デバッグモードがイネーブルの場合、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クラスを作成したり、独自のディスパッチャーでミドルウェアを変更することができます。

0

これを別の方法で解決しましたが、CakePHPでリソースルートの使用をやめてください。あなたはそのためのカスタムルートを作成し、カスタム例外をスローする必要が

関連する問題