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

Symfony Bundle Routing Laravel Package

binsoul/symfony-bundle-routing

View on GitHub
Deep Wiki
Context7

Getting Started

Minimal Setup

  1. Installation:

    composer require binsoul/symfony-bundle-routing
    

    Register the bundle in config/bundles.php (Symfony) or config/app.php (Laravel via Symfony bridge):

    return [
        // ...
        Binsoul\RoutingBundle\RoutingBundle::class => ['all' => true],
    ];
    
  2. First Use Case: Dynamically generate routes or validate existing ones without manual YAML/XML annotations. Example (Symfony-style, adaptable to Laravel via Route facade):

    use Binsoul\RoutingBundle\Routing\Router;
    
    $router = $this->container->get('binsoul_routing.router');
    $route = $router->generate('app_homepage', ['_locale' => 'en']);
    
  3. Where to Look First:

    • src/Routing/Router.php for core logic.
    • config/packages/binsoul_routing.yaml for default configurations.
    • tests/ for usage examples and edge cases.

Implementation Patterns

Workflows

  1. Dynamic Route Generation: Use the Router service to generate URLs at runtime with parameters:

    $url = $router->generate('user_profile', ['id' => 123, '_locale' => 'fr']);
    
  2. Route Validation: Validate if a route exists before generation:

    if ($router->hasRoute('app_homepage')) {
        $url = $router->generate('app_homepage');
    }
    
  3. Laravel Integration: Bind the Symfony router to Laravel’s Route facade via a service provider:

    public function register()
    {
        $this->app->singleton('binsoul_routing.router', function ($app) {
            return $app->make('router')->getRouter();
        });
    }
    
  4. Custom Route Loaders: Extend Binsoul\RoutingBundle\Loader\RouteLoaderInterface to load routes from custom sources (e.g., database):

    class DatabaseRouteLoader implements RouteLoaderInterface
    {
        public function load(RouteCollection $collection)
        {
            $routes = DB::table('routes')->get();
            foreach ($routes as $route) {
                $collection->add($route->name, new Route($route->path, [...]));
            }
        }
    }
    
  5. Middleware Integration: Attach middleware to routes dynamically:

    $route = new Route('/admin', [...]);
    $route->addRequirement('_role', 'admin');
    $collection->add('admin_dashboard', $route);
    

Integration Tips

  • Symfony Bridge: Use Symfony\Bridge\Laravel\Routing\LaravelRouter to share route collections between frameworks.
  • Caching: Enable route caching in binsoul_routing.yaml:
    binsoul_routing:
        cache: true
    
  • Localization: Leverage the bundle’s built-in locale support for multi-language routes:
    $router->generate('homepage', ['_locale' => 'es']);
    

Gotchas and Tips

Pitfalls

  1. Namespace Collisions: Ensure route names are unique across bundles/applications. Prefix with bundle names (e.g., binsoul_homepage).

  2. Laravel-Specific Quirks:

    • The bundle assumes Symfony’s Router interface. For Laravel, wrap it in a facade or service:
      Route::generate('route_name'); // Custom facade method
      
    • Avoid mixing Laravel’s Route helpers with Symfony’s Router methods (e.g., route('name') vs $router->generate()).
  3. Configuration Overrides: Default configs in binsoul_routing.yaml may conflict with Laravel’s routes.php. Merge them explicitly:

    $this->mergeConfigFrom(__DIR__.'/binsoul_routing.php', 'binsoul_routing');
    
  4. Route Collection Immutability: The RouteCollection is immutable after loading. Create a new instance or use add() carefully:

    $collection = new RouteCollection();
    $collection->add('dynamic_route', new Route('/dynamic', [...]));
    

Debugging

  • Route Dumping: Dump the entire route collection for debugging:
    dump($router->getRouteCollection()->all());
    
  • Locale Fallbacks: If _locale parameters fail, check binsoul_routing.yaml for default locale settings:
    binsoul_routing:
        default_locale: en
    

Extension Points

  1. Custom Route Attributes: Extend Binsoul\RoutingBundle\Annotation\Route to add metadata:

    #[Route(name: 'custom_route', path: '/custom', attributes: ['priority' => 100])]
    
  2. Event Listeners: Subscribe to binsoul_routing.route_loaded events to modify routes post-load:

    $dispatcher->addListener('binsoul_routing.route_loaded', function (RouteLoadedEvent $event) {
        $event->getRoute()->setDefault('_priority', 50);
    });
    
  3. Route Compiler: Override Binsoul\RoutingBundle\Compiler\RouteCompiler to customize route matching logic (e.g., regex patterns).

  4. Testing: Mock the Router service in PHPUnit:

    $router = $this->createMock(Router::class);
    $router->method('generate')->willReturn('/mocked-url');
    $this->app->instance('binsoul_routing.router', $router);
    
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.
directorytree/privacy-filter-classifier
directorytree/privacy-filter
datacore/hub-sdk
develia/commons
cuci/prototurk-sdk
cuci/prototurk-sdk-symfony
develia/geo-bundle
dreamzy/livewire-charts
touchestate-sdk/php-sdk
22h/doctrine-garbage-collection-bundle
agtp/agtp-php
agtp/mod-php
splash/sonata-admin
splash/metadata
splash/openapi
splash/scopes
splash/toolkit
testo/output-teamcity
testo/bridge-symfony
spatie/flare-daemon-runtime