You'll need to alter the entity.node.canonical
route to do this. You can do this via a RouteSubscriber::alterRoutes()
in a custom module to have the route driven by your custom logic. In src/Routing/RouteSubscriber.php:
namespace Drupal\mymodule\Routing;
use Drupal\Core\Routing\RouteSubscriberBase;
use Symfony\Component\Routing\RouteCollection;
/**
* Listens to the dynamic route events.
*/
class RouteSubscriber extends RouteSubscriberBase {
/**
* {@inheritdoc}
*/
public function alterRoutes(RouteCollection $collection) {
// Alter the canonical node route to our custom route
if ($route = $collection->get('entity.node.canonical')) {
$route->setDefault('_controller', '\Drupal\mymodule\Controller\NodeRedirectController::view');
}
}
}
Then build the logic in your custom controller to redirect based on your node type, in src/Controller/NodeRedirectController.php:
namespace Drupal\mymodule\Controller;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Drupal\Core\Entity\EntityInterface;
use Drupal\node\Controller\NodeViewController;
/**
* Custom node redirect controller
*/
class NodeRedirectController extends NodeViewController {
public function view(EntityInterface $node, $view_mode = 'full', $langcode = NULL) {
// Redirect to the edit path on the discussion type
if ($node->getType>bundle() ===== 'discussion') {
return new RedirectResponse('/node/' . $node->id() . '/edit');
}
// Otherwise, fall back to the parent route controller.
else {
return parent::view($node, $view_mode, $langcode);
}
}
}
Lastly, register your routeSubscriber service in mymodules.services.yml:
services:
mymodule.route_subscriber:
class: Drupal\mymodule\Routing\RouteSubscriber
tags:
- { name: event_subscriber }
Documentation is on drupal.org: Altering existing routes and adding new routes based on dynamic ones.