vinorcola/helper-bundle

提供几个辅助工具的包。

安装: 75

依赖: 1

建议者: 0

安全: 0

星星: 0

关注者: 2

分支: 0

开放问题: 0

类型:symfony-bundle

v1.4.1 2022-11-14 13:16 UTC

README

提供一些有用的基础类和服务。

翻译系统

该包提供一个名为TranslationModel的服务,它通过标准化构建翻译键的方式,帮助构建国际化应用程序。

当你翻译一个应用程序时,你通常会结束于对消息进行2类排序:与对象(实体)的属性相关的消息和与页面上下文相关的消息。

与页面上下文相关的消息

此翻译系统引入了一种基于路由名称的相对系统。例如,如果你的操作是由名为myController.myAction的路由触发的,那么如果你翻译消息键message(使用TranslationModel::tr),它将在Symfony翻译系统中查找键myController.myAction.message。这有助于简化模板。

{% extends 'base.html.twig' %}

{% block title %}{{ pageTitle() }}{% endblock %}

{% block body %}
    <p>{{ 'message'|tr }}</p>

    {{ form_start(form) }}
        {{ form_widget(form) }}
        <div class="form-group">
            <button class="btn btn-primary">{{ 'submit'|tr }}</button>
            <a href="{{ path('...') }}" class="btn btn-secondary">{{ 'cancel'|tr }}</a>
        </div>
    {{ form_end(form) }}
{% endblock %}

在这个例子中,

  • {{ 'message'|tr }}相当于{{ 'myRouteName.message'|trans }}
  • {{ 'submit'|tr }}相当于{{ 'myRouteName.submit'|trans }}
  • {{ 'cancel'|tr }}相当于{{ 'myRouteName.cancel'|trans }}
  • {{ pageTitle() }}相当于{{ 'title'|tr }}{{ 'myRouteName.title'|trans }}

此外,系统将自动用百分号(%)包装翻译参数

{# With Symfony translation #}
{{ 'myRouteName.message'|trans({ '%title%': someTitle, '%date%': someDate }) }}

{# With VinorcolaHelper translation #}
{{ 'message'|tr({ title: someTitle, date: someDate }) }}

如果你喜欢,你仍然可以保留百分号(或者出于兼容性目的)

{# Those lines are all equivalent: #}
{{ 'message'|tr({ title: someTitle, date: someDate }) }}
{{ 'message'|tr({ title: someTitle, '%date%': someDate }) }}
{{ 'message'|tr({ '%title%': someTitle, '%date%': someDate }) }}

如果你需要翻译特定的消息(而不是带有路由名称的前缀的相对消息),你只需在消息键前加上一个=符号

{# With Symfony translation #}
{{ 'some.specific.message'|trans({ '%title%': someTitle, '%date%': someDate }) }}

{# With VinorcolaHelper translation #}
{{ '=some.specific.message'|tr({ title: someTitle, date: someDate }) }}

如果你需要复数翻译,你可以在消息键后加上一个+符号

{# With Symfony translation #}
{{ 'myRouteName.message'|transchoice(5, { '%title%': someTitle, '%date%': someDate }) }}

{# With VinorcolaHelper translation #}
{{ 'message+'|tr({ count: 5, title: someTitle, date: someDate }) }}

与对象属性相关的消息

TranslationModel::tra()方法帮助根据对象属性构建翻译键。你必须提供一个属性名称和一个对象名称,然后它将使用Symfony翻译系统将消息attribute.myObject.myAttribute翻译。

例如在模板中

<table>
    <thead>
        <tr>
            <th>{{ 'title'|tra('user') }}</th>
            <th>{{ 'emailAddress'|tra('user') }}</th>
            <th>{{ 'city'|tra('user') }}</th>
            <th></th>
        </tr>
    </thead>
    <tbody>
        {% for user in users %}
            <tr>
                <td>{{ user.title }}</td>
                <td>{{ user.emailAddress }}</td>
                <td>{{ user.city }}</td>
            </tr>
        {% endfor %}
    </tbody>
</table>
  • {{ 'title'|tra('user') }}相当于{{ 'attribute.user.title'|trans }}
  • {{ 'emailAddress'|tra('user') }}相当于{{ 'attribute.user.emailAddress'|trans }}
  • {{ 'city'|tra('user') }}相当于{{ 'attribute.user.city'|trans }}

然后你可以在Symfony表单中使用此模式

<?php

namespace App\Form\Panel;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\OptionsResolver\OptionsResolver;

class MyType extends AbstractType
{
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefault('label_format', 'attribute.myObject.%name%');
    }
}

基础控制器

该包提供了一个继承自Symfony基础控制器的基础控制器,有助于使用翻译系统。它提供了轻松添加错误消息到表单和闪存消息的方法。

此外,它提供了一个saveDatabase()方法,基本上是执行$em->flush()。你的控制器在可读性上得到了提升,而且如果你将存储库作为服务使用,你就不需要再注入EntityManager了!

简单存储库

此包提供了一个非常简单的存储库,可以帮助你将存储库作为服务声明。不再需要$em->getRepository(MyEntity::class),只需像注入任何服务一样注入你的存储库即可。