platform/packages/routing/lib/src/styles/laravel_style.dart

165 lines
4.5 KiB
Dart

import '../router.dart';
import '../routing_style.dart';
/// Laravel-style routing implementation.
///
/// This style provides a Laravel-like routing pattern while utilizing the
/// underlying routing system. It demonstrates how different routing styles
/// can be implemented on top of the core routing functionality.
class LaravelStyle<T> implements RoutingStyle<T> {
final Router<T> _router;
@override
Router<T> get router => _router;
@override
String get styleName => 'laravel';
/// Creates a new Laravel-style router.
LaravelStyle(this._router);
@override
void initialize() {
// Laravel style doesn't need special initialization
}
@override
void dispose() {
// Laravel style doesn't need special cleanup
}
/// Register a route with a specific HTTP method.
///
/// ```dart
/// Route::get('/users', handler);
/// Route::post('/users', handler);
/// ```
Route<T> route(String method, String path, T handler,
{List<T> middleware = const []}) {
return _router.addRoute(method.toUpperCase(), path, handler,
middleware: middleware);
}
/// Register a GET route.
///
/// ```dart
/// Route::get('/users', handler);
/// ```
Route<T> get(String path, T handler, {List<T> middleware = const []}) {
return route('GET', path, handler, middleware: middleware);
}
/// Register a POST route.
///
/// ```dart
/// Route::post('/users', handler);
/// ```
Route<T> post(String path, T handler, {List<T> middleware = const []}) {
return route('POST', path, handler, middleware: middleware);
}
/// Register a PUT route.
///
/// ```dart
/// Route::put('/users/{id}', handler);
/// ```
Route<T> put(String path, T handler, {List<T> middleware = const []}) {
return route('PUT', path, handler, middleware: middleware);
}
/// Register a DELETE route.
///
/// ```dart
/// Route::delete('/users/{id}', handler);
/// ```
Route<T> delete(String path, T handler, {List<T> middleware = const []}) {
return route('DELETE', path, handler, middleware: middleware);
}
/// Register a PATCH route.
///
/// ```dart
/// Route::patch('/users/{id}', handler);
/// ```
Route<T> patch(String path, T handler, {List<T> middleware = const []}) {
return route('PATCH', path, handler, middleware: middleware);
}
/// Create a route group with shared attributes.
///
/// ```dart
/// Route::group({
/// 'prefix': '/api',
/// 'middleware': ['auth'],
/// }, () {
/// Route::get('/users', handler);
/// Route::post('/users', handler);
/// });
/// ```
void group(Map<String, dynamic> attributes, void Function() callback) {
var prefix = attributes['prefix'] as String? ?? '';
var middleware = attributes['middleware'] as List<T>? ?? const [];
_router.group(prefix, (groupRouter) {
// Store current router
var parentRouter = _router;
// Create new style instance for group
var groupStyle = LaravelStyle<T>(groupRouter);
// Set current instance as the active one
_activeInstance = groupStyle;
// Execute callback
callback();
// Restore parent instance
_activeInstance = this;
}, middleware: middleware);
}
// Track active instance for group context
static LaravelStyle? _activeInstance;
// Forward calls to active instance
LaravelStyle<T> get _current => _activeInstance as LaravelStyle<T>? ?? this;
/// Add a name to the last registered route.
///
/// ```dart
/// Route::get('/users', handler).name('users.index');
/// ```
Route<T> name(String name) {
var lastRoute = _router.routes.last;
lastRoute.name = name;
return lastRoute;
}
/// Register middleware for all routes.
///
/// ```dart
/// Route::middleware(['auth', 'throttle']);
/// ```
void middleware(List<T> middleware) {
_router.chain(middleware);
}
}
/// Laravel middleware adapter.
///
/// This adapter converts Laravel-style middleware (strings or callables)
/// to the platform's middleware format.
class LaravelMiddlewareStyle<T> implements MiddlewareStyle<T> {
final Map<String, T Function()> _middlewareMap;
LaravelMiddlewareStyle(this._middlewareMap);
@override
T adaptMiddleware(dynamic originalMiddleware) {
if (originalMiddleware is String) {
var factory = _middlewareMap[originalMiddleware];
if (factory == null) {
throw StateError(
'No middleware registered for key "$originalMiddleware"');
}
return factory();
}
return originalMiddleware as T;
}
}