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