Weave Code
Code Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Routing Laravel Package

symfony-cmf/routing

View on GitHub
Deep Wiki
Context7

Getting Started

Minimal Setup

  1. Installation:

    composer require symfony-cmf/routing
    

    Ensure symfony/routing (v6+) is also installed as a dependency.

  2. First Use Case:

    • Dynamic Route Matching: Use the DynamicRouter to match routes with dynamic parameters (e.g., {slug}) in a Laravel controller:
      use SymfonyCmf\Routing\DynamicRouter;
      use Symfony\Component\HttpFoundation\Request;
      
      public function show(Request $request, DynamicRouter $router)
      {
          $match = $router->match($request->getPathInfo());
          return view('page', ['content' => $match['_route_params']['slug']]);
      }
      
  3. Key Files:

    • Review config/routing.php (if created) for route definitions.
    • Check app/Providers/RouteServiceProvider.php for binding the DynamicRouter to the container.

Implementation Patterns

Core Workflows

  1. Route Definition:

    • Define routes in a YAML/array format (similar to Symfony):
      // config/routing.php
      return [
          'page_show' => [
              'path' => '/page/{slug}',
              'defaults' => ['_controller' => 'App\Controller\PageController::show'],
          ],
      ];
      
    • Load routes in RouteServiceProvider:
      public function boot()
      {
          $loader = new \Symfony\Component\Routing\Loader\YamlFileLoader(
              new \Symfony\Component\Config\FileLocator(__DIR__.'/../config')
          );
          $router = new DynamicRouter($loader->load('routing.yaml'));
          $this->app->singleton(DynamicRouter::class, fn() => $router);
      }
      
  2. Route Matching:

    • Use DynamicRouter in controllers/middleware:
      $match = $router->match('/blog/laravel-tips');
      // Returns: ['_route' => 'page_show', '_route_params' => ['slug' => 'laravel-tips']]
      
  3. Generating URLs:

    • Generate URLs dynamically:
      $url = $router->generate('page_show', ['slug' => 'laravel-tips']);
      // Returns: '/page/laravel-tips'
      

Integration Tips

  • Laravel Middleware: Bind DynamicRouter to middleware for route-aware logic:

    public function handle($request, Closure $next)
    {
        $match = $this->router->match($request->getPathInfo());
        if ($match['_route'] === 'admin_dashboard') {
            // Custom logic
        }
        return $next($request);
    }
    
  • Route Caching: Cache route collections for performance:

    $router = new DynamicRouter($loader->load('routing.yaml'));
    $router->getRouteCollection()->compile();
    
  • Hybrid Routing: Combine with Laravel’s native router for flexibility:

    Route::get('/legacy', function () {
        return 'Legacy route';
    });
    

Gotchas and Tips

Pitfalls

  1. Route Overrides:

    • Laravel’s native router takes precedence. Ensure DynamicRouter is used before Laravel’s router in middleware/service providers to avoid conflicts.
  2. Parameter Validation:

    • Unlike Laravel, Symfony’s router does not validate parameters by default. Add validation manually:
      $slug = $match['_route_params']['slug'];
      if (!preg_match('/^[a-z0-9\-]+$/', $slug)) {
          abort(404);
      }
      
  3. Case Sensitivity:

    • Routes are case-sensitive by default. Normalize paths in middleware:
      $request->setPathInfo(strtolower($request->getPathInfo()));
      
  4. Circular Dependencies:

    • Avoid circular references in route definitions (e.g., recursive route parameters).

Debugging

  • Dump Route Collection:
    dd($router->getRouteCollection()->getResources());
    
  • Enable Debug Mode: Set SYMFONY_ROUTER_DEBUG=1 in .env to log route matching details.

Extension Points

  1. Custom Route Loaders: Extend YamlFileLoader or XmlFileLoader for custom formats (e.g., JSON):

    use Symfony\Component\Routing\Loader\JsonFileLoader;
    
  2. Route Builders: Use RouteBuilder for programmatic route generation:

    $routeBuilder = new RouteBuilder();
    $routeBuilder->add('home', '/');
    $router = new DynamicRouter($routeBuilder->getRouteCollection());
    
  3. Route Events: Subscribe to ROUTE_MATCH and ROUTE_GENERATE events (via Symfony EventDispatcher) for pre/post-processing.

  4. Laravel Service Provider: Override Laravel’s RouteServiceProvider to integrate DynamicRouter seamlessly:

    protected function mapApiRoutes()
    {
        $router = app(DynamicRouter::class);
        // Use $router->match()/$router->generate() here
    }
    

Configuration Quirks

  • Route Priority: Routes defined later in the loader override earlier ones. Use unique route names to avoid conflicts.
  • Default Routes: Symfony’s router requires at least one route to be defined. Add a fallback:
    $routeCollection->add('fallback', new Route('/{path}', [], [], [], 'GET', [], [], false));
    
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
emuniq/filament-browser-notifications
syriable/filament-translator
hungnm28/livewire-form
wenprise/eloquent
crudly/encrypted
fadion/bouncy
cuci/prototurk-sdk
gos/pubsub-router-bundle
cuci/prototurk-sdk-symfony
clementtalleu/easyadmin-markdown-bundle
codeflextech/permission-manager
karnoweb/livewire-datepicker
sayedenam/sayed-dashboard
milito/query-filter
apiboxsym/user-bundle
apiboxsym/health-check-bundle
jayeshmepani/jpl-moshier-ephemeris-php
elnasnato/laraliveui
labrodev/rest-sdk
sampaui/sampaui