2

I have a module where I created a route /page/tag/{term} that uses a controller for modifications to how the term page is handled.

The problem is that when any page displays these term links, they don't use the custom route, but the default /taxonomy/term/{id}.

How can I tell the taxonomy term links to use my custom route?

Adding the path as the term alias skips over the custom route entirely.

OR, how would I get rid of the custom route and create a pathauto pattern using the same path, but tell those pages to use my custom controller?

I have tried both methods without success...


Here is what I've tried with modifying the existing route:

modulename.services.yml

services:
  modulename.route_subscriber:
    class: Drupal\modulename\Routing\RouteSubscriber
    tags:
      - { name: event_subscriber, priority: 100 }

modulename/src/Routing/RouteSubscriber.php

namespace Drupal\modulename\Routing;

use Drupal\Core\Routing\RouteSubscriberBase;
use Symfony\Component\Routing\RouteCollection;

/**
 * Listens to the dynamic route events.
 */
class RouteSubscriber extends RouteSubscriberBase {

    /**
    * {@inheritdoc}
    */
    protected function alterRoutes(RouteCollection $collection) {
        if ($route = $collection->get('entity.taxonomy_term.canonical')) {
            // i've tried both of these
            $route->addDefaults(['_controller' => '\Drupal\modulename\Controller\ListController::list_by_tag' ']);
            $route->addDefaults(['_title' => 'test']);
        }
    }

}

Edit: after seeing this, I thought about keeping my custom route and using the alterRoutes to change the links...

$route->setPath('/page/tag');

That worked, but it adds on ?taxonomy_term=123

How can I get the term name into the url? /page/tag/term


Update:

Still can't figure out how to get the term name from the route (without loading the taxonomy entity - I'd imagine that is too much load)

Also, I will need to make sure I'm in a specific vocabulary before changing the route.

Any ideas?

  • you do not get rid of the original route, get rid of your route and alter the existing route instead. routes are hardcoded like links were in <=d7 so altering them makes no sense. – user21641 Aug 14 '17 at 20:07
  • How would I go about doing this and having the existing route use my custom controller? – Deez Aug 14 '17 at 20:31
  • Create event subscriber service from \Symfony\Component\EventDispatcher\EventSubscriberInterface and listen to \Drupal\Core\Routing\RoutingEvents::ALTER event. – user21641 Aug 14 '17 at 20:39
  • ´RouteSubscriberBase` already contains this even listener. See drupal.org/docs/8/api/routing-system/… – 4k4 Aug 14 '17 at 21:37

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.