2023年9月13日14:14:05
webman版本1.5
php版本8.0
运行环境windows
测试项目:https://gitee.com/open-php/zx-webman-website
webman在跨域的时候,会有点不同因为第一个区别就是是否关闭自动路由
//关闭自动路由
Route::disableDefaultRoute();
如果不关闭路由只要简单的在路由上挂上跨域中间件,如果开启自动路由,就在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请求则返回一个空响应,否则继续向洋葱芯穿越,并得到一个响应
$response = strtoupper($request->method()) === 'OPTIONS' ? response('', 204) : $next($request);
// 给响应添加跨域相关的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;
}
}
如果关闭自动路由挂在中间件就如下:
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
]);
关闭自动路由的情况下需要额外配置一点东西
<?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://www.workerman.net/
* @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;
});
//关闭自动路由
Route::disableDefaultRoute();
//首页
Route::get('/', function ($rquest) {
return view('index/view');
});
//前台,api有权限
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
+1