Fix routing.

This commit is contained in:
Greyscale 2024-05-25 10:56:57 +01:00
parent d1e18f9c0f
commit 3f54c010b6
4 changed files with 30 additions and 68 deletions

View file

@ -24,31 +24,9 @@ abstract class Action
public function __construct(LoggerInterface $logger) public function __construct(LoggerInterface $logger)
{ {
$this->logger = $logger; $this->logger = $logger;
$this->response = new \Slim\Psr7\Response();
} }
/**
* @throws HttpNotFoundException
* @throws HttpBadRequestException
*/
public function __invoke(Request $request, Response $response, array $args): Response
{
$this->request = $request;
$this->response = $response;
$this->args = $args;
try {
return $this->action();
} catch (DomainRecordNotFoundException $e) {
throw new HttpNotFoundException($this->request, $e->getMessage());
}
}
/**
* @throws DomainRecordNotFoundException
* @throws HttpBadRequestException
*/
abstract protected function action(): Response;
/** /**
* @return array|object * @return array|object
*/ */

View file

@ -10,7 +10,7 @@ use Doctrine\Common\Annotations\Annotation\Required;
* @Annotation * @Annotation
* @Target("METHOD") * @Target("METHOD")
*/ */
class Route #[\Attribute] class Route
{ {
public array $methods = ['GET']; public array $methods = ['GET'];

View file

@ -46,6 +46,8 @@ use Monolog\Logger;
use Monolog\Processor\PsrLogMessageProcessor; use Monolog\Processor\PsrLogMessageProcessor;
use Psr\Container\ContainerInterface; use Psr\Container\ContainerInterface;
use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Message\ServerRequestInterface;
use Psr\Log\LoggerInterface;
use PushToLive\Kernel;
use SebastianBergmann\Timer\Timer; use SebastianBergmann\Timer\Timer;
use Slim; use Slim;
use Slim\Factory\AppFactory; use Slim\Factory\AppFactory;
@ -376,6 +378,10 @@ class App
return $monolog; return $monolog;
}); });
$container->set(LoggerInterface::class, function (Logger $logger) {
return $logger;
});
$container->set(Redis::class, function (ConfigurationService $configurationService, Logger $logger, EnvironmentService $environmentService) { $container->set(Redis::class, function (ConfigurationService $configurationService, Logger $logger, EnvironmentService $environmentService) {
return new Redis( return new Redis(
$logger, $logger,
@ -500,12 +506,9 @@ class App
public function runHttp(): void public function runHttp(): void
{ {
$timer = new Timer();
$timer->start();
$serverRequestCreator = ServerRequestCreatorFactory::create(); $serverRequestCreator = ServerRequestCreatorFactory::create();
$request = $serverRequestCreator->createServerRequestFromGlobals(); $request = $serverRequestCreator->createServerRequestFromGlobals();
$duration = $timer->stop(); Kernel::Timing();
\Kint::dump($duration->asSeconds());
$this->loadAllRoutes($request); $this->loadAllRoutes($request);
$this->debugBar['time']->startMeasure('runHTTP', 'HTTP runtime'); $this->debugBar['time']->startMeasure('runHTTP', 'HTTP runtime');
@ -618,6 +621,7 @@ class App
} }
$appClass = new \ReflectionClass(static::class); $appClass = new \ReflectionClass(static::class);
$this->router->loadRoutesFromAnnotations( $this->router->loadRoutesFromAnnotations(
[ [
APP_ROOT . '/src/Controllers', APP_ROOT . '/src/Controllers',
@ -625,11 +629,7 @@ class App
], ],
$appClass->getNamespaceName() $appClass->getNamespaceName()
); );
$this->router->cache(); $this->router->cache();
// $this->logger->info('ROUTE_CACHE miss.');
} }
public function getContainer(): ContainerInterface public function getContainer(): ContainerInterface
@ -641,11 +641,10 @@ class App
static public function Timing(){ static public function Timing(){
$duration = self::$timer->stop(); $duration = self::$timer->stop();
# Get caller # Get caller
$caller = debug_backtrace()[1]; $caller = debug_backtrace()[0];
if($duration->asSeconds() >= 1) { if($duration->asSeconds() >= 1) {
$timingMessage = sprintf("%f seconds: %s::%s (%s:%d)", $duration->asSeconds(), $caller['class'], $caller['function'], $caller['file'], $caller['line']); $timingMessage = sprintf("%f seconds: (%s:%d)", $duration->asSeconds(), $caller['file'], $caller['line']);
\Kint::dump($timingMessage); \Kint::dump($timingMessage);
self::DI(Logger::class)->debug($timingMessage);
} }
self::$timer->start(); self::$timer->start();

View file

@ -10,6 +10,7 @@ use Doctrine\Common\Annotations\AnnotationReader;
use Doctrine\Common\Annotations\AnnotationRegistry; use Doctrine\Common\Annotations\AnnotationRegistry;
use Monolog\Logger; use Monolog\Logger;
use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Message\ServerRequestInterface;
use PushToLive\Kernel;
use SebastianBergmann\Timer\Timer; use SebastianBergmann\Timer\Timer;
use Slim\App; use Slim\App;
@ -39,25 +40,11 @@ class Router
continue; continue;
} }
$timer = new Timer();
$timer->start();
$dirIterator = new \RecursiveDirectoryIterator($controllerPath); $dirIterator = new \RecursiveDirectoryIterator($controllerPath);
$duration = $timer->stop();
\Kint::dump($duration->asSeconds());
$timer = new Timer();
$timer->start();
$iteratorIterator = new \RecursiveIteratorIterator($dirIterator); $iteratorIterator = new \RecursiveIteratorIterator($dirIterator);
$duration = $timer->stop();
\Kint::dump($duration->asSeconds());
$timer = new Timer();
$timer->start();
$phpFiles = new \RegexIterator($iteratorIterator, '/^.+\.php$/i', \RecursiveRegexIterator::GET_MATCH); $phpFiles = new \RegexIterator($iteratorIterator, '/^.+\.php$/i', \RecursiveRegexIterator::GET_MATCH);
$duration = $timer->stop();
\Kint::dump($duration->asSeconds());
\Kint::dump($phpFiles);exit;
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 = [
@ -66,6 +53,7 @@ class Router
'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.', [ $this->logger->warning('While loading routes from annotations in {file}, expected class {expectedClass} does not exist.', [
@ -92,25 +80,22 @@ class Router
continue; continue;
} }
$routeAnnotation = $reader->getMethodAnnotation($method, \Benzine\Annotations\Route::class); $routeAttibutes = $method->getAttributes(\Benzine\Annotations\Route::class);
if (!$routeAnnotation instanceof \Benzine\Annotations\Route) { foreach($routeAttibutes as $routeAttibute){
// This isn't a route annotation. Somehow. foreach($routeAttibute->getArguments()['methods'] as $httpMethod){
continue; $newRoute = (new Route())
} ->setHttpMethod($httpMethod)
->setRouterPattern('/' . ltrim($routeAttibute->getArguments()['path'], '/'))
foreach ($routeAnnotation->methods as $httpMethod) { ->setCallback($expectedClass . ':' . $method->name)
$newRoute = (new Route()) ->setWeight($routeAttibute->getArguments()['weight'] ?? 100)
->setHttpMethod($httpMethod) ;
->setRouterPattern('/' . ltrim($routeAnnotation->path, '/')) if(isset($routeAttibute->getArguments()['domains']) && is_array($routeAttibute->getArguments()['domains'])){
->setCallback($expectedClass . ':' . $method->name) foreach ($routeAttibute->getArguments()['domains'] as $domain) {
->setWeight($routeAnnotation->weight) $newRoute->addValidDomain($domain);
; }
}
foreach ($routeAnnotation->domains as $domain) { $this->addRoute($newRoute);
$newRoute->addValidDomain($domain);
} }
$this->addRoute($newRoute);
} }
} }