PHP CORS 是一個 PHP 跨域中間件,全名叫作 「PHP CORS Middleware」,專門用來處理基於 PHP 程序的 CORS 信息問題,主要針對在 PHP 程序中設置跨域信息的支持。php
只要在 ThinkPHP 5 的項目中依賴 medz/cors
便可。git
在 ThinkPHP 框架中,配置沒有什麼可選你能夠在 config 下面新建一個名爲 cors.php 的文件,或者在某一個模塊下面新建 cors.php 文件,甚至能夠在全局公用配置或者模塊公用配置中進行 cors 爲 key 的配置,其中配置內容請參考 https://github.com/medz/cors#...github
注入代碼參考自 ThinkPHP 官方的拓展包,首先咱們創建 src/ThinkPHP/injection.php
文件,而後在 composer.json
的 autoload 中使用 files 方式對該文件進行加載,代碼以下:json
<?php declare(strict_types=1); namespace Medz\Cors\ThinkPHP; if (!class_exists(\think\Container::class)) { return; } call_user_func(function (\think\Container $container) { $injecter = $container->make(Injecter::class); $injecter->register(); }, \think\Container::getInstance());
爲了避免影響其餘框架的使用,優先判斷 ThinkPHP 5 的容器類是否存在,若是存在,執行 call_user_func
,使用閉包進行包裝,而後使用容器蛋裏進行 Injector
實例。跨域
在 ThinkPHP 5 中使用 app_init
鉤子,做用是爲了在框架讀取模塊和全局配置後進行 CORS 服務的單例處理注入到容器中。
而後使用 response_send 在 Response
發送前進行攔截,並對其 CORS 信息的處理!閉包
由於框架獨佔了 OPTIONS 請求的綁定以及跨域信息的判斷處理,目前只能經過 response_send
鉤子攔截 Response 實現 CORS 處理!app
ThinkPHP 5.1 的中間件運行機制有問題,且無全局中間件機制。因此沒法經過中間件進行預處理!!!
在組件中有一份 psr-15 的接口中間件實現代碼,類名稱叫作 Medz\Cors\PSR\CorsMiddleware
你能夠用於任何使用 PSR-15 的地方。cors
項目 GitHub:https://github.com/medz/cors 歡迎 Satr! 謝謝!composer