From ebcfe57bb81aa4cd0c37d1ba4dd4a51f9f0a4e92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elan=20Ruusam=C3=A4e?= Date: Mon, 21 Dec 2020 18:08:21 +0200 Subject: [PATCH 01/10] Move templates out of src dir --- .dockerignore | 1 + Dockerfile | 1 + src/Xhgui/ServiceContainer.php | 2 +- {src/templates => templates}/custom/create.twig | 0 {src/templates => templates}/custom/help.twig | 0 {src/templates => templates}/error/view.twig | 0 {src/templates => templates}/layout/base.twig | 0 {src/templates => templates}/macros/helpers.twig | 0 {src/templates => templates}/runs/callgraph.twig | 0 {src/templates => templates}/runs/compare-details.twig | 0 {src/templates => templates}/runs/compare.twig | 0 {src/templates => templates}/runs/delete-all-form.twig | 0 {src/templates => templates}/runs/delete-form.twig | 0 {src/templates => templates}/runs/list.twig | 0 {src/templates => templates}/runs/paginated-list.twig | 0 {src/templates => templates}/runs/symbol-short.twig | 0 {src/templates => templates}/runs/symbol.twig | 0 {src/templates => templates}/runs/url.twig | 0 {src/templates => templates}/runs/view.twig | 0 {src/templates => templates}/watch/list.twig | 0 {src/templates => templates}/waterfall/list.twig | 0 21 files changed, 3 insertions(+), 1 deletion(-) rename {src/templates => templates}/custom/create.twig (100%) rename {src/templates => templates}/custom/help.twig (100%) rename {src/templates => templates}/error/view.twig (100%) rename {src/templates => templates}/layout/base.twig (100%) rename {src/templates => templates}/macros/helpers.twig (100%) rename {src/templates => templates}/runs/callgraph.twig (100%) rename {src/templates => templates}/runs/compare-details.twig (100%) rename {src/templates => templates}/runs/compare.twig (100%) rename {src/templates => templates}/runs/delete-all-form.twig (100%) rename {src/templates => templates}/runs/delete-form.twig (100%) rename {src/templates => templates}/runs/list.twig (100%) rename {src/templates => templates}/runs/paginated-list.twig (100%) rename {src/templates => templates}/runs/symbol-short.twig (100%) rename {src/templates => templates}/runs/symbol.twig (100%) rename {src/templates => templates}/runs/url.twig (100%) rename {src/templates => templates}/runs/view.twig (100%) rename {src/templates => templates}/watch/list.twig (100%) rename {src/templates => templates}/waterfall/list.twig (100%) diff --git a/.dockerignore b/.dockerignore index f51c422df..352b0672c 100644 --- a/.dockerignore +++ b/.dockerignore @@ -5,5 +5,6 @@ !/config/ !/external/ !/src/ +!/templates/ !/vendor/ !/webroot/ diff --git a/Dockerfile b/Dockerfile index 279873cfa..ede5fcbcb 100644 --- a/Dockerfile +++ b/Dockerfile @@ -89,6 +89,7 @@ RUN composer install $COMPOSER_FLAGS --no-scripts --no-autoloader # copy rest of the project. copy in order that is least to most changed COPY --from=source /app/webroot ./webroot COPY --from=source /app/external ./external +COPY --from=source /app/templates ./templates COPY --from=source /app/src ./src COPY --from=source /app/config ./config diff --git a/src/Xhgui/ServiceContainer.php b/src/Xhgui/ServiceContainer.php index 9f3222d82..7a1b7f9c6 100644 --- a/src/Xhgui/ServiceContainer.php +++ b/src/Xhgui/ServiceContainer.php @@ -55,7 +55,7 @@ protected function _slimApp() // Configure Twig view for slim $view = new Twig(); - $view->twigTemplateDirs = [dirname(__DIR__) . '/templates']; + $view->twigTemplateDirs = [dirname(__DIR__, 2) . '/templates']; $view->parserOptions = [ 'charset' => 'utf-8', 'cache' => $cacheDir, diff --git a/src/templates/custom/create.twig b/templates/custom/create.twig similarity index 100% rename from src/templates/custom/create.twig rename to templates/custom/create.twig diff --git a/src/templates/custom/help.twig b/templates/custom/help.twig similarity index 100% rename from src/templates/custom/help.twig rename to templates/custom/help.twig diff --git a/src/templates/error/view.twig b/templates/error/view.twig similarity index 100% rename from src/templates/error/view.twig rename to templates/error/view.twig diff --git a/src/templates/layout/base.twig b/templates/layout/base.twig similarity index 100% rename from src/templates/layout/base.twig rename to templates/layout/base.twig diff --git a/src/templates/macros/helpers.twig b/templates/macros/helpers.twig similarity index 100% rename from src/templates/macros/helpers.twig rename to templates/macros/helpers.twig diff --git a/src/templates/runs/callgraph.twig b/templates/runs/callgraph.twig similarity index 100% rename from src/templates/runs/callgraph.twig rename to templates/runs/callgraph.twig diff --git a/src/templates/runs/compare-details.twig b/templates/runs/compare-details.twig similarity index 100% rename from src/templates/runs/compare-details.twig rename to templates/runs/compare-details.twig diff --git a/src/templates/runs/compare.twig b/templates/runs/compare.twig similarity index 100% rename from src/templates/runs/compare.twig rename to templates/runs/compare.twig diff --git a/src/templates/runs/delete-all-form.twig b/templates/runs/delete-all-form.twig similarity index 100% rename from src/templates/runs/delete-all-form.twig rename to templates/runs/delete-all-form.twig diff --git a/src/templates/runs/delete-form.twig b/templates/runs/delete-form.twig similarity index 100% rename from src/templates/runs/delete-form.twig rename to templates/runs/delete-form.twig diff --git a/src/templates/runs/list.twig b/templates/runs/list.twig similarity index 100% rename from src/templates/runs/list.twig rename to templates/runs/list.twig diff --git a/src/templates/runs/paginated-list.twig b/templates/runs/paginated-list.twig similarity index 100% rename from src/templates/runs/paginated-list.twig rename to templates/runs/paginated-list.twig diff --git a/src/templates/runs/symbol-short.twig b/templates/runs/symbol-short.twig similarity index 100% rename from src/templates/runs/symbol-short.twig rename to templates/runs/symbol-short.twig diff --git a/src/templates/runs/symbol.twig b/templates/runs/symbol.twig similarity index 100% rename from src/templates/runs/symbol.twig rename to templates/runs/symbol.twig diff --git a/src/templates/runs/url.twig b/templates/runs/url.twig similarity index 100% rename from src/templates/runs/url.twig rename to templates/runs/url.twig diff --git a/src/templates/runs/view.twig b/templates/runs/view.twig similarity index 100% rename from src/templates/runs/view.twig rename to templates/runs/view.twig diff --git a/src/templates/watch/list.twig b/templates/watch/list.twig similarity index 100% rename from src/templates/watch/list.twig rename to templates/watch/list.twig diff --git a/src/templates/waterfall/list.twig b/templates/waterfall/list.twig similarity index 100% rename from src/templates/waterfall/list.twig rename to templates/waterfall/list.twig From 72f83357d267f2598cd5133fcc69cb084ea214a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elan=20Ruusam=C3=A4e?= Date: Mon, 21 Dec 2020 18:37:24 +0200 Subject: [PATCH 02/10] Remove "Xhgui" from classes path --- composer.json | 2 +- src/{Xhgui => }/AbstractController.php | 0 src/{Xhgui => }/Config.php | 0 src/{Xhgui => }/Controller/CustomController.php | 0 src/{Xhgui => }/Controller/ImportController.php | 0 src/{Xhgui => }/Controller/MetricsController.php | 0 src/{Xhgui => }/Controller/RunController.php | 0 src/{Xhgui => }/Controller/WatchController.php | 0 src/{Xhgui => }/Controller/WaterfallController.php | 0 src/{Xhgui => }/Db/Mapper.php | 0 src/{Xhgui => }/Db/PdoRepository.php | 0 src/{Xhgui => }/Exception/NotImplementedException.php | 0 src/{Xhgui => }/Middleware/RenderMiddleware.php | 0 src/{Xhgui => }/Options/OptionsConfigurator.php | 0 src/{Xhgui => }/Options/SearchOptions.php | 0 src/{Xhgui => }/Profile.php | 0 src/{Xhgui => }/Saver/MongoSaver.php | 0 src/{Xhgui => }/Saver/NormalizingSaver.php | 0 src/{Xhgui => }/Saver/PdoSaver.php | 0 src/{Xhgui => }/Saver/SaverInterface.php | 0 src/{Xhgui => }/Searcher/MongoSearcher.php | 0 src/{Xhgui => }/Searcher/PdoSearcher.php | 0 src/{Xhgui => }/Searcher/SearcherInterface.php | 0 src/{Xhgui => }/ServiceContainer.php | 2 +- src/{Xhgui => }/Twig/TwigExtension.php | 0 src/{Xhgui => }/Util.php | 0 26 files changed, 2 insertions(+), 2 deletions(-) rename src/{Xhgui => }/AbstractController.php (100%) rename src/{Xhgui => }/Config.php (100%) rename src/{Xhgui => }/Controller/CustomController.php (100%) rename src/{Xhgui => }/Controller/ImportController.php (100%) rename src/{Xhgui => }/Controller/MetricsController.php (100%) rename src/{Xhgui => }/Controller/RunController.php (100%) rename src/{Xhgui => }/Controller/WatchController.php (100%) rename src/{Xhgui => }/Controller/WaterfallController.php (100%) rename src/{Xhgui => }/Db/Mapper.php (100%) rename src/{Xhgui => }/Db/PdoRepository.php (100%) rename src/{Xhgui => }/Exception/NotImplementedException.php (100%) rename src/{Xhgui => }/Middleware/RenderMiddleware.php (100%) rename src/{Xhgui => }/Options/OptionsConfigurator.php (100%) rename src/{Xhgui => }/Options/SearchOptions.php (100%) rename src/{Xhgui => }/Profile.php (100%) rename src/{Xhgui => }/Saver/MongoSaver.php (100%) rename src/{Xhgui => }/Saver/NormalizingSaver.php (100%) rename src/{Xhgui => }/Saver/PdoSaver.php (100%) rename src/{Xhgui => }/Saver/SaverInterface.php (100%) rename src/{Xhgui => }/Searcher/MongoSearcher.php (100%) rename src/{Xhgui => }/Searcher/PdoSearcher.php (100%) rename src/{Xhgui => }/Searcher/SearcherInterface.php (100%) rename src/{Xhgui => }/ServiceContainer.php (98%) rename src/{Xhgui => }/Twig/TwigExtension.php (100%) rename src/{Xhgui => }/Util.php (100%) diff --git a/composer.json b/composer.json index 582f2df77..37b383d41 100644 --- a/composer.json +++ b/composer.json @@ -4,7 +4,7 @@ "license": "MIT", "autoload": { "psr-4": { - "XHGui\\": "src/Xhgui/" + "XHGui\\": "src/" } }, "autoload-dev": { diff --git a/src/Xhgui/AbstractController.php b/src/AbstractController.php similarity index 100% rename from src/Xhgui/AbstractController.php rename to src/AbstractController.php diff --git a/src/Xhgui/Config.php b/src/Config.php similarity index 100% rename from src/Xhgui/Config.php rename to src/Config.php diff --git a/src/Xhgui/Controller/CustomController.php b/src/Controller/CustomController.php similarity index 100% rename from src/Xhgui/Controller/CustomController.php rename to src/Controller/CustomController.php diff --git a/src/Xhgui/Controller/ImportController.php b/src/Controller/ImportController.php similarity index 100% rename from src/Xhgui/Controller/ImportController.php rename to src/Controller/ImportController.php diff --git a/src/Xhgui/Controller/MetricsController.php b/src/Controller/MetricsController.php similarity index 100% rename from src/Xhgui/Controller/MetricsController.php rename to src/Controller/MetricsController.php diff --git a/src/Xhgui/Controller/RunController.php b/src/Controller/RunController.php similarity index 100% rename from src/Xhgui/Controller/RunController.php rename to src/Controller/RunController.php diff --git a/src/Xhgui/Controller/WatchController.php b/src/Controller/WatchController.php similarity index 100% rename from src/Xhgui/Controller/WatchController.php rename to src/Controller/WatchController.php diff --git a/src/Xhgui/Controller/WaterfallController.php b/src/Controller/WaterfallController.php similarity index 100% rename from src/Xhgui/Controller/WaterfallController.php rename to src/Controller/WaterfallController.php diff --git a/src/Xhgui/Db/Mapper.php b/src/Db/Mapper.php similarity index 100% rename from src/Xhgui/Db/Mapper.php rename to src/Db/Mapper.php diff --git a/src/Xhgui/Db/PdoRepository.php b/src/Db/PdoRepository.php similarity index 100% rename from src/Xhgui/Db/PdoRepository.php rename to src/Db/PdoRepository.php diff --git a/src/Xhgui/Exception/NotImplementedException.php b/src/Exception/NotImplementedException.php similarity index 100% rename from src/Xhgui/Exception/NotImplementedException.php rename to src/Exception/NotImplementedException.php diff --git a/src/Xhgui/Middleware/RenderMiddleware.php b/src/Middleware/RenderMiddleware.php similarity index 100% rename from src/Xhgui/Middleware/RenderMiddleware.php rename to src/Middleware/RenderMiddleware.php diff --git a/src/Xhgui/Options/OptionsConfigurator.php b/src/Options/OptionsConfigurator.php similarity index 100% rename from src/Xhgui/Options/OptionsConfigurator.php rename to src/Options/OptionsConfigurator.php diff --git a/src/Xhgui/Options/SearchOptions.php b/src/Options/SearchOptions.php similarity index 100% rename from src/Xhgui/Options/SearchOptions.php rename to src/Options/SearchOptions.php diff --git a/src/Xhgui/Profile.php b/src/Profile.php similarity index 100% rename from src/Xhgui/Profile.php rename to src/Profile.php diff --git a/src/Xhgui/Saver/MongoSaver.php b/src/Saver/MongoSaver.php similarity index 100% rename from src/Xhgui/Saver/MongoSaver.php rename to src/Saver/MongoSaver.php diff --git a/src/Xhgui/Saver/NormalizingSaver.php b/src/Saver/NormalizingSaver.php similarity index 100% rename from src/Xhgui/Saver/NormalizingSaver.php rename to src/Saver/NormalizingSaver.php diff --git a/src/Xhgui/Saver/PdoSaver.php b/src/Saver/PdoSaver.php similarity index 100% rename from src/Xhgui/Saver/PdoSaver.php rename to src/Saver/PdoSaver.php diff --git a/src/Xhgui/Saver/SaverInterface.php b/src/Saver/SaverInterface.php similarity index 100% rename from src/Xhgui/Saver/SaverInterface.php rename to src/Saver/SaverInterface.php diff --git a/src/Xhgui/Searcher/MongoSearcher.php b/src/Searcher/MongoSearcher.php similarity index 100% rename from src/Xhgui/Searcher/MongoSearcher.php rename to src/Searcher/MongoSearcher.php diff --git a/src/Xhgui/Searcher/PdoSearcher.php b/src/Searcher/PdoSearcher.php similarity index 100% rename from src/Xhgui/Searcher/PdoSearcher.php rename to src/Searcher/PdoSearcher.php diff --git a/src/Xhgui/Searcher/SearcherInterface.php b/src/Searcher/SearcherInterface.php similarity index 100% rename from src/Xhgui/Searcher/SearcherInterface.php rename to src/Searcher/SearcherInterface.php diff --git a/src/Xhgui/ServiceContainer.php b/src/ServiceContainer.php similarity index 98% rename from src/Xhgui/ServiceContainer.php rename to src/ServiceContainer.php index 7a1b7f9c6..9f3222d82 100644 --- a/src/Xhgui/ServiceContainer.php +++ b/src/ServiceContainer.php @@ -55,7 +55,7 @@ protected function _slimApp() // Configure Twig view for slim $view = new Twig(); - $view->twigTemplateDirs = [dirname(__DIR__, 2) . '/templates']; + $view->twigTemplateDirs = [dirname(__DIR__) . '/templates']; $view->parserOptions = [ 'charset' => 'utf-8', 'cache' => $cacheDir, diff --git a/src/Xhgui/Twig/TwigExtension.php b/src/Twig/TwigExtension.php similarity index 100% rename from src/Xhgui/Twig/TwigExtension.php rename to src/Twig/TwigExtension.php diff --git a/src/Xhgui/Util.php b/src/Util.php similarity index 100% rename from src/Xhgui/Util.php rename to src/Util.php From f04c4172c927f107c516417753ba984046c1ce47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elan=20Ruusam=C3=A4e?= Date: Mon, 21 Dec 2020 19:03:47 +0200 Subject: [PATCH 03/10] Move config setup to ConfigProvider --- src/ServiceContainer.php | 4 ++-- src/ServiceProvider/ConfigProvider.php | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 src/ServiceProvider/ConfigProvider.php diff --git a/src/ServiceContainer.php b/src/ServiceContainer.php index 9f3222d82..1dce96168 100644 --- a/src/ServiceContainer.php +++ b/src/ServiceContainer.php @@ -17,6 +17,7 @@ use XHGui\Saver\NormalizingSaver; use XHGui\Searcher\MongoSearcher; use XHGui\Searcher\PdoSearcher; +use XHGui\ServiceProvider\ConfigProvider; use XHGui\Twig\TwigExtension; class ServiceContainer extends Container @@ -39,6 +40,7 @@ public static function instance() public function __construct() { parent::__construct(); + $this->register(new ConfigProvider()); $this->_slimApp(); $this->_services(); $this->storageDriverPdo($this); @@ -97,8 +99,6 @@ protected function _slimApp() */ protected function _services() { - $this['config'] = Config::all(); - $this['searcher'] = static function ($c) { $saver = $c['config']['save.handler']; diff --git a/src/ServiceProvider/ConfigProvider.php b/src/ServiceProvider/ConfigProvider.php new file mode 100644 index 000000000..48a11bf4c --- /dev/null +++ b/src/ServiceProvider/ConfigProvider.php @@ -0,0 +1,17 @@ + Date: Mon, 21 Dec 2020 19:14:54 +0200 Subject: [PATCH 04/10] Move Routes setup to RouteProvider --- src/ServiceContainer.php | 2 + src/ServiceProvider/RouteProvider.php | 219 ++++++++++++++++++++++++++ src/routes.php | 215 ------------------------- webroot/index.php | 8 +- 4 files changed, 224 insertions(+), 220 deletions(-) create mode 100644 src/ServiceProvider/RouteProvider.php delete mode 100644 src/routes.php diff --git a/src/ServiceContainer.php b/src/ServiceContainer.php index 1dce96168..0da1af3a4 100644 --- a/src/ServiceContainer.php +++ b/src/ServiceContainer.php @@ -18,6 +18,7 @@ use XHGui\Searcher\MongoSearcher; use XHGui\Searcher\PdoSearcher; use XHGui\ServiceProvider\ConfigProvider; +use XHGui\ServiceProvider\RouteProvider; use XHGui\Twig\TwigExtension; class ServiceContainer extends Container @@ -42,6 +43,7 @@ public function __construct() parent::__construct(); $this->register(new ConfigProvider()); $this->_slimApp(); + $this->register(new RouteProvider()); $this->_services(); $this->storageDriverPdo($this); $this->storageDriverMongoDb($this); diff --git a/src/ServiceProvider/RouteProvider.php b/src/ServiceProvider/RouteProvider.php new file mode 100644 index 000000000..75f96499d --- /dev/null +++ b/src/ServiceProvider/RouteProvider.php @@ -0,0 +1,219 @@ +registerRoutes($di, $di['app']); + } + + private function registerRoutes(Container $di, App $app) + { + $app->error(static function (Exception $e) use ($di, $app) { + /** @var Twig $view */ + $view = $di['view']; + $view->parserOptions['cache'] = false; + $view->parserExtensions = [ + new TwigExtension($app), + ]; + + // Remove the controller so we don't render it. + unset($app->controller); + + $app->view($view); + $app->render('error/view.twig', [ + 'message' => $e->getMessage(), + 'stack_trace' => $e->getTraceAsString(), + ]); + }); + + // Profile Runs routes + $app->get('/', static function () use ($di, $app) { + /** @var Controller\RunController $controller */ + $controller = $app->controller = $di['runController']; + $request = $app->request(); + $response = $app->response(); + + $controller->index($request, $response); + })->setName('home'); + + $app->get('/run/view', static function () use ($di, $app) { + /** @var Controller\RunController $controller */ + $controller = $app->controller = $di['runController']; + $request = $app->request(); + $response = $app->response(); + + $controller->view($request, $response); + })->setName('run.view'); + + $app->get('/run/delete', static function () use ($di, $app) { + /** @var Controller\RunController $controller */ + $controller = $app->controller = $di['runController']; + $request = $app->request(); + + $controller->deleteForm($request); + })->setName('run.delete.form'); + + $app->post('/run/delete', static function () use ($di, $app) { + /** @var Controller\RunController $controller */ + $controller = $di['runController']; + $request = $app->request(); + + $controller->deleteSubmit($request); + })->setName('run.delete.submit'); + + $app->get('/run/delete_all', static function () use ($di, $app) { + /** @var Controller\RunController $controller */ + $controller = $app->controller = $di['runController']; + $controller->deleteAllForm(); + })->setName('run.deleteAll.form'); + + $app->post('/run/delete_all', static function () use ($di) { + /** @var Controller\RunController $controller */ + $controller = $di['runController']; + $controller->deleteAllSubmit(); + })->setName('run.deleteAll.submit'); + + $app->get('/url/view', static function () use ($di, $app) { + /** @var Controller\RunController $controller */ + $controller = $app->controller = $di['runController']; + $request = $app->request(); + + $controller->url($request); + })->setName('url.view'); + + $app->get('/run/compare', static function () use ($di, $app) { + /** @var Controller\RunController $controller */ + $controller = $app->controller = $di['runController']; + $request = $app->request(); + + $controller->compare($request); + })->setName('run.compare'); + + $app->get('/run/symbol', static function () use ($di, $app) { + /** @var Controller\RunController $controller */ + $controller = $app->controller = $di['runController']; + $request = $app->request(); + + $controller->symbol($request); + })->setName('run.symbol'); + + $app->get('/run/symbol/short', static function () use ($di, $app) { + /** @var Controller\RunController $controller */ + $controller = $app->controller = $di['runController']; + $request = $app->request(); + + $controller->symbolShort($request); + })->setName('run.symbol-short'); + + $app->get('/run/callgraph', static function () use ($di, $app) { + /** @var Controller\RunController $controller */ + $controller = $app->controller = $di['runController']; + $request = $app->request(); + + $controller->callgraph($request); + })->setName('run.callgraph'); + + $app->get('/run/callgraph/data', static function () use ($di, $app) { + /** @var Controller\RunController $controller */ + $controller = $di['runController']; + $request = $app->request(); + $response = $app->response(); + + $controller->callgraphData($request, $response); + })->setName('run.callgraph.data'); + + $app->get('/run/callgraph/dot', static function () use ($di, $app) { + /** @var Controller\RunController $controller */ + $controller = $di['runController']; + $request = $app->request(); + $response = $app->response(); + + $controller->callgraphDataDot($request, $response); + })->setName('run.callgraph.dot'); + + // Import route + $app->post('/run/import', static function () use ($di, $app) { + /** @var Controller\ImportController $controller */ + $controller = $di['importController']; + $request = $app->request(); + $response = $app->response(); + + $controller->import($request, $response); + })->setName('run.import'); + + // Watch function routes. + $app->get('/watch', static function () use ($di, $app) { + /** @var Controller\WatchController $controller */ + $controller = $app->controller = $di['watchController']; + $controller->get(); + })->setName('watch.list'); + + $app->post('/watch', static function () use ($di, $app) { + /** @var Controller\WatchController $controller */ + $controller = $di['watchController']; + $request = $app->request(); + + $controller->post($request); + })->setName('watch.save'); + + // Custom report routes. + $app->get('/custom', static function () use ($di, $app) { + /** @var Controller\CustomController $controller */ + $controller = $app->controller = $di['customController']; + $controller->get(); + })->setName('custom.view'); + + $app->get('/custom/help', static function () use ($di, $app) { + /** @var Controller\CustomController $controller */ + $controller = $app->controller = $di['customController']; + $request = $app->request(); + + $controller->help($request); + })->setName('custom.help'); + + $app->post('/custom/query', static function () use ($di, $app) { + /** @var Controller\CustomController $controller */ + $controller = $di['customController']; + $request = $app->request(); + $response = $app->response(); + + $controller->query($request, $response); + })->setName('custom.query'); + + // Waterfall routes + $app->get('/waterfall', static function () use ($di, $app) { + /** @var Controller\WaterfallController $controller */ + $controller = $app->controller = $di['waterfallController']; + $controller->index(); + })->setName('waterfall.list'); + + $app->get('/waterfall/data', static function () use ($di, $app) { + /** @var Controller\WaterfallController $controller */ + $controller = $di['waterfallController']; + $request = $app->request(); + $response = $app->response(); + + $controller->query($request, $response); + })->setName('waterfall.data'); + + // Metrics + $app->get('/metrics', static function () use ($di, $app) { + /** @var Controller\MetricsController $controller */ + $controller = $di['metricsController']; + $response = $app->response(); + + $controller->metrics($response); + })->setName('metrics'); + } +} diff --git a/src/routes.php b/src/routes.php deleted file mode 100644 index f50f0e875..000000000 --- a/src/routes.php +++ /dev/null @@ -1,215 +0,0 @@ -error(static function (Exception $e) use ($di, $app) { - /** @var Twig $view */ - $view = $di['view']; - $view->parserOptions['cache'] = false; - $view->parserExtensions = [ - new TwigExtension($app), - ]; - - // Remove the controller so we don't render it. - unset($app->controller); - - $app->view($view); - $app->render('error/view.twig', [ - 'message' => $e->getMessage(), - 'stack_trace' => $e->getTraceAsString(), - ]); -}); - -// Profile Runs routes -$app->get('/', static function () use ($di, $app) { - /** @var RunController $controller */ - $controller = $app->controller = $di['runController']; - $request = $app->request(); - $response = $app->response(); - - $controller->index($request, $response); -})->setName('home'); - -$app->get('/run/view', static function () use ($di, $app) { - /** @var RunController $controller */ - $controller = $app->controller = $di['runController']; - $request = $app->request(); - $response = $app->response(); - - $controller->view($request, $response); -})->setName('run.view'); - -$app->get('/run/delete', static function () use ($di, $app) { - /** @var RunController $controller */ - $controller = $app->controller = $di['runController']; - $request = $app->request(); - - $controller->deleteForm($request); -})->setName('run.delete.form'); - -$app->post('/run/delete', static function () use ($di, $app) { - /** @var RunController $controller */ - $controller = $di['runController']; - $request = $app->request(); - - $controller->deleteSubmit($request); -})->setName('run.delete.submit'); - -$app->get('/run/delete_all', static function () use ($di, $app) { - /** @var RunController $controller */ - $controller = $app->controller = $di['runController']; - $controller->deleteAllForm(); -})->setName('run.deleteAll.form'); - -$app->post('/run/delete_all', static function () use ($di) { - /** @var RunController $controller */ - $controller = $di['runController']; - $controller->deleteAllSubmit(); -})->setName('run.deleteAll.submit'); - -$app->get('/url/view', static function () use ($di, $app) { - /** @var RunController $controller */ - $controller = $app->controller = $di['runController']; - $request = $app->request(); - - $controller->url($request); -})->setName('url.view'); - -$app->get('/run/compare', static function () use ($di, $app) { - /** @var RunController $controller */ - $controller = $app->controller = $di['runController']; - $request = $app->request(); - - $controller->compare($request); -})->setName('run.compare'); - -$app->get('/run/symbol', static function () use ($di, $app) { - /** @var RunController $controller */ - $controller = $app->controller = $di['runController']; - $request = $app->request(); - - $controller->symbol($request); -})->setName('run.symbol'); - -$app->get('/run/symbol/short', static function () use ($di, $app) { - /** @var RunController $controller */ - $controller = $app->controller = $di['runController']; - $request = $app->request(); - - $controller->symbolShort($request); -})->setName('run.symbol-short'); - -$app->get('/run/callgraph', static function () use ($di, $app) { - /** @var RunController $controller */ - $controller = $app->controller = $di['runController']; - $request = $app->request(); - - $controller->callgraph($request); -})->setName('run.callgraph'); - -$app->get('/run/callgraph/data', static function () use ($di, $app) { - /** @var RunController $controller */ - $controller = $di['runController']; - $request = $app->request(); - $response = $app->response(); - - $controller->callgraphData($request, $response); -})->setName('run.callgraph.data'); - -$app->get('/run/callgraph/dot', static function () use ($di, $app) { - /** @var RunController $controller */ - $controller = $di['runController']; - $request = $app->request(); - $response = $app->response(); - - $controller->callgraphDataDot($request, $response); -})->setName('run.callgraph.dot'); - -// Import route -$app->post('/run/import', static function () use ($di, $app) { - /** @var ImportController $controller */ - $controller = $di['importController']; - $request = $app->request(); - $response = $app->response(); - - $controller->import($request, $response); -})->setName('run.import'); - -// Watch function routes. -$app->get('/watch', static function () use ($di, $app) { - /** @var WatchController $controller */ - $controller = $app->controller = $di['watchController']; - $controller->get(); -})->setName('watch.list'); - -$app->post('/watch', static function () use ($di, $app) { - /** @var WatchController $controller */ - $controller = $di['watchController']; - $request = $app->request(); - - $controller->post($request); -})->setName('watch.save'); - -// Custom report routes. -$app->get('/custom', static function () use ($di, $app) { - /** @var CustomController $controller */ - $controller = $app->controller = $di['customController']; - $controller->get(); -})->setName('custom.view'); - -$app->get('/custom/help', static function () use ($di, $app) { - /** @var CustomController $controller */ - $controller = $app->controller = $di['customController']; - $request = $app->request(); - - $controller->help($request); -})->setName('custom.help'); - -$app->post('/custom/query', static function () use ($di, $app) { - /** @var CustomController $controller */ - $controller = $di['customController']; - $request = $app->request(); - $response = $app->response(); - - $controller->query($request, $response); -})->setName('custom.query'); - -// Waterfall routes -$app->get('/waterfall', static function () use ($di, $app) { - /** @var WaterfallController $controller */ - $controller = $app->controller = $di['waterfallController']; - $controller->index(); -})->setName('waterfall.list'); - -$app->get('/waterfall/data', static function () use ($di, $app) { - /** @var WaterfallController $controller */ - $controller = $di['waterfallController']; - $request = $app->request(); - $response = $app->response(); - - $controller->query($request, $response); -})->setName('waterfall.data'); - -// Metrics -$app->get('/metrics', static function () use ($di, $app) { - /** @var MetricsController $controller */ - $controller = $di['metricsController']; - $response = $app->response(); - - $controller->metrics($response); -})->setName('metrics'); diff --git a/webroot/index.php b/webroot/index.php index 828f93ea3..4668731a6 100644 --- a/webroot/index.php +++ b/webroot/index.php @@ -1,13 +1,11 @@ run(); From 384b34a3f584a314703ac0ad3947c81cb2d71154 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elan=20Ruusam=C3=A4e?= Date: Mon, 21 Dec 2020 20:02:57 +0200 Subject: [PATCH 05/10] Add boot() method to override container for testing --- src/ServiceContainer.php | 6 +++++- tests/LazyContainerProperties.php | 6 ++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/ServiceContainer.php b/src/ServiceContainer.php index 0da1af3a4..3e2265e64 100644 --- a/src/ServiceContainer.php +++ b/src/ServiceContainer.php @@ -33,6 +33,7 @@ public static function instance() { if (empty(static::$_instance)) { static::$_instance = new self(); + static::$_instance->boot(); } return static::$_instance; @@ -43,13 +44,16 @@ public function __construct() parent::__construct(); $this->register(new ConfigProvider()); $this->_slimApp(); - $this->register(new RouteProvider()); $this->_services(); $this->storageDriverPdo($this); $this->storageDriverMongoDb($this); $this->_controllers(); } + public function boot() { + $this->register(new RouteProvider()); + } + // Create the Slim app. protected function _slimApp() { diff --git a/tests/LazyContainerProperties.php b/tests/LazyContainerProperties.php index 937c1769e..1963e35a2 100644 --- a/tests/LazyContainerProperties.php +++ b/tests/LazyContainerProperties.php @@ -49,11 +49,13 @@ protected function setupProperties() protected function getDi() { - $di = ServiceContainer::instance(); - $di['app'] = $this->getMockBuilder(App::class) + $di = new ServiceContainer(); + $app = $this->getMockBuilder(App::class) ->setMethods(['redirect', 'render', 'urlFor']) ->setConstructorArgs([$di['config']]) ->getMock(); + $di['app'] = $app; + $di->boot(); return $di; } From 99901e4d32e893b55162df0927691089f0a46812 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elan=20Ruusam=C3=A4e?= Date: Mon, 21 Dec 2020 19:17:42 +0200 Subject: [PATCH 06/10] Cleanup config: drop unused methods The methods were referenced only from tests. --- src/Config.php | 34 ---------------------------------- tests/ConfigTest.php | 40 ---------------------------------------- 2 files changed, 74 deletions(-) delete mode 100644 tests/ConfigTest.php diff --git a/src/Config.php b/src/Config.php index 178aa2c38..8e996e0fc 100644 --- a/src/Config.php +++ b/src/Config.php @@ -19,21 +19,6 @@ public static function load($file) self::$config = array_merge(self::$config, $config); } - /** - * Read a config value. - * - * @param string $name The name of the config variable - * @return mixed the value or null - */ - public static function read($name) - { - if (isset(self::$config[$name])) { - return self::$config[$name]; - } - - return null; - } - /** * Get all the configuration options. * @@ -43,23 +28,4 @@ public static function all() { return self::$config; } - - /** - * Write a config value. - * - * @param string $name The name of the config variable - * @param mixed $value The value of the config variable - */ - public static function write($name, $value) - { - self::$config[$name] = $value; - } - - /** - * Clear out the data stored in the config class. - */ - public static function clear() - { - self::$config = []; - } } diff --git a/tests/ConfigTest.php b/tests/ConfigTest.php deleted file mode 100644 index 4df7c12d1..000000000 --- a/tests/ConfigTest.php +++ /dev/null @@ -1,40 +0,0 @@ -assertNull($result); - - $result = Config::read('test'); - $this->assertEquals('value', $result); - - $result = Config::read('not there'); - $this->assertNull($result); - } - - public function testReadWriteWithDots() - { - $result = Config::write('test.name', 'value'); - $this->assertNull(Config::read('test')); - $this->assertEquals('value', Config::read('test.name')); - } - - public function testClear() - { - Config::write('test', 'value'); - $this->assertNull(Config::clear()); - $this->assertNull(Config::read('test')); - } -} From d3189afedcd926c0d1b5eee7009d04d475fdbdcb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elan=20Ruusam=C3=A4e?= Date: Mon, 21 Dec 2020 19:20:41 +0200 Subject: [PATCH 07/10] Load config on demand This avoids need to manually load config from bootstrap --- src/ServiceProvider/ConfigProvider.php | 6 ++++++ src/bootstrap.php | 7 ------- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/ServiceProvider/ConfigProvider.php b/src/ServiceProvider/ConfigProvider.php index 48a11bf4c..89eef85aa 100644 --- a/src/ServiceProvider/ConfigProvider.php +++ b/src/ServiceProvider/ConfigProvider.php @@ -11,6 +11,12 @@ class ConfigProvider implements ServiceProviderInterface public function register(Container $app) { $app['config'] = static function () { + Config::load(XHGUI_ROOT_DIR . '/config/config.default.php'); + + if (file_exists(XHGUI_ROOT_DIR . '/config/config.php')) { + Config::load(XHGUI_ROOT_DIR . '/config/config.php'); + } + return Config::all(); }; } diff --git a/src/bootstrap.php b/src/bootstrap.php index 74acc76da..a3a8fa2db 100644 --- a/src/bootstrap.php +++ b/src/bootstrap.php @@ -3,8 +3,6 @@ * Boostrapping and common utility definition. */ -use XHGui\Config; - define('XHGUI_ROOT_DIR', dirname(__DIR__)); if (file_exists(XHGUI_ROOT_DIR . '/vendor/autoload.php')) { @@ -12,8 +10,3 @@ } elseif (file_exists(XHGUI_ROOT_DIR . '/../../autoload.php')) { require XHGUI_ROOT_DIR . '/../../autoload.php'; } - -Config::load(XHGUI_ROOT_DIR . '/config/config.default.php'); -if (file_exists(XHGUI_ROOT_DIR . '/config/config.php')) { - Config::load(XHGUI_ROOT_DIR . '/config/config.php'); -} From d5ac43bd1829b0ef55f5c4c8ce896142f3dd2401 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elan=20Ruusam=C3=A4e?= Date: Mon, 21 Dec 2020 19:27:34 +0200 Subject: [PATCH 08/10] Add paths to container to remove need for XHGUI_ROOT_DIR constant --- src/ServiceContainer.php | 22 +++++++++++++++++----- src/ServiceProvider/ConfigProvider.php | 8 ++++---- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/src/ServiceContainer.php b/src/ServiceContainer.php index 3e2265e64..a8de4d000 100644 --- a/src/ServiceContainer.php +++ b/src/ServiceContainer.php @@ -42,6 +42,7 @@ public static function instance() public function __construct() { parent::__construct(); + $this->setupPaths($this); $this->register(new ConfigProvider()); $this->_slimApp(); $this->_services(); @@ -50,23 +51,34 @@ public function __construct() $this->_controllers(); } - public function boot() { + public function boot() + { $this->register(new RouteProvider()); } + private function setupPaths(self $app) + { + $app['app.dir'] = dirname(__DIR__); + $app['app.template_dir'] = dirname(__DIR__) . '/templates'; + $app['app.config_dir'] = dirname(__DIR__) . '/config'; + $app['app.cache_dir'] = static function ($c) { + return $c['config']['cache'] ?? dirname(__DIR__) . '/cache'; + }; + } + // Create the Slim app. protected function _slimApp() { $this['view'] = static function ($c) { - $cacheDir = $c['config']['cache'] ?? XHGUI_ROOT_DIR . '/cache'; - // Configure Twig view for slim $view = new Twig(); - $view->twigTemplateDirs = [dirname(__DIR__) . '/templates']; + $view->twigTemplateDirs = [ + $c['app.template_dir'], + ]; $view->parserOptions = [ 'charset' => 'utf-8', - 'cache' => $cacheDir, + 'cache' => $c['app.cache_dir'], 'auto_reload' => true, 'strict_variables' => false, 'autoescape' => true, diff --git a/src/ServiceProvider/ConfigProvider.php b/src/ServiceProvider/ConfigProvider.php index 89eef85aa..d0afd7125 100644 --- a/src/ServiceProvider/ConfigProvider.php +++ b/src/ServiceProvider/ConfigProvider.php @@ -10,11 +10,11 @@ class ConfigProvider implements ServiceProviderInterface { public function register(Container $app) { - $app['config'] = static function () { - Config::load(XHGUI_ROOT_DIR . '/config/config.default.php'); + $app['config'] = static function ($app) { + Config::load($app['app.config_dir'] . '/config.default.php'); - if (file_exists(XHGUI_ROOT_DIR . '/config/config.php')) { - Config::load(XHGUI_ROOT_DIR . '/config/config.php'); + if (file_exists($app['app.config_dir'] . '/config.php')) { + Config::load($app['app.config_dir'] . '/config.php'); } return Config::all(); From 0f80f6edd34127c991415da6bdbeaa299f50a180 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elan=20Ruusam=C3=A4e?= Date: Mon, 21 Dec 2020 19:33:08 +0200 Subject: [PATCH 09/10] Don't use XHGUI_ROOT_DIR --- tests/ProfileTest.php | 2 +- tests/Saver/MongoTest.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/ProfileTest.php b/tests/ProfileTest.php index fbef069c8..ea0b6be5e 100644 --- a/tests/ProfileTest.php +++ b/tests/ProfileTest.php @@ -12,7 +12,7 @@ class ProfileTest extends TestCase public function setUp() { parent::setUp(); - $contents = file_get_contents(XHGUI_ROOT_DIR . '/tests/fixtures/results.json'); + $contents = file_get_contents(dirname(__DIR__) . '/tests/fixtures/results.json'); $this->fixture = json_decode($contents, true); } diff --git a/tests/Saver/MongoTest.php b/tests/Saver/MongoTest.php index 76e31409d..b98f34c5e 100644 --- a/tests/Saver/MongoTest.php +++ b/tests/Saver/MongoTest.php @@ -10,7 +10,7 @@ class MongoTest extends TestCase { public function testSave() { - $data = json_decode(file_get_contents(XHGUI_ROOT_DIR . '/tests/fixtures/results.json'), true); + $data = json_decode(file_get_contents(__DIR__ . '/../../tests/fixtures/results.json'), true); $collection = $this->getMockBuilder(MongoCollection::class) ->disableOriginalConstructor() From 22db6ae7baa4547bbca4950f3518d4ab0e6b9584 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elan=20Ruusam=C3=A4e?= Date: Mon, 21 Dec 2020 19:34:31 +0200 Subject: [PATCH 10/10] Drop src/bootstrap.php file --- external/import.php | 4 +--- src/ServiceProvider/ConfigProvider.php | 6 ++++++ src/bootstrap.php | 12 ------------ tests/bootstrap.php | 2 +- webroot/index.php | 2 +- 5 files changed, 9 insertions(+), 17 deletions(-) delete mode 100644 src/bootstrap.php diff --git a/external/import.php b/external/import.php index 8690d623c..674f614e5 100644 --- a/external/import.php +++ b/external/import.php @@ -3,9 +3,7 @@ use XHGui\Saver\SaverInterface; use XHGui\ServiceContainer; -if (!defined('XHGUI_ROOT_DIR')) { - require dirname(__DIR__) . '/src/bootstrap.php'; -} +require __DIR__ . '/../vendor/autoload.php'; $options = getopt('f:'); diff --git a/src/ServiceProvider/ConfigProvider.php b/src/ServiceProvider/ConfigProvider.php index d0afd7125..76f67d744 100644 --- a/src/ServiceProvider/ConfigProvider.php +++ b/src/ServiceProvider/ConfigProvider.php @@ -11,6 +11,12 @@ class ConfigProvider implements ServiceProviderInterface public function register(Container $app) { $app['config'] = static function ($app) { + // @deprecated + // define XHGUI_ROOT_DIR constant, config files may use it + if (!defined('XHGUI_ROOT_DIR')) { + define('XHGUI_ROOT_DIR', $app['app.dir']); + } + Config::load($app['app.config_dir'] . '/config.default.php'); if (file_exists($app['app.config_dir'] . '/config.php')) { diff --git a/src/bootstrap.php b/src/bootstrap.php deleted file mode 100644 index a3a8fa2db..000000000 --- a/src/bootstrap.php +++ /dev/null @@ -1,12 +0,0 @@ -