165 lines
4.5 KiB
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;
|
|
}
|
|
}
|