2023年9月13日14:14:05
webman版本1.5
php版本8.0
運行環(huán)境windows
測試項目:https://gitee.com/open-php/zx-webman-website
webman在跨域的時候,會有點不同因為第一個區(qū)別就是是否關(guān)閉自動路由
//關(guān)閉自動路由
Route::disableDefaultRoute();
如果不關(guān)閉路由只要簡單的在路由上掛上跨域中間件,如果開啟自動路由,就在config/middleware.php
添加就可以了
return [
'' => [
app\middleware\CrossDomain::class,//跨域請求
]
];
CrossDomain中間件的代碼
<?php
namespace app\middleware;
use Webman\MiddlewareInterface;
use Webman\Http\Response;
use Webman\Http\Request;
//跨域
class CrossDomain implements MiddlewareInterface
{
public function process(Request $request, callable $next): Response
{
// p(getTime() . self::class);
// 如果是options請求則返回一個空響應(yīng),否則繼續(xù)向洋蔥芯穿越,并得到一個響應(yīng)
$response = strtoupper($request->method()) === 'OPTIONS' ? response('', 204) : $next($request);
// 給響應(yīng)添加跨域相關(guān)的http頭
$response->withHeaders([
'Access-Control-Allow-Credentials' => 'true',
'Access-Control-Allow-Origin' => $request->header('origin', '*'),
'Access-Control-Allow-Methods' => $request->header('access-control-request-method', '*'),
'Access-Control-Allow-Headers' => $request->header('access-control-request-headers', '*'),
]);
return $response;
}
}
如果關(guān)閉自動路由掛在中間件就如下:
Route::group('/open', function () {
Route::get('/test', [app\controller\Web\TestController::class, 'index'])->name('測試');
Route::post('/uploadPic', [app\controller\Web\IndexController::class, 'uploadPic']);//上傳圖片文件
Route::post('/uploadFile', [app\controller\Web\IndexController::class, 'uploadFile']);//上傳普通文件
})->middleware([
app\middleware\CrossDomain::class,
app\middleware\ApiLog::class
]);
關(guān)閉自動路由的情況下需要額外配置一點東西
<?php
/**
* This file is part of webman.
*
* Licensed under The MIT License
* For full copyright and license information, please see the MIT-LICENSE.txt
* Redistributions of files must retain the above copyright notice.
*
* @author walkor<walkor@workerman.net>
* @copyright walkor<walkor@workerman.net>
* @link http://m.wtbis.cn/
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
use app\util\GlobalCode;
use Webman\Route;
use support\Request;
//請求不存在的url返回信息
Route::fallback(function (Request $request) {
$response = strtoupper($request->method()) === 'OPTIONS' ? response('', 204) : returnJson([GlobalCode::CODE => GlobalCode::NOT_FOUND, GlobalCode::MSG => '404 not found', GlobalCode::DATA => null]);
$response->withHeaders([
'Access-Control-Allow-Credentials' => 'true',
'Access-Control-Allow-Origin' => "*",
'Access-Control-Allow-Methods' => '*',
'Access-Control-Allow-Headers' => '*',
]);
return $response;
});
//關(guān)閉自動路由
Route::disableDefaultRoute();
//首頁
Route::get('/', function ($rquest) {
return view('index/view');
});
//前臺,api有權(quán)限
Route::group('/open', function () {
Route::get('/test', [app\controller\Web\TestController::class, 'index'])->name('測試');
Route::post('/uploadPic', [app\controller\Web\IndexController::class, 'uploadPic']);//上傳圖片文件
Route::post('/uploadFile', [app\controller\Web\IndexController::class, 'uploadFile']);//上傳普通文件
})->middleware([
app\middleware\CrossDomain::class,
app\middleware\ApiLog::class
]);
if (!function_exists('returnJson')) {
function returnJson(mixed $data = null, int $status = 200, array $headers = ['Content-Type' => 'application/json'], int $options = JSON_UNESCAPED_UNICODE): Response
{
return new Response($status, $headers, json_encode($data, $options));
}
}
group里面的Route::xxx需要全部改為any