wieni/wmcontroller

为 Drupal 9 实体添加特定捆绑控制器的支持。

安装数: 17,100

依赖者: 3

建议者: 1

安全: 0

星标: 3

关注者: 8

分支: 4

开放问题: 4

类型:drupal-module

2.0.3 2024-08-12 19:39 UTC

README

Latest Stable Version Total Downloads License

为 Drupal 8 实体添加特定捆绑控制器的支持。

为什么?

  • 通过提供以不同方式渲染不同捆绑实体实体的能力,改进 Entity API 的开发者体验。
  • 构建布局的新方法:在控制器中收集数据,并使用它来渲染 Twig 模板。灵感来自 Laravel 和其他 MVC 框架。完全可选。

安装

此软件包需要 PHP 7.1 和 Drupal 8 或更高版本。可以使用 Composer 进行安装

 composer require wieni/wmcontroller

如果您在控制器中遇到早期渲染错误,请还应该包含来自 #2638686 的补丁。

配置

在开始之前,请确保将模板存储的组件或模块配置为执行此操作。有关更多信息,请参阅 wmtwig 文档

配置存储为服务参数。您可以在定义在 $settings['container_yamls'] 的服务 YAML 文件或(自定义)模块的 services.yml 文件中覆盖这些参数。

parameters:
    wmcontroller.settings:
        # The controller responsible for forwarding to bundle-specific controllers.
        # Only override this if you know what you're doing.
        frontcontroller: 'Drupal\wmcontroller\Controller\FrontController'

        # Throw a 404 NotFoundHttpException when an entity is not translated
        # in the current language. ( /en/node/123 gives 404 if node/123 has no
        # en translation )
        404_when_not_translated: true

        # Routes to never reroute through the front controller
        ignore_routes: []

它是如何工作的?

创建控制器

  • 通过创建具有以下命名约定的新类来创建特定捆绑的控制器

    src\Controller\<entityType>\<bundle>Controller

    (<entityType><bundle>单数和驼峰命名)

    例如:src\Controller\TaxonomyTerm\CategoryController 将与捆绑为 categorytaxonomy_term 匹配。

  • 此模块将始终在控制器类上调用 show 方法。

  • 提供了一个包含 ViewBuilderTraitMainEntityTraitRedirectBuilderTraitControllerBase 类,但扩展此类不是必需的。

示例

// src/Controller/Node/ArticleController.php
<?php

namespace Drupal\mymodule\Controller\Node;

use Drupal\Core\Controller\ControllerBase;
use Drupal\node\NodeInterface;

class ArticleController extends ControllerBase
{
    public function show(NodeInterface $node)
    {
        return [
            '#theme' => 'article_node',
            '#node' => $node,
        ];
    }
}

渲染 Twig 模板

使用 ViewBuilder 类,您可以轻松渲染 Twig 模板,而无需处理渲染数组。

此模块自动解析视图构建器到渲染数组,因此可以在控制器中安全地返回此类的实例。

构建视图的最简单方法是使用包含在 ControllerBaseViewBuilderTrait 中的 view 方法。只需传递模板名称、任何参数即可。

模板名称是模板文件的路径,但以点作为路径分隔符,且不带文件扩展名。请注意,您只能在配置的组件和路径中使用模板。

示例

// src/Controller/Node/ArticleController.php
<?php

namespace Drupal\mymodule\Controller\Node;

use Drupal\Core\Controller\ControllerBase;
use Drupal\mymodule\Entity\Node\Article; # See wieni/wmmodel

class ArticleController extends ControllerBase
{
    public function show(Article $article)
    {
        // Loads mytheme/templates/article/detail.html.twig
        return $this->view(
            'article.detail',
            [
                'article' => $article,
            ]
        );
    }
}

访问主实体

访问当前请求的主实体通常很有用,例如在规范或编辑路由上。始终可以通过从当前路由匹配的路由参数中提取它来访问此实体,但 MainEntity 服务使这变得更容易。

除了更容易访问实体外,还可以使用MainEntityTrait或直接使用wmcontroller.main_entity服务手动设置自定义路由的主实体。

如果安装了wmpage_cache模块,此主实体还用于确定当前请求的可缓存元数据。

变更日志

本项目所有显著变更都将记录在CHANGELOG文件中。

安全

如果您发现任何安全问题,请发送电子邮件至security@wieni.be,而不是使用问题跟踪器。

许可证

遵循MIT许可证发布。更多信息请参阅LICENSE文件。