ekino/drupal-debug

为Drupal 8提供替代调试内核,以改善开发者体验。

安装: 677

依赖项: 0

建议者: 0

安全: 0

星星: 31

关注者: 20

分支: 8

开放问题: 16

类型:composer-plugin

v0.1.0-alpha 2019-06-13 07:56 UTC

This package is auto-updated.

Last update: 2024-09-05 00:28:45 UTC


README

Build Status Scrutinizer Code Quality Code Coverage

此库提供Drupal 8的替代内核,以改善开发过程中的开发者体验。

此调试内核扩展(但默认完全替换)原始Drupal内核,以改变一些内部Drupal行为。这样做的原因是:帮助您更好地、更快地开发!

一旦安装此库,您将在开发过程中体验到“调试模式”。例如,当您添加或删除自定义服务、路由或模块钩子实现时,您不再需要手动清除缓存。

要求

此库要求您的Drupal项目使用Composer。如果不是这样,您可以通过例如此Composer模板进行检查。

它仅支持最新发布的Drupal次要版本

它仅支持当前支持的PHP版本

安装

将此库作为开发依赖项要求。

composer require ekino/drupal-debug --dev

必须仅作为开发依赖项安装。您不希望在生产中使用它!

操作

此库使用“操作”。操作有一个独特的目标,可以改善您使用Drupal的开发体验。

目前,所有操作都是启用和强制性的,但计划逐步将其中的大多数设置为可选。

此外,您目前还不能提供自己的自定义操作,但这也是未来的计划。

以下是当前可用的操作列表以及它们如何帮助您

更多即将到来!

配置

一些操作可以通过选项进行配置,这些选项可以在专用配置文件中设置。然而,此配置文件不是必需的,因为每个选项都有一个默认值,如果未显式定义,则将其解决。

目前,这些选项不能独立于每个操作(使用此文件)进行配置,但这当然也是计划中的。可配置的是重复使用的选项的默认值。如果您想为每个操作指定选项,您必须手动使用调试内核

以下是默认配置文件内容(即如果配置文件不存在或键未定义,则为默认解决的配置)

# This is the drupal-debug configuration file.
drupal-debug:

    # The defaults values are common values that are reused by different actions.
    defaults:
        cache_directory_path: cache
        logger:
            enabled: true
            channel: drupal-debug
            file_path: logs/drupal-debug.log
        charset: null
        file_link_format: null

    # It is recommended to disable the original Drupal Kernel substitution to run your tests.
    # To programmatically toggle it, use the two dedicated composer commands.
    substitute_original_drupal_kernel:
        enabled: true
        composer_autoload_file_path: vendor/autoload.php

        # If not specified, it fall backs to the default cache directory path.
        cache_directory_path: null

默认情况下,此配置文件的位于项目根目录(Composer vendor目录的父目录)。但它可以通过DRUPAL_DEBUG_CONFIGURATION_FILE_PATH环境变量定义。

为了性能,解决后的配置被缓存。默认情况下,此缓存的位于系统临时目录。但它可以通过DRUPAL_DEBUG_CONFIGURATION_CACHE_DIRECTORY_PATH环境变量定义。

以下是所有具有选项的操作列表

显示漂亮的异常

  • charset:异常页面的字符集。
  • fileLinkFormat:用于创建到您的IDE的链接的文件链接格式。
  • logger:用于记录异常的LoggerInterface实例。

尽快显示漂亮的异常

  • charset:异常页面的字符集。
  • fileLinkFormat:用于创建到您的IDE的链接的文件链接格式。

将错误抛出为异常

  • levels:必需。抛出错误的E_*常量的位字段。
  • logger: 一个用于记录错误的 LoggerInterface 实例。

监控容器定义

  • cacheFilePath: 必需。缓存的容器定义文件的存储位置。
  • resourcesCollection: 必需。一个 ResourcesCollection 实例(要监控的资源)。

监控模块钩子实现

  • cacheFilePath: 必需。缓存的模块钩子实现文件的存储位置。
  • resourcesCollection: 必需。一个 ResourcesCollection 实例(要监控的资源)。

监控路由定义

  • cacheFilePath: 必需。缓存的路由文件的存储位置。
  • resourcesCollection: 必需。一个 ResourcesCollection 实例(要监控的资源)。

Composer 命令

以下是提供的Composer命令列表,这些命令可以帮助您管理配置文件

原始 Drupal 内核替换

具体替换原始 Drupal 内核意味着,每当在Composer自动加载文件被加载后,使用到 DrupalKernel 类的地方,实际上使用的是这个库中的 DebugKernel 类,尽管外表看起来不是这样!

这很好,因为任何与 Drupal 交互的第三方库(例如 drush)将自动使用调试内核。

然而,它可能导致一些不期望的行为,特别是在这个库的WIP阶段。这就是为什么你在运行测试等情况下不应该使用原始 Drupal 内核替换。仅用于开发部分!

手动使用调试内核

您可以直接在您的入口控制器(通常是在您的公开目录中的 index.php 文件)中使用调试内核来指定每个操作的选项。这也是在禁用原始 Drupal 内核替换的情况下使用调试内核的解决方案。

您只需要使用 OptionsStackBuilder 辅助类来构建一个 OptionsStack 实例,并将其传递给 DebugKernel 构造函数。

在选项堆栈中手动设置选项将覆盖配置中定义的默认值(如果存在)。

以下是一个示例用法

<?php

/**
 * @file
 * The PHP page that serves all page requests on a Drupal installation.
 *
 * All Drupal code is released under the GNU General Public License.
 * See COPYRIGHT.txt and LICENSE.txt files in the "core" directory.
 */

use Ekino\Drupal\Debug\Kernel\DebugKernel;
use Ekino\Drupal\Debug\Option\OptionsStackBuilder;
use Ekino\Drupal\Debug\Resource\Model\ResourcesCollection;
use Symfony\Component\Config\Resource\FileResource;
use Symfony\Component\HttpFoundation\Request;

$optionsStack = OptionsStackBuilder::create()
  ->setDisplayPrettyExceptionsOptions('utf-8', 'phpstorm://open?file=%%f&line=%%l', NULL)
  ->setWatchContainerDefinitionsOptions('/tmp/container_definition.php', new ResourcesCollection([
    new FileResource('/var/www/my_drupal_project/web/modules/custom_module/custom_module.services.yml'),
  ]))
  ->getOptionsStack();

$autoloader = require_once 'autoload.php';

$kernel = new DebugKernel('prod', $autoloader, TRUE, NULL, $optionsStack);

$request = Request::createFromGlobals();
$response = $kernel->handle($request);
$response->send();

$kernel->terminate($request, $response);