【laravel】訪問路由報錯問題,執行 php artisan route:clear 刪除路由緩存文件,以及DingoApi的路由寫法

前言:

路由緩存:路由緩存不會作用於基於閉包的路由。要使用路由緩存,必須將閉包路由轉化爲控制器路由。

1、如果你的應用完全基於控制器路由,可以使用 Laravel 的路由緩存,使用路由緩存將會極大降低註冊所有應用路由所花費的時間開銷,在某些案例中,路由註冊速度甚至能提高100倍!想要生成路由緩存,只需執行 Artisan 命令 :

php artisan route:cache

2、運行完成後,每次請求都會從緩存中讀取路由,所以如果你添加了新的路由需要重新生成路由緩存。因此,只有在項目部署階段才需要運行 route:cache 命令,本地開發環境完全無此必要,開發階段直接刪掉 bootstrap/cache/routes.php 文件即可。

想要移除緩存路由文件,使用 route:clear 命令即可:

php artisan route:clear

配置緩存:開發階段沒必要生成配置緩存文件,不然你每次更新.env文件都要執行:

php artisan config:cache

 

一、假如你使用了路由緩存文件,如果是laravel原生的路由一般重新加載配置和路由文件就能解決。

php artisan config:cache & php artisan route:cache

二、如果是使用Dingo等路由擴展包,第一次就容易出錯

1、清理路由緩存,報錯無果

php artisan api:cache
#執行後如果success 也會生成 bootstrap/cache/routes.php,這個命令將緩存你的 API 路由,和你主要應用的路由一起。當執行這個命令的時候會自動執行 route:cache 命令。所以執行完這個命令後就不要在執行 route:cache 了。

Unable to prepare route [/api/version] for serialization. Uses Closure

2、查看路由,沒有顯示,但其實我api.php寫的有路由閉包

#查看路由
php artisan api:routes
Your application doesn't have any routes.

#解釋:這個命令將生成你的 API 路由列表。這個命令的效果類似 Laravel 中的 route:list 命令。
除了標準的使用方法,你還可以使用以下的過濾器:--versions 和 --scopes。
例子
$ php artisan api:routes
$ php artisan api:routes --versions v1
$ php artisan api:routes --scopes read_user_data --scopes write_user_data

3、Postman訪問,400

The version given was unknown or has no registered routes

總結:不寫了,反正就是報錯嘛,究其原因爲:

1、laravel本身的  bootstrap/cache/routes.php  表示路由緩存,一般我們都是寫成控制器路由或資源路由的形式,它不支持路由閉包的形式。
2、DingoApi就是需要寫成閉包的形式。 

三:解決辦法:就是放棄使用laravel自帶的路由緩存,執行命令:

php artisan route:clear

這樣,bootstrap/cache/routes.php文件夾就消失了,當你執行laravel的:php artisan route:cache 或者Dingo的:php artisan api:cache,文件就又生成了,這個可以再項目上線後使用,加快路由加載速度。

 

 

DingoApi的三種寫法: 

#命名路由
$api->version('v1',[
    'namespace' => 'App\Http\Controllers',
], function ($api) {
    $api->post('reg',['as'=>'reg','uses'=>'ApiController@register']);
});

$api->version('v1',[
    'namespace' => 'App\Http\Controllers',
], function ($api) {
    $api->post('reg','ApiController@register');
});


$api->version('v1', function ($api) {
//    $api->get('reg', 'App\Http\Controllers\ApiController@register');
});



//下一個版本v2  ,對於網頁端接口來說命名路由好一點
$api->version('v2',[
    'namespace' => 'App\Http\Controllers',
], function ($api) {
    $api->post('reg',['as'=>'reg','uses'=>'ApiV2Controller@register']);
});

 

發佈了151 篇原創文章 · 獲贊 17 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章