1

次のように、API から複数のバージョン管理されたエンドポイントを同時にサポートできるようにしたいと考えています。

/api/v1.1/counties/get
/api/v1.2/counties/get

しかし、このためのルーティングを実装しようとして、Cake がこれをどのように望んでいるかについて少し当惑しました。

エラー: コントローラ クラス郡が見つかりませんでした。

試行 1:

Router::scope('/api', function ($routes) {

    $routes->setExtensions(['json']);
    $routes->fallbacks('DashedRoute');

    $versions = [
        1.1
    ];

    foreach ($versions as $version) {
        $routes->scope('/' . $version, function($routes) {

            $routes->resources('Counties', [
                'controller' => 'Counties',
                'prefix' => 'api',
                'map' => [
                    'get' => [
                        'action' => 'get',
                    ]
                ]
            ]);

        }
    }

});

試行 2:

Router::scope('/api', function($routes) {

    $routes->scope('/v1.1', function($routes) {
        $routes->resources('Counties', [
            'controller' => 'Counties',
            'map' => [
                'get' => [
                    'action' => 'get'
                ]   
            ]   
        ]); 
    }); 

    $routes->connect(
        '/v1.1/counties/get',
        [   
            'controller' => 'Counties',
            'action' => 'get',
        ]   
    );  
});

私が現在使用しているディレクトリ構造 (まだ議論の余地があります):

src/Controller/Api/V1.1。src/Controller/Api のベース コントローラーを使用し、必要に応じてオーバーライドするスタブ メソッドでそれらを拡張します。私の「脂肪」のほとんどはモデルにあります。

および src/Controller/Api/V1.1/CountiesController.php には次のものがあります。

namespace App\Controller\Api\V1.1;

class CountiesController extends AppController
{
}

洞察をいただければ幸いです

4

1 に答える 1

4

無効な PHP であるため、名前空間 (フォルダー) 構造でドットのような文字を使用することはできません。

探しているのはpath、名前空間で有効なプレフィックスを接続し、ルートのカスタム パス (URL セグメント) を指定できるように、プレフィックス ルーティングとオプションを使用することです。

Router::prefix('api', function (RouteBuilder $routes) {
    // ...

    $routes->prefix('v11', ['path' => '/v1.1'], function (RouteBuilder $routes) {
        $routes->resources('Counties', [
            'map' => [
                'get' => [
                    'action' => 'get'
                ]  
            ]
        ]);
    });
});

これにより、次のルートが接続されます(シェルで接続されたルートを確認できますbin/cake routes):

+---------------------+-----------------------+--------------------------------------------------------------------------------------------------+
| Route name          | URI template          | Defaults                                                                                         |
+---------------------+-----------------------+--------------------------------------------------------------------------------------------------+
| v11:counties:index  | api/v1.1/counties     | {"controller":"Counties","action":"index","_method":"GET","prefix":"v11","plugin":null}          |
| v11:counties:add    | api/v1.1/counties     | {"controller":"Counties","action":"add","_method":"POST","prefix":"v11","plugin":null}           |
| v11:counties:view   | api/v1.1/counties/:id | {"controller":"Counties","action":"view","_method":"GET","prefix":"v11","plugin":null}           |
| v11:counties:edit   | api/v1.1/counties/:id | {"controller":"Counties","action":"edit","_method":["PUT","PATCH"],"prefix":"v11","plugin":null} |
| v11:counties:delete | api/v1.1/counties/:id | {"controller":"Counties","action":"delete","_method":"DELETE","prefix":"v11","plugin":null}      |
| v11:counties:get    | api/v1.1/counties/get | {"controller":"Counties","action":"get","_method":"GET","prefix":"v11","plugin":null}            |
+---------------------+-----------------------+--------------------------------------------------------------------------------------------------+

クラスは次のCountiesControllerように期待されます

src/Controller/Api/V11/CountiesController.php

次の名前空間を持つ:

App\Controller\Api\V11

こちらもご覧ください

于 2018-01-26T18:20:31.710 に答える