This commit is contained in:
xl
2024-08-29 17:01:08 +08:00
parent 337c52c744
commit c435af1156
15 changed files with 61 additions and 167 deletions
+5 -33
View File
@@ -5,50 +5,23 @@ namespace Kiri\Router\Base;
use Kiri; use Kiri;
use Kiri\Router\Response;
use Kiri\Router\Request; use Kiri\Router\Request;
use Psr\Container\ContainerInterface; use Psr\Container\ContainerInterface;
use Psr\Log\LoggerInterface;
use Psr\Http\Message\RequestInterface; use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ResponseInterface;
use Kiri\Di\Inject\Container;
/** /**
* Class WebController * Class WebController
* @package Kiri\Web * @package Kiri\Web
* @property RequestInterface $request
* @property ResponseInterface $response
* @property ContainerInterface $container
* @property Kiri\Error\StdoutLogger $logger
*/ */
abstract class Controller class Controller extends Kiri\Abstracts\Component
{ {
/**
* @var Request
*/
#[Container(RequestInterface::class)]
public RequestInterface $request;
/**
* @var Response
*/
#[Container(ResponseInterface::class)]
public ResponseInterface $response;
/**
* @var ContainerInterface
*/
#[Container(ContainerInterface::class)]
public ContainerInterface $container;
/**
* @var Kiri\Error\StdoutLogger
*/
#[Container(LoggerInterface::class)]
public Kiri\Error\StdoutLogger $logger;
/** /**
* @param Request $request * @param Request $request
* @return true * @return true
@@ -57,5 +30,4 @@ abstract class Controller
{ {
return true; return true;
} }
} }
+2 -9
View File
@@ -18,14 +18,6 @@ use Psr\Http\Server\RequestHandlerInterface;
class CoreMiddleware implements MiddlewareInterface class CoreMiddleware implements MiddlewareInterface
{ {
/**
* @var Response
*/
#[Container(ResponseInterface::class)]
public ResponseInterface $response;
/** /**
* @param Request $request * @param Request $request
* @param RequestHandlerInterface $handler * @param RequestHandlerInterface $handler
@@ -34,7 +26,8 @@ class CoreMiddleware implements MiddlewareInterface
*/ */
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
{ {
$this->response->withHeaders(['Access-Control-Allow-Headers' => '*', 'Access-Control-Request-Method' => '*', 'Access-Control-Allow-Origin' => '*']); $response = \Kiri::getDi()->get(ResponseInterface::class);
$response->withHeaders(['Access-Control-Allow-Headers' => '*', 'Access-Control-Request-Method' => '*', 'Access-Control-Allow-Origin' => '*']);
return $handler->handle($request); return $handler->handle($request);
} }
+21 -3
View File
@@ -4,6 +4,7 @@ declare(strict_types=1);
namespace Kiri\Router\Base; namespace Kiri\Router\Base;
use Kiri; use Kiri;
use Kiri\Router\Validator\Validator;
class Middleware class Middleware
{ {
@@ -12,12 +13,11 @@ class Middleware
/** /**
* @var array * @var array
*/ */
protected static array $manager = [];
protected static array $mapping = []; protected static array $mapping = [];
protected static array $validators = [];
/** /**
* @param string $className * @param string $className
* @param string $method * @param string $method
@@ -47,4 +47,22 @@ class Middleware
} }
/**
* @param string $path
* @param array $validators
*/
public static function setValidator(string $path, array $validators): void
{
self::$validators[$path] = $validators;
}
/**
* @param string $path
* @return Validator|null
*/
public static function getValidator(string $path): ?Validator
{
return static::$validators[$path] ?? null;
}
} }
+2 -10
View File
@@ -20,14 +20,6 @@ class ControllerInterpreter
{ {
/**
* @param ContainerInterface $container
*/
public function __construct(public ContainerInterface $container)
{
}
/** /**
* @param object $class * @param object $class
* @param string|ReflectionMethod $method * @param string|ReflectionMethod $method
@@ -38,7 +30,7 @@ class ControllerInterpreter
public function addRouteByString(object $class, string|ReflectionMethod $method, ?ReflectionClass $reflection = null): Handler public function addRouteByString(object $class, string|ReflectionMethod $method, ?ReflectionClass $reflection = null): Handler
{ {
if (is_null($reflection)) { if (is_null($reflection)) {
$reflection = $this->container->getReflectionClass($class::class); $reflection = Kiri::getDi()->getReflectionClass($class::class);
} }
return $this->resolveMethod($class, $method, $reflection); return $this->resolveMethod($class, $method, $reflection);
} }
@@ -71,7 +63,7 @@ class ControllerInterpreter
public function addRouteByObject(object $class, string|ReflectionMethod $method, ?ReflectionClass $reflection = null): Handler public function addRouteByObject(object $class, string|ReflectionMethod $method, ?ReflectionClass $reflection = null): Handler
{ {
if (is_null($reflection)) { if (is_null($reflection)) {
$reflection = $this->container->getReflectionClass($class::class); $reflection = Kiri::getDi()->getReflectionClass($class::class);
} }
return $this->resolveMethod($class, $method, $reflection); return $this->resolveMethod($class, $method, $reflection);
} }
+1 -9
View File
@@ -9,21 +9,13 @@ use Psr\Http\Message\ResponseInterface;
class ArrayFormat implements IFormat class ArrayFormat implements IFormat
{ {
/**
* @var ResponseInterface
*/
#[Container(ResponseInterface::class)]
public ResponseInterface $response;
/** /**
* @param $result * @param $result
* @return ResponseInterface * @return ResponseInterface
*/ */
public function call($result): ResponseInterface public function call($result): ResponseInterface
{ {
return $this->response->withBody(new Stream(json_encode($result, JSON_UNESCAPED_UNICODE))); return di(ResponseInterface::class)->withBody(new Stream(json_encode($result, JSON_UNESCAPED_UNICODE)));
} }
+5 -13
View File
@@ -2,22 +2,13 @@
namespace Kiri\Router\Format; namespace Kiri\Router\Format;
use Kiri\Di\Inject\Container; use Kiri;
use Kiri\Router\Constrict\Stream; use Kiri\Router\Constrict\Stream;
use Kiri\Router\ContentType;
use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ResponseInterface;
class MixedFormat implements IFormat class MixedFormat implements IFormat
{ {
/**
* @var ResponseInterface
*/
#[Container(ResponseInterface::class)]
public ResponseInterface $response;
/** /**
* @param mixed $result * @param mixed $result
* @return ResponseInterface * @return ResponseInterface
@@ -27,13 +18,14 @@ class MixedFormat implements IFormat
if ($result instanceof ResponseInterface) { if ($result instanceof ResponseInterface) {
return $result; return $result;
} }
$response = Kiri::getDi()->get(ResponseInterface::class);
if (is_object($result)) { if (is_object($result)) {
return $this->response->withBody(new Stream('[object]')); return $response->withBody(new Stream('[object]'));
} }
if (is_array($result)) { if (is_array($result)) {
return $this->response->withBody(new Stream(json_encode($result, JSON_UNESCAPED_UNICODE))); return $response->withBody(new Stream(json_encode($result, JSON_UNESCAPED_UNICODE)));
} else { } else {
return $this->response->withBody(new Stream((string)$result)); return $response->withBody(new Stream((string)$result));
} }
} }
+6 -14
View File
@@ -2,22 +2,13 @@
namespace Kiri\Router\Format; namespace Kiri\Router\Format;
use Kiri\Di\Inject\Container; use Kiri;
use Kiri\Router\Constrict\Stream; use Kiri\Router\Constrict\Stream;
use Kiri\Router\ContentType;
use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ResponseInterface;
class NoBody implements IFormat class NoBody implements IFormat
{ {
/**
* @var ResponseInterface
*/
#[Container(ResponseInterface::class)]
public ResponseInterface $response;
/** /**
* @param $result * @param $result
* @return ResponseInterface * @return ResponseInterface
@@ -25,19 +16,20 @@ class NoBody implements IFormat
public function call($result): ResponseInterface public function call($result): ResponseInterface
{ {
// TODO: Implement call() method. // TODO: Implement call() method.
$response = Kiri::getDi()->get(ResponseInterface::class);
if (request()->getMethod() === 'HEAD') { if (request()->getMethod() === 'HEAD') {
return $this->response->withBody(new Stream()); return $response->withBody(new Stream());
} }
if ($result instanceof ResponseInterface) { if ($result instanceof ResponseInterface) {
return $result; return $result;
} }
if (is_object($result)) { if (is_object($result)) {
return $this->response->withBody(new Stream('[object]')); return $response->withBody(new Stream('[object]'));
} }
if (is_array($result)) { if (is_array($result)) {
return $this->response->withBody(new Stream(json_encode($result, JSON_UNESCAPED_UNICODE))); return $response->withBody(new Stream(json_encode($result, JSON_UNESCAPED_UNICODE)));
} else { } else {
return $this->response->withBody(new Stream((string)$result)); return $response->withBody(new Stream((string)$result));
} }
} }
} }
+1 -9
View File
@@ -9,21 +9,13 @@ use Psr\Http\Message\ResponseInterface;
class OtherFormat implements IFormat class OtherFormat implements IFormat
{ {
/**
* @var ResponseInterface
*/
#[Container(ResponseInterface::class)]
public ResponseInterface $response;
/** /**
* @param mixed $result * @param mixed $result
* @return ResponseInterface * @return ResponseInterface
*/ */
public function call(mixed $result): ResponseInterface public function call(mixed $result): ResponseInterface
{ {
return $this->response->withBody(new Stream($result)); return di(ResponseInterface::class)->withBody(new Stream($result));
} }
+1 -10
View File
@@ -8,15 +8,6 @@ use Psr\Http\Message\ResponseInterface;
class VoidFormat implements IFormat class VoidFormat implements IFormat
{ {
/**
* @var ResponseInterface
*/
#[Container(ResponseInterface::class)]
public ResponseInterface $response;
/** /**
* @param $result * @param $result
* @return ResponseInterface * @return ResponseInterface
@@ -24,7 +15,7 @@ class VoidFormat implements IFormat
public function call($result): ResponseInterface public function call($result): ResponseInterface
{ {
// TODO: Implement call() method. // TODO: Implement call() method.
return $this->response; return di(ResponseInterface::class);
} }
} }
-6
View File
@@ -36,12 +36,6 @@ class Handler implements RequestHandlerInterface
protected array $methods = []; protected array $methods = [];
/**
* @var ContainerInterface
*/
protected ContainerInterface $container;
/** /**
* @param array|Closure $handler * @param array|Closure $handler
* @param array $parameters * @param array $parameters
+8 -23
View File
@@ -6,12 +6,10 @@ namespace Kiri\Router;
use Closure; use Closure;
use Kiri;
use Kiri\Router\Base\NotFoundController; use Kiri\Router\Base\NotFoundController;
use Kiri\Router\Constrict\RequestMethod; use Kiri\Router\Constrict\RequestMethod;
use Kiri\Di\Inject\Container; use Kiri\Di\Inject\Container;
use Psr\Container\ContainerInterface; use Psr\Container\ContainerInterface;
use ReflectionMethod;
use Throwable; use Throwable;
use Traversable; use Traversable;
use Kiri\Router\Base\Middleware; use Kiri\Router\Base\Middleware;
@@ -61,20 +59,6 @@ class RouterCollector implements \ArrayAccess, \IteratorAggregate
protected Handler $found; protected Handler $found;
/**
* @var ControllerInterpreter
*/
#[Container(ControllerInterpreter::class)]
public ControllerInterpreter $interpreter;
/**
* @var ContainerInterface
*/
#[Container(ContainerInterface::class)]
public ContainerInterface $container;
/** /**
* @throws * @throws
*/ */
@@ -133,11 +117,11 @@ class RouterCollector implements \ArrayAccess, \IteratorAggregate
{ {
try { try {
$route = $this->_splicing_routing($route); $route = $this->_splicing_routing($route);
// if ($closure instanceof Closure) { if ($closure instanceof Closure) {
// $handler = $this->interpreter->addRouteByClosure($closure); $handler = di(ControllerInterpreter::class)->addRouteByClosure($closure);
// } else { } else {
// } $handler = $this->resolve($closure, di(ControllerInterpreter::class));
$handler = $this->resolve($closure, $this->interpreter); }
foreach ($method as $value) { foreach ($method as $value) {
if ($value instanceof RequestMethod) { if ($value instanceof RequestMethod) {
$value = $value->getString(); $value = $value->getString();
@@ -184,9 +168,10 @@ class RouterCollector implements \ArrayAccess, \IteratorAggregate
*/ */
private function resolve(string|array $closure, ControllerInterpreter $interpreter): Handler private function resolve(string|array $closure, ControllerInterpreter $interpreter): Handler
{ {
$container = \Kiri::getDi();
if (is_array($closure)) { if (is_array($closure)) {
if (is_string($closure[0])) { if (is_string($closure[0])) {
$closure[0] = $this->container->get($closure[0]); $closure[0] = $container->get($closure[0]);
} }
return $interpreter->addRouteByString(... $closure); return $interpreter->addRouteByString(... $closure);
} }
@@ -194,7 +179,7 @@ class RouterCollector implements \ArrayAccess, \IteratorAggregate
$closure .= '@'; $closure .= '@';
} }
[$className, $method] = explode('@', $closure); [$className, $method] = explode('@', $closure);
$class = $this->container->get($this->resetName($className)); $class = $container->get($this->resetName($className));
return $interpreter->addRouteByString($class, $method); return $interpreter->addRouteByString($class, $method);
} }
+2 -3
View File
@@ -35,12 +35,11 @@ class SwooleHttpResponseEmitter implements ResponseEmitterInterface
/** /**
* @param EventDispatch $dispatch * @param EventDispatch $dispatch
* @param EventProvider $provider
*/ */
public function __construct(readonly public EventDispatch $dispatch, readonly public EventProvider $provider) public function __construct(readonly public EventDispatch $dispatch)
{ {
$this->afterRequest = new OnAfterRequest(); $this->afterRequest = new OnAfterRequest();
$this->events = $this->provider->getListenersForEvent($this->afterRequest); $this->events = di(EventProvider::class)->getListenersForEvent($this->afterRequest);
} }
+1 -11
View File
@@ -7,22 +7,12 @@ use Kiri\Di\Interface\ResponseEmitterInterface;
use Kiri\Events\EventDispatch; use Kiri\Events\EventDispatch;
use Kiri\Events\EventProvider; use Kiri\Events\EventProvider;
use Kiri\Server\Events\OnAfterRequest; use Kiri\Server\Events\OnAfterRequest;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\NotFoundExceptionInterface;
use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ResponseInterface;
use ReflectionException;
use SplPriorityQueue; use SplPriorityQueue;
class SwowHttpResponseEmitter implements ResponseEmitterInterface class SwowHttpResponseEmitter implements ResponseEmitterInterface
{ {
/**
* @var EventProvider
*/
#[Container(EventProvider::class)]
public EventProvider $provider;
/** /**
* @var EventDispatch * @var EventDispatch
*/ */
@@ -48,7 +38,7 @@ class SwowHttpResponseEmitter implements ResponseEmitterInterface
public function init(): void public function init(): void
{ {
$this->afterRequest = new OnAfterRequest(); $this->afterRequest = new OnAfterRequest();
$this->events = $this->provider->getListenersForEvent($this->afterRequest); $this->events = di(EventProvider::class)->getListenersForEvent($this->afterRequest);
} }
+2 -1
View File
@@ -56,7 +56,8 @@ class BindForm implements InjectParameterInterface
$middleware = \instance(ValidatorMiddleware::class); $middleware = \instance(ValidatorMiddleware::class);
$middleware->validator = $validator; $middleware->validator = $validator;
// Middleware::set($class, $method, $middleware);
Middleware::set($class, $method, $middleware);
return $validator->getFormData(); return $validator->getFormData();
} }
+4 -13
View File
@@ -3,7 +3,7 @@ declare(strict_types=1);
namespace Kiri\Router\Validator; namespace Kiri\Router\Validator;
use Kiri\Di\Inject\Container; use Kiri\Router\Base\Middleware;
use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\MiddlewareInterface; use Psr\Http\Server\MiddlewareInterface;
@@ -16,16 +16,6 @@ class ValidatorMiddleware implements MiddlewareInterface
{ {
public Validator $validator;
/**
* @var ResponseInterface
*/
#[Container(ResponseInterface::class)]
public ResponseInterface $response;
/** /**
* @param ServerRequestInterface $request * @param ServerRequestInterface $request
* @param RequestHandlerInterface $handler * @param RequestHandlerInterface $handler
@@ -34,8 +24,9 @@ class ValidatorMiddleware implements MiddlewareInterface
*/ */
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
{ {
if (!$this->validator->run($request)) { $validator = Middleware::getValidator($request->getMethod() . '::' . $request->getUri()->getPath());
return $this->response->html($this->validator->error(), 415); if (!$validator->run($request)) {
return di(ResponseInterface::class)->html($validator->error(), 415);
} else { } else {
return $handler->handle($request); return $handler->handle($request);
} }