在很早之前個人發(fā)布了一個 PHP CORS 中間件!最初的初衷是開發(fā)一個替代 barryvdh/laravel-cors 包的工具,這個包的缺點(diǎn)在于維護(hù)不夠,然后就是代碼量龐大,支持性也不多。當(dāng)然也有優(yōu)勢,首先專注于 Laravel 框架,然后 Satr 較多使用者較多。當(dāng)然大多數(shù)用來放到 Laravel 中夠用。
成都創(chuàng)新互聯(lián)公司服務(wù)項目包括興寧網(wǎng)站建設(shè)、興寧網(wǎng)站制作、興寧網(wǎng)頁制作以及興寧網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,興寧網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到興寧省份的部分城市,未來相信會繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
優(yōu)勢
PHP CORS Middleware 代碼量更少(核心代碼僅四個文件,每個文件拆分很精短),在 Laravel 中支持模式更多,首先就是常規(guī)的全站都附加跨域信息,然后是可選僅預(yù)檢,路由模式和匹配模式。有了這幾個模式支持,你可以指定特定路由跨域,也可以分配給組路透跨域等。
除了上述對 Laravel 支持外,還很好了支持以下方式:
● PHP 原生數(shù)組,可以使用數(shù)組來進(jìn)行跨域響應(yīng)頭信息的接收,開發(fā)者可以自由處理。
● 支持 PSR-7 的請求和響應(yīng)
● 支持 PSR-15 中間件
● 支持 Laravel/Lumen 框架
● 支持 Swoft 框架
● 支持 Slim 框架
● 支持 ThinkPHP 5 框架
缺點(diǎn)
支持了太多的框架,如果你僅在 Laravel 使用,代碼包中還包含了其他框架的支持代碼,但是總量非常低,代碼強(qiáng)迫癥者可能受不了,多余的支持代碼只有在對應(yīng)框架中才會生效和被加載。
本次版本更新內(nèi)容
隨著 PSR-15 的穩(wěn)定,針對 PSR-15 中間件接口進(jìn)行了重構(gòu)??梢愿臃奖愕呐渲?CORS 信息
增加 Swoft 框架支持見?
https://github.com/medz/cors/issues/6
本次更新內(nèi)容的具體使用
PSR-15 中間件
先創(chuàng)建一個實例:
use Medz\Cors\PSR\CorsMiddleware; // Settings. $settings = [ 'allow-credentials' => false, 'allow-headers' => ['*'], 'expose-headers' => [], 'origins' => ['*'], 'methods' => ['*'], 'max-age' => 0, ]; // $cors = new Medz\Cors\Cors($settings); // Create CORS instance. // Create CORS middleware instance $middleware = new CorsMiddleware($settings /* $cors */ /* , true */ /* 是否僅處理預(yù)檢 */); // TODO.
可以看出,新版本可以直接從中間件構(gòu)造參數(shù)進(jìn)行傳遞設(shè)置了,之前版本必須傳遞一個 Medz\Cors\Cors 實例,當(dāng)然,新版本也可以直接傳遞實例。第二個參數(shù)可以進(jìn)行配置是否僅處理預(yù)檢請求,默認(rèn)是處理全部請求。
Swoft 中間件
在配置文件 config/properties/app.php 中進(jìn)行如下配置:
'components' => [ 'custom' => [ 'Medz\\Cors\\Swoft\\', ], ], 'cors' => [ 'onlyPreflight' => false, // 是否僅 OPTIONS 預(yù)檢請求才進(jìn)行跨域信息附加 'settings' => [ /// ... 參考 README 中的 PSR-7 ], ],
全局使用
打開 app/config/beans/base.php 配置如下:
'serverDispatcher' => [ 'middlewares' => [ \Medz\Cors\Swoft\CorsMiddleware::class, ], ],
通過注解使用
通過 @Middleware 和 @Middlewares, 可以很方便的配置中間件到當(dāng)前的 Controller 和 Action 內(nèi)。
● 當(dāng)將此注解應(yīng)用于 Controller 上,則作用域為整個 Controller
● 將此注解應(yīng)用于 Action 上,則作用域僅為當(dāng)前的 Action
use Swoft\Http\Server\Bean\Annotation\Controller; use Swoft\Http\Message\Bean\Annotation\Middleware; use Swoft\Http\Server\Bean\Annotation\RequestMapping; use Medz\Cors\Swoft\CorsMiddleware; /** * Setting Controller middleware. * * @Controller("middleware") * @Middleware(CorsMiddleware::class) */ class CorsOneController { // } /** * Setting Action middleware. */ class CorsTwoController { /** * @RequestMapping() * @Middleware(CorsMiddleware::class) */ public function corsAction(): array { return [ 'message' => 'The action using CORS.' ]; } }