fix sandbox

This commit is contained in:
joyqi 2021-09-05 11:09:06 +08:00
parent 6123f3ae62
commit d24a16ad23
3 changed files with 16 additions and 14 deletions

View File

@ -118,14 +118,14 @@ abstract class Widget
* @param class-string $alias 组件别名
* @param mixed $params 传递的参数
* @param mixed $request 前端参数
* @param bool|callable $call 回调
* @param bool|callable $disableSandboxOrCallback 回调
* @return Widget
*/
public static function widget(
string $alias,
$params = null,
$request = null,
$call = true
$disableSandboxOrCallback = true
): Widget {
[$className] = explode('@', $alias);
$key = Common::nativeClassName($alias);
@ -136,22 +136,22 @@ abstract class Widget
$sandbox = false;
if (isset($request) || $call === false || is_callable($call)) {
if ($disableSandboxOrCallback === false || is_callable($disableSandboxOrCallback)) {
$sandbox = true;
Request::getInstance()->beginSandbox(new Config($request));
Response::getInstance()->beginSandbox();
}
if ($sandbox || !isset(self::$widgetPool[$key])) {
$requestObject = new WidgetRequest(Request::getInstance());
$requestObject = new WidgetRequest(Request::getInstance(), isset($request) ? new Config($request) : null);
$responseObject = new WidgetResponse(Request::getInstance(), Response::getInstance());
try {
$widget = new $className($requestObject, $responseObject, $params);
$widget->execute();
if ($sandbox && is_callable($call)) {
call_user_func($call, $widget);
if ($sandbox && is_callable($disableSandboxOrCallback)) {
call_user_func($disableSandboxOrCallback, $widget);
}
} catch (Terminal $e) {
$widget = $widget ?? null;
@ -175,12 +175,12 @@ abstract class Widget
*
* @param mixed $params
* @param mixed $request
* @param mixed $call
* @param bool|callable $disableSandboxOrCallback
* @return $this
*/
public static function alloc($params = null, $request = null, $call = true): Widget
public static function alloc($params = null, $request = null, $disableSandboxOrCallback = true): Widget
{
return self::widget(static::class, $params, $request, $call);
return self::widget(static::class, $params, $request, $disableSandboxOrCallback);
}
/**
@ -189,16 +189,16 @@ abstract class Widget
* @param string $alias
* @param mixed $params
* @param mixed $request
* @param mixed $call
* @param bool|callable $disableSandboxOrCallback
* @return $this
*/
public static function allocWithAlias(
string $alias,
$params = null,
$request = null,
$call = true
$disableSandboxOrCallback = true
): Widget {
return self::widget(static::class . '@' . $alias, $params, $request, $call);
return self::widget(static::class . '@' . $alias, $params, $request, $disableSandboxOrCallback);
}
/**

View File

@ -45,11 +45,12 @@ class Request
/**
* @param HttpRequest $request
* @param Config|null $params
*/
public function __construct(HttpRequest $request)
public function __construct(HttpRequest $request, ?Config $params = null)
{
$this->request = $request;
$this->params = new Config();
$this->params = $params ?? new Config();
}
/**

View File

@ -3,6 +3,7 @@
namespace Widget;
use Typecho\Common;
use Typecho\Response;
use Typecho\Widget;
if (!defined('__TYPECHO_ROOT_DIR__')) {