laravel-doctrine/orm). The core logic (Doctrine entities, managers) is framework-agnostic.301, 302, 307), which is valuable for SEO and user experience. Can be extended to include:
doctrine/orm + laravel-doctrine/orm packages.Redirect entity.RedirectManager to Laravel’s container (e.g., via bind() in AppServiceProvider).AppKernel registration with Laravel’s bundle equivalent (e.g., config/app.php or a custom service provider).Bootstrap class). Example:
// app/Http/Middleware/HandleRedirects.php
public function handle($request, Closure $next) {
$oldPath = $request->path();
$redirect = RedirectManager::getRedirect($oldPath);
if ($redirect) {
return redirect()->to($redirect->getNewPath())->setStatusCode($redirect->getStatusCode());
}
return $next($request);
}
RedirectRepository with indexed columns (old_path as a unique key).Redirect::permanent()?Redirect entity conflict with existing migrations?created_by)?RouteServiceProvider (more control)?Illuminate\Routing\Redirector + a custom Redirect model in the future?laravel-doctrine/orm (v2+) for Symfony Doctrine compatibility.AppServiceProvider:
public function register() {
$this->app->bind('braune_digital.redirect.manager', function ($app) {
return new \BrauneDigital\RedirectBundle\Manager\RedirectManager(
$app->make('doctrine.orm.entity_manager'),
$app->make('braune_digital.redirect.repository')
);
});
}
RedirectMiddleware to intercept requests before Laravel’s router.AppKernel.composer require braune-digital/redirect-bundle ~1.1 laravel-doctrine/orm doctrine/orm
php artisan doctrine:migrations:diff
php artisan doctrine:migrations:migrate
app/Http/Kernel.php:
protected $middleware = [
\App\Http\Middleware\HandleRedirects::class,
];
RedirectManager.301 for /old → /new).laravel-doctrine/orm v2+.Route::fallback() cautiously.301 vs. 302)./old vs. /old/).Log facade) for analytics.braune-digital/redirect-bundle for updates. Risk of breaking changes due to low adoption.Redirect entity evolves.prePersist) may need Laravel-specific handling.\Log::debug("Redirect check for path: {$oldPath}", ['redirect' => $redirect]);
tinker to test RedirectManager directly:
php artisan tinker
>>> $manager = app('braune_digital.redirect.manager');
>>> $manager->create('/old', '/new', 301);
old_path is indexed in the Redirect table.| Failure Scenario | Impact | Mitigation |
|---|---|---|
| Doctrine DB connection fails | Redirects broken | Fallback to in-memory cache. |
| Middleware misconfigured | Silent 404s | Test with php artisan route:list. |
| Redirect loop | Infinite redirects | Add loop detection (e.g., track Referer). |
| Schema migration fails | Redirects not persisted | Rollback and retry. |
| Cache invalidation race | Stale redirects | Use versioned cache keys. |
# Example
How can I help you explore Laravel packages today?