vanio/vanio-web-bundle

Symfony2 Bundle 提供了一些网站开发附加功能

安装次数: 8,084

依赖: 1

建议: 1

安全: 0

星标: 0

关注者: 8

分支: 1

公开问题: 2

类型:symfony-bundle

v0.4.0 2018-10-13 01:57 UTC

README

Build Status Coverage Status PHP7 License

安装

可以使用 composer 通常的方式安装。 composer require vanio/vanio-web-bundle

下一步是在你的 AppKernel 中注册此 bundle 以及它所依赖的 bundle。

// app/AppKernel.php
// ...

class AppKernel extends Kernel
{
    // ...

    public function registerBundles(): array
    {
        $bundles = [
            // ...
            new Vanio\UserBundle\VanioWebBundle,
        ];

        // ...
    }
}

功能

检测请求类型

为了检测当前请求是主请求还是子请求,设置了特殊的请求属性 _request_type。这种逻辑发生在 Vanio\WebBundle\Request\RequestTypeListener 监听器中,该监听器默认未注册。通过将 detect_request_type 配置参数设置为 true 来启用此功能。

重定向到 Referer

在执行某些操作后将用户重定向回原页面是一个相当常见的任务。此 bundle 定义了一个名为 vanio_web.request.referer_resolver 的服务,可以帮助你完成这项任务。首先,它尝试从 _referer(《%vanio_web.referer_parameter%》)查询参数中读取。如果查询参数不存在,则读取 HTTP_REFERER 标头并尝试将引用 URL 与定义的路由进行匹配。在缺少标头或 URL 无效(如指向不同网页的 URL)的情况下,使用回退路径。由于此功能主要在控制器内部使用,因此可以使用 Vanio\WebBundle\Request\RefererHelperTrait,它定义了一个方法 - redirectToReferer(string $fallbackPath = null): RedirectResponse

Flash 消息

对我来说,翻译 flash 消息似乎很复杂。实际上,这非常简单,但你需要一个会话和一个翻译器。仅仅为了显示一个翻译的 flash 消息,就需要两个依赖项。为了简化这一点,有一个 Vanio\WebBundle\Translation\FlashMessage 值对象,你可以用它来封装消息,并将消息参数和域传递给它。此 bundle 还将 translation.extractor.php 服务替换为能够从 FlashMessage 构造函数中提取消息的实现。

$this->addFlash(FlashMessage::TYPE_DANGER, new FlashMessage('message', ['key' => 'value'], 'vanio_web'));

但添加 flash 消息只是问题的一半。你还需要在视图中的某个地方显示它,并自己将其翻译。

验证必填字段

通常,required 选项仅影响 HTML5 的 required 属性。此 bundle 允许设置 validate_required: true 以自动将 NotBlank 约束添加到表单中。默认验证消息可以通过设置 required_message 进行配置。

表单状态 URL 规范化

由于 SEO 优化,以及在某些情况下,由于在 URL 中序列化完整的表单状态过长且难以看,可以在表单选项中设置 canonize: true。提交表单后,它将重定向到规范 URL,其中省略了所有空表单字段(甚至那些等于 empty_data 选项的字段)。

模板化

生成类名

有时,即使仅生成 HTML 元素的类名也可能很麻烦,如果它依赖于某些条件。让我们使用 class_name(array $classes): string Twig 函数。你需要传递一个数组,其中键是类,值是布尔值,指示是否应该存在该类名。

检查文本是否已翻译

要检查文本是否已翻译,您可以使用检查翻译者目录的 is_translated(string $id, string $locale = null) Twig 函数。当文本出现在目录中且翻译值不为 false 时,视为已翻译。

确定当前菜单项

要确定当前请求是否匹配菜单项,请使用 is_current(string $route): bool Twig 函数。当请求属性 _route 等于指定的路由,或者请求路径信息以路由路径开头且以 / 分隔时,视为当前路由。

测试给定对象是否实现了给定类型

在 Twig 中,无法确定给定对象是否实现了给定类型。例如,无法确定闪存消息是否仅为字符串还是添加的 FlashMessage 类的实例。因此添加了 instance of(string $class) Twig 测试。您可以使用它如下

{{ message is instance of('Vanio\\WebBundle\\Translation\\FlashMessage')
    ? message.message|trans(message.parameters, message.domain, message.locale)
    : message }}

从数组中移除值

使用 without(array $array, $values) Twig 过滤器可以移除数组中的特定值。传递一个值或值的数组以移除,它将返回一个新数组,其中指定的值被取消设置。

{{ ['foo', 'bar']|without('foo') }}

从数组中移除键

使用 without(array $array, $keys) Twig 过滤器可以移除数组中的特定键。传递一个字符串或键的数组以移除,它将返回一个新数组,其中指定的键被取消设置。

{{ {foo: 'bar', bar: 'baz'}|without_keys('foo') }}

从数组中移除空值

使用 withoutEmpty(array $array) Twig 过滤器可以移除数组中的空值。值被认为是空值的方式与 empty Twig 测试相同(''falsenull[] 或长度为零的 Countable 实例)。

{{ [null, 1]|without_empty }}

基于正则表达式替换

内置的 replace Twig 过滤器底层使用 strtr,但没有任何基于正则表达式的替换支持。因此,我们实现了 regexp_replace(string $string, $pattern, $replacement) 过滤器。您可以传递一个包含正则表达式作为键和替换值作为值的数组,或者当提供替换参数时,模式可以是字符串或数组(键将被忽略)。

{{ 'foo bar'|regexp_replace({'~foo~': 'baz', '~bar~': 'qux'}) }}
{{ 'foo'|regexp_replace('~foo~', 'bar') }}
{{ 'foo bar'|regexp_replace(['~foo~', '~bar~'], 'baz') }}

将 HTML 转换为纯文本

您是否曾经创建过 HTML 电子邮件?手动提供纯文本替代方案很麻烦,所以在这种情况下,html_to_text(string $html, array $options = []): string Twig 过滤器是您的朋友。它使用方便的 html2text 库。

默认配置

detect_request_type: false
referer_fallback_path: /
referer_parameter: _referer