之前由于沒好好看文檔,在跨域處理上浪費(fèi)了不少時間。
因為我是自定義路由的,又想使用標(biāo)準(zhǔn)restful api 路由,所以使用resource 配置起來比較方便,但是我發(fā)現(xiàn)加了跨域中間件后,就不能使用resource路由了。
另外由于為了不暴露某些路由 我不想使用any方法,因此每次都得addRoute 中 參數(shù)加一個OPTIONS ,比較麻煩。
因此今天重寫了一些路由類中的addRoute方法
代碼如下
<?php
namespace support;
use Webman\Route\Route as RouteObject;
class Route extends \Webman\Route
{
public static function addRoute($methods, string $path, $callback): RouteObject
{
// 針對 resource 路由 會重復(fù)addRoute 要保證最終methods 中只含有一個 OPTIONS
// 因此需要判斷當(dāng)前路由的methods中是否存在OPTIONS
$routes = static::getRoutes();
$has_options = false;
foreach ($routes as $route) {
if ($route->getPath() == $path && in_array('OPTIONS', $route->getMethods())) {
$has_options = true;
break;
}
}
if (!$has_options) {
// 針對只添加一次的路由,自動添加OPTIONS請求
$methods = is_array($methods) ? $methods : [$methods];
if (!in_array('OPTIONS', $methods)) {
$methods[] = 'OPTIONS';
}
}
return parent::addRoute($methods, $path, $callback); // TODO: Change the autogenerated stub
}
}
目前測試一切ok~ 有同樣需求的可以copy一下,邏輯也比較簡單。
這樣定義路由的時候,直接按照get post put 等方法配置就可以了,resource 測試也是ok的!