LogicalTheme: Added events for registering web routes

Added to allow easier registration of routes.
Added for normal web and authed routes.
Included testing to cover.
This commit is contained in:
Dan Brown 2023-11-17 13:45:57 +00:00
parent 37a17e858a
commit 22a9cf1e48
No known key found for this signature in database
GPG key ID: 46D9F943C24A2EF9
4 changed files with 65 additions and 1 deletions

View file

@ -2,9 +2,12 @@
namespace BookStack\App\Providers; namespace BookStack\App\Providers;
use BookStack\Facades\Theme;
use BookStack\Theming\ThemeEvents;
use Illuminate\Cache\RateLimiting\Limit; use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider; use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Routing\Router;
use Illuminate\Support\Facades\RateLimiter; use Illuminate\Support\Facades\RateLimiter;
use Illuminate\Support\Facades\Route; use Illuminate\Support\Facades\Route;
@ -46,8 +49,15 @@ class RouteServiceProvider extends ServiceProvider
Route::group([ Route::group([
'middleware' => 'web', 'middleware' => 'web',
'namespace' => $this->namespace, 'namespace' => $this->namespace,
], function ($router) { ], function (Router $router) {
require base_path('routes/web.php'); require base_path('routes/web.php');
Theme::dispatch(ThemeEvents::ROUTES_REGISTER_WEB, $router);
});
Route::group([
'middleware' => ['web', 'auth'],
], function (Router $router) {
Theme::dispatch(ThemeEvents::ROUTES_REGISTER_WEB_AUTH, $router);
}); });
} }

View file

@ -4,6 +4,7 @@ namespace BookStack\App\Providers;
use BookStack\Theming\ThemeEvents; use BookStack\Theming\ThemeEvents;
use BookStack\Theming\ThemeService; use BookStack\Theming\ThemeService;
use Illuminate\Support\Facades\Route;
use Illuminate\Support\ServiceProvider; use Illuminate\Support\ServiceProvider;
class ThemeServiceProvider extends ServiceProvider class ThemeServiceProvider extends ServiceProvider

View file

@ -98,6 +98,25 @@ class ThemeEvents
*/ */
const PAGE_INCLUDE_PARSE = 'page_include_parse'; const PAGE_INCLUDE_PARSE = 'page_include_parse';
/**
* Routes register web event.
* Called when standard web (browser/non-api) app routes are registered.
* Provides an app router, so you can register your own web routes.
*
* @param \Illuminate\Routing\Router
*/
const ROUTES_REGISTER_WEB = 'routes_register_web';
/**
* Routes register web auth event.
* Called when auth-required web (browser/non-api) app routes can be registered.
* These are routes that typically require login to access (unless the instance is made public).
* Provides an app router, so you can register your own web routes.
*
* @param \Illuminate\Routing\Router
*/
const ROUTES_REGISTER_WEB_AUTH = 'routes_register_web_auth';
/** /**
* Web before middleware action. * Web before middleware action.
* Runs before the request is handled but after all other middleware apart from those * Runs before the request is handled but after all other middleware apart from those

View file

@ -256,6 +256,40 @@ class ThemeTest extends TestCase
$this->assertEquals($otherPage->id, $args[3]->id); $this->assertEquals($otherPage->id, $args[3]->id);
} }
public function test_event_routes_register_web_and_web_auth()
{
$functionsContent = <<<'END'
<?php
use BookStack\Theming\ThemeEvents;
use BookStack\Facades\Theme;
use Illuminate\Routing\Router;
Theme::listen(ThemeEvents::ROUTES_REGISTER_WEB, function (Router $router) {
$router->get('/cat', fn () => 'cat')->name('say.cat');
});
Theme::listen(ThemeEvents::ROUTES_REGISTER_WEB_AUTH, function (Router $router) {
$router->get('/dog', fn () => 'dog')->name('say.dog');
});
END;
$this->usingThemeFolder(function () use ($functionsContent) {
$functionsFile = theme_path('functions.php');
file_put_contents($functionsFile, $functionsContent);
$app = $this->createApplication();
/** @var \Illuminate\Routing\Router $router */
$router = $app->get('router');
/** @var \Illuminate\Routing\Route $catRoute */
$catRoute = $router->getRoutes()->getRoutesByName()['say.cat'];
$this->assertEquals(['web'], $catRoute->middleware());
/** @var \Illuminate\Routing\Route $dogRoute */
$dogRoute = $router->getRoutes()->getRoutesByName()['say.dog'];
$this->assertEquals(['web', 'auth'], $dogRoute->middleware());
});
}
public function test_add_social_driver() public function test_add_social_driver()
{ {
Theme::addSocialDriver('catnet', [ Theme::addSocialDriver('catnet', [