ディスカッションコンテンツタイプがあります。 ( "discussion/discussion-name"での)主要な表示エクスペリエンスを、フォームモードを使用してキャッシュ可能なフォームにしたいと考えています。
基本的に、私はそれを表示して編集できる誰もがWebアプリエクスペリエンスのようなものを作成しようとしているため、ビューと編集を分離する意味はなく、より統合されたエクスペリエンスが望まれます。
簡単なはずですが、1つのコンテンツタイプのルーティングをオーバーライドする方法については何も見つかりませんでした。
コンテンツタイプのルートを上書きするにはどうすればよいですか?
これを行うには、_entity.node.canonical
_ルートを変更する必要があります。カスタムモジュールのRouteSubscriber::alterRoutes()
を使用してこれを行うと、カスタムロジックによってルートを駆動できます。 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');
}
}
}
_
次に、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() == 'discussion') {
return new RedirectResponse('/node/' . $node->id() . '/edit');
}
// Otherwise, fall back to the parent route controller.
else {
return parent::view($node, $view_mode, $langcode);
}
}
}
_
最後に、mySubsystem.services.ymlにrouteSubscriberサービスを登録します。
_services:
mymodule.route_subscriber:
class: Drupal\mymodule\Routing\RouteSubscriber
tags:
- { name: event_subscriber }
_
ドキュメントはdrupal.orgにあります: 既存のルートを変更し、動的ルートに基づいて新しいルートを追加する 。