web-dev-qa-db-ja.com

コンテンツタイプノードルートの表示を引き継ぐ

ディスカッションコンテンツタイプがあります。 ( "discussion/discussion-name"での)主要な表示エクスペリエンスを、フォームモードを使用してキャッシュ可能なフォームにしたいと考えています。

基本的に、私はそれを表示して編集できる誰もがWebアプリエクスペリエンスのようなものを作成しようとしているため、ビューと編集を分離する意味はなく、より統合されたエクスペリエンスが望まれます。

簡単なはずですが、1つのコンテンツタイプのルーティングをオーバーライドする方法については何も見つかりませんでした。

コンテンツタイプのルートを上書きするにはどうすればよいですか?

3
Jonathan

これを行うには、_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にあります: 既存のルートを変更し、動的ルートに基づいて新しいルートを追加する

4
Shawn Conn