Actions structs

This commit is contained in:
Greyscale 2024-04-14 18:11:14 +02:00
parent 2780e16794
commit b492d7cfc1
2 changed files with 20 additions and 18 deletions

View file

@ -599,6 +599,7 @@ class App
$this->router->loadRoutesFromAnnotations( $this->router->loadRoutesFromAnnotations(
[ [
APP_ROOT . '/src/Controllers', APP_ROOT . '/src/Controllers',
APP_ROOT . '/src/Actions',
], ],
$appClass->getNamespaceName() $appClass->getNamespaceName()
); );

View file

@ -15,18 +15,16 @@ use Slim\App;
class Router class Router
{ {
/** @var Route[] */ /** @var Route[] */
private array $routes = []; protected array $routes = [];
private Logger $logger; protected int $cacheTTL = 60;
private CachePoolChain $cachePoolChain;
private int $cacheTTL = 60;
private bool $routesArePopulated = false; private bool $routesArePopulated = false;
public function __construct(Logger $logger, CachePoolChain $cachePoolChain) public function __construct(
{ protected Logger $logger,
$this->logger = $logger; protected CachePoolChain $cachePoolChain
$this->cachePoolChain = $cachePoolChain; )
} {}
public function loadRoutesFromAnnotations( public function loadRoutesFromAnnotations(
array $controllerPaths, array $controllerPaths,
@ -48,41 +46,44 @@ class Router
foreach ($phpFiles as $controllerFile) { foreach ($phpFiles as $controllerFile) {
$fileClassName = ltrim(str_replace([$controllerPath, '/', '.php'], ['', '\\', ''], $controllerFile[0]), '\\'); $fileClassName = ltrim(str_replace([$controllerPath, '/', '.php'], ['', '\\', ''], $controllerFile[0]), '\\');
$expectedClasses = [ $expectedClasses = [
$baseNamespace . '\\Actions\\' . $fileClassName,
$baseNamespace . '\\Controllers\\' . $fileClassName, $baseNamespace . '\\Controllers\\' . $fileClassName,
'Benzine\\Controllers\\' . $fileClassName, 'Benzine\\Controllers\\' . $fileClassName,
]; ];
foreach ($expectedClasses as $expectedClass) { foreach ($expectedClasses as $expectedClass) {
if (!class_exists($expectedClass)) { if (!class_exists($expectedClass)) {
$this->logger->warning("While loading routes from annotations in {file}, expected class {expectedClass} does not exist.", [
'file' => $controllerFile[0],
'expectedClass' => $expectedClass,
]);
continue; continue;
} }
$rc = new \ReflectionClass($expectedClass); $rc = new \ReflectionClass($expectedClass);
if ($rc->isAbstract()) { if ($rc->isAbstract()) {
$this->logger->warning("While loading routes from annotations in {file}, expected class {expectedClass} is abstract.", [
'file' => $controllerFile[0],
'expectedClass' => $expectedClass,
]);
continue; continue;
} }
// \Kint::dump(
// $expectedClass,
// $rc
// );
foreach ($rc->getMethods() as $method) { foreach ($rc->getMethods() as $method) {
if (!$method->isPublic()) { if (!$method->isPublic()) {
// Non public methods can't have actions called on them
continue; continue;
} }
$routeAnnotation = $reader->getMethodAnnotation($method, \Benzine\Annotations\Route::class); $routeAnnotation = $reader->getMethodAnnotation($method, \Benzine\Annotations\Route::class);
if (!$routeAnnotation instanceof \Benzine\Annotations\Route) { if (!$routeAnnotation instanceof \Benzine\Annotations\Route) {
// This isn't a route annotation. Somehow.
continue; continue;
} }
foreach ($routeAnnotation->methods as $httpMethod) { foreach ($routeAnnotation->methods as $httpMethod) {
$newRoute = new Route();
// \Kint::dump($method); $newRoute = (new Route())
// exit;
$newRoute
->setHttpMethod($httpMethod) ->setHttpMethod($httpMethod)
->setRouterPattern('/' . ltrim($routeAnnotation->path, '/')) ->setRouterPattern('/' . ltrim($routeAnnotation->path, '/'))
->setCallback($expectedClass . ':' . $method->name) ->setCallback($expectedClass . ':' . $method->name)