感謝老大,原因為注冊options路由的Route::options('[{path:.+}]', function () {});
寫法為匿名函數,而webman判斷路由是否為屬于應用插件是由命名空間判斷的,匿名函數沒有這些東西 所以就沒有走應用插件的中間件.
應用插件中配置了中間件處理跨域請求,發(fā)現請求沒有經過中間件。
這里粘代碼
應用插件中的config/middleware.php截圖
中間件代碼截圖
應用插件中route.php代碼截圖
發(fā)送請求后:
options請求沒報錯 但是響應頭不全,控制臺只輸出了"option router"未輸出"corsMiddleware"
post請求報錯 控制臺無任何輸出
--
這里寫具體的系統環(huán)境相關信息
更新一下 我繼續(xù)調試的過程
我給中間件加了一個構造函數參數 如圖:
然后再在config/middleware.php
和/應用插件目錄/config/middleware.php
分別都引入了這個中間件并傳入不同的參數:
[
'' => [
new \plugin\RainAdmin\app\middleware\CorsMiddleware("項目中間件") // 或'應用插件中間件'
]
]
請求的目標控制器方法(控制器存在于應用插件內):
public function login(Request $request) {
return json(["data" => 123]);
}
發(fā)起請求后發(fā)現瀏覽器中請求成功返回了結果,控制臺的輸出為:
項目中間件----OPTIONS---- Before
項目中間件----OPTIONS---- After
應用插件中間件----POST---- Before
應用插件中間件----POST---- After
預檢請求在項目中間件中直接被返回了(代碼邏輯控制的我能理解),但是為什么POST請求沒有經過項目中間件...
我又再次測試,將項目/config/middleware.php中引入的中間件注釋掉,發(fā)現POST直接請求不通了,控制欄中輸出為空 但是OPTIONS請求依然可以請求通(這就是開貼時的情況)。
我再次測試 將注釋的中間件恢復,把控制器中的方法改寫為了:
public function login(Request $request) {
throw new BusinessException("test");
}
結果請求又不通了,瀏覽器報CORS錯誤,控制臺輸出為:
項目中間件----OPTIONS---- Before
項目中間件----OPTIONS---- After
應用插件中間件----POST---- Before
應用插件中間件----POST---- After
我將應用插件內的middleware.php中引入中間件的代碼注釋后請求又正常了。
控制臺中輸出
項目中間件----OPTIONS---- Before
項目中間件----OPTIONS---- After
注:我在應用插件內exception.php指定了異常處理類并在response中加入了中間件中同樣的響應頭