API Endpoints
這個沒有辦法翻譯,就是route
的意思,也有很多人(這個應該指老外或者裝逼者),當我們在討論APIs很多人指的意思就是the routes you visit as an endpoint
API的版本GROUP
為了避免你的主程序路由到這個包的時候采用它自己的路由,我們就必須新建一個api路由的對象
$api = app('Dingo\Api\Routing\Router');
然后必須定義version group, 這樣我們可以為不同的版本創建相同的路由,這樣方便版本管理和開發
提示: 這里的$api->version
可以理解為特殊的$api->group
$api->version('v1', function ($api) {
});
如果需要一個組可以響應多個版本,這樣寫
$api->version(['v1', 'v2'], function ($api) {
});
這個group的用法和laravel自帶的標準group用法一樣,也可以傳遞數組作為第二個參數
$api->version('v1', ['middleware' => 'auth'], function ($api) {
});
我們的路由還可以分的在細致一點,比如version中嵌套group
$api->version('v1', function ($api) {
$api->group(['middleware' => 'foo1'], function ($api) {
});
$api->group(['middleware' => 'foo2'], function ($api) {
});
});
關于中間件這個東西,個人還是喜歡放在每個controller中,這樣感覺會更清楚點,是不是 ???
創建路由
有了上面的版本號組,現在就可以創建endpoints了,通過帶有參數為$api的閉包函數,如下:
$api->version('v1', function ($api) {
$api->get('users/{id}', 'App\Api\Controllers\UserController@show');
});
上面這樣寫好麻煩,能不能像laravel一樣,在某個地方把App\Api\Controllers
放在一個命名空間下,這樣寫的時候,就不用寫App\Api\Controllers
了,
上面的問題可以這么解決(還沒測試,不知道對不對):
$api->version('v1', ['namespace' => 'Api\Controllers'], function ($api) {
$api->get('users/{id}', 'UsersController@show');
});
//在app\api\controllers\UsersController.php中聲明命名空間為Api\Controllers;
還有就是php artisan make:controller
這個命令怎么搞??
因為Endpoint以版本號進行分組,所以你可以使用同樣的URI為同一Endpoint創建不同的響應:
$api->version('v1', function ($api) {
$api->get('users/{id}', 'App\Api\V1\Controllers\UserController@show');
});
$api->version('v2', function ($api) {
$api->get('users/{id}', 'App\Api\V2\Controllers\UserController@show');
});
從這里可以看出,dingo推薦的api的Controller的目錄為
app/Api/v1/Controller
//還有
app/Api/v1/Request (處理middleware)
app/Api/v1/Transfomers
要不要v1目錄,感覺太深了???
路由別名
$api->get('users/{id}', ['as' => 'users.index', 'uses' => 'App\Api\V1\UserController@show']);
我們要生成路由的時候就可以用這個別名:
app('Dingo\Api\Routing\UrlGenerator')->version('v1')->route('users.index');
// 必須提供一個版本號以便URL可以基于該版本號生成,同時,你可以在不同版本號中使用同一個命名路由。
//其實感覺也沒有什么卵用,直接xx->version('v1')->route('users/{id}'); 不行嗎??
控制臺查看api 路由的命令
$ php artisan api:routes