在很早之前個人釋出了一個 PHP CORS 中介軟體!最初的初衷是開發一個替代 barryvdh/laravel-cors 包的工具,這個包的缺點在於維護不夠,然後就是程式碼量龐大,支援性也不多。當然也有優勢,首先專注於 Laravel 框架,然後 Satr 較多使用者較多。當然大多數用來放到 Laravel 中夠用。
優勢
PHP CORS Middleware 程式碼量更少(核心程式碼僅四個檔案,每個檔案拆分很精短),在 Laravel 中支援模式更多,首先就是常規的全站都附加跨域資訊,然後是可選僅預檢,路由模式和匹配模式。有了這幾個模式支援,你可以指定特定路由跨域,也可以分配給組路透跨域等。
除了上述對 Laravel 支援外,嗨很好了支援以下方式:
- PHP 原生陣列,可以使用陣列來進行跨域響應頭資訊的接收,開發者可以自由處理。
- 支援 PSR-7 的請求和響應
- 支援 PSR-15 中介軟體
- 支援 Laravel/Lumen 框架
- 支援 Swoft 框架
- 支援 Slim 框架
- 支援 ThinkPHP 5 框架
缺點
支援了太多的框架,如果你僅在 Laravel 使用,程式碼包中還包含了其他框架的支援程式碼,但是總量非常低,程式碼強迫症者可能受不了,多餘的支援程式碼只有在對應框架中才會生效和被載入。
本次版本更新內容
- 隨著 PSR-15 的穩定,針對 PSR-15 中介軟體介面進行了重構。可以更加方便的配置 CORS 資訊
- 增加 Swoft 框架支援見?https://github.com/medz/cors/issues/6
本次更新內容的具體使用
PSR-15 中介軟體
先建立一個例項:
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 */ /* 是否僅處理預檢 */);
// TODO.
可以看出,新版本可以直接從中介軟體構造引數進行傳遞設定了,之前版本必須傳遞一個 Medz\Cors\Cors
例項,當然,新版本也可以直接傳遞例項。第二個引數可以進行配置是否僅處理預檢請求,預設是處理全部請求。
Swoft 中介軟體
在配置檔案 config/properties/app.php 中進行如下配置:
'components' => [
'custom' => [
'Medz\\Cors\\Swoft\\',
],
],
'cors' => [
'onlyPreflight' => false, // 是否僅 OPTIONS 預檢請求才進行跨域資訊附加
'settings' => [
/// ... 參考 README 中的 PSR-7
],
],
全域性使用
開啟 app/config/beans/base.php 配置如下:
'serverDispatcher' => [
'middlewares' => [
\Medz\Cors\Swoft\CorsMiddleware::class,
],
],
通過註解使用
通過 @Middleware 和 @Middlewares, 可以很方便的配置中介軟體到當前的 Controller 和 Action 內。
- 當將此註解應用於 Controller 上,則作用域為整個 Controller
- 將此註解應用於 Action 上,則作用域僅為當前的 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.'
];
}
}
其他
CORS 專案地址 https://github.com/medz/cors ,如果喜歡,歡迎 Star 歡迎 Issues 歡迎 PR。
Seven 的程式碼太渣,歡迎關注我的新擴充包 medz/cors 解決 PHP 專案程式設定跨域需求。