Do not create a RouteActionHandler object for each route

This is not required and doesn't allow us to be properly lazy. On top of
it this doesnt allow us to cache the routes (since closures/objects
can't be cached).

This is the first small step into cleaning up the routing we have

Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
This commit is contained in:
Roeland Jago Douma 2020-07-01 09:45:46 +02:00
parent cd7a6276f2
commit edc1c77dd9
No known key found for this signature in database
GPG Key ID: F941078878347C0C
3 changed files with 28 additions and 22 deletions

View File

@ -140,12 +140,9 @@ class RouteConfig {
$routeName = $routeNamePrefix . $this->appName . '.' . $controller . '.' . $action . $postfix;
// register the route
$handler = new RouteActionHandler($this->container, $controllerName, $actionName);
$router = $this->router->create($routeName, $url)
->method($verb)
->action($handler);
->setDefault('caller', [$this->appName, $controllerName, $actionName]);
// optionally register requirements for route. This is used to
// tell the route parser how url parameters should be matched
@ -233,9 +230,9 @@ class RouteConfig {
$routeName = $routeNamePrefix . $this->appName . '.' . strtolower($resource) . '.' . strtolower($method);
$this->router->create($routeName, $url)->method($verb)->action(
new RouteActionHandler($this->container, $controllerName, $actionName)
);
$this->router->create($routeName, $url)
->method($verb)
->setDefault('caller', [$this->appName, $controllerName, $actionName]);
}
}
}

View File

@ -288,7 +288,12 @@ class Router implements IRouter {
}
\OC::$server->getEventLogger()->start('run_route', 'Run route');
if (isset($parameters['action'])) {
if (isset($parameters['caller'])) {
$caller = $parameters['caller'];
unset($parameters['caller']);
$application = $this->getApplicationClass($caller[0]);
\OC\AppFramework\App::main($caller[1], $caller[2], $application->getContainer(), $parameters);
} elseif (isset($parameters['action'])) {
$action = $parameters['action'];
if (!is_callable($action)) {
throw new \Exception('not a callable action');
@ -394,17 +399,22 @@ class Router implements IRouter {
*/
private function setupRoutes($routes, $appName) {
if (is_array($routes)) {
$appNameSpace = App::buildAppNamespace($appName);
$applicationClassName = $appNameSpace . '\\AppInfo\\Application';
if (class_exists($applicationClassName)) {
$application = \OC::$server->query($applicationClassName);
} else {
$application = new App($appName);
}
$application = $this->getApplicationClass($appName);
$application->registerRoutes($this, $routes);
}
}
private function getApplicationClass(string $appName) {
$appNameSpace = App::buildAppNamespace($appName);
$applicationClassName = $appNameSpace . '\\AppInfo\\Application';
if (class_exists($applicationClassName)) {
$application = \OC::$server->query($applicationClassName);
} else {
$application = new App($appName);
}
return $application;
}
}

View File

@ -3,7 +3,6 @@
namespace Test\AppFramework\Routing;
use OC\AppFramework\DependencyInjection\DIContainer;
use OC\AppFramework\Routing\RouteActionHandler;
use OC\AppFramework\Routing\RouteConfig;
use OC\Route\Route;
use OC\Route\Router;
@ -420,7 +419,7 @@ class RoutingTest extends \Test\TestCase {
array $defaults=[]
) {
$route = $this->getMockBuilder(Route::class)
->onlyMethods(['method', 'action', 'requirements', 'defaults'])
->onlyMethods(['method', 'setDefault', 'requirements', 'defaults'])
->disableOriginalConstructor()
->getMock();
$route
@ -431,8 +430,8 @@ class RoutingTest extends \Test\TestCase {
$route
->expects($this->once())
->method('action')
->with($this->equalTo(new RouteActionHandler($container, $controllerName, $actionName)))
->method('setDefault')
->with('caller', ['app1', $controllerName, $actionName])
->willReturn($route);
if (count($requirements) > 0) {