vinorcola / helper-bundle
提供几个辅助工具的包。
Requires
- php: ^8.0
- symfony/dependency-injection: ^5.0 | ^6.0
- symfony/framework-bundle: ^5.0 | ^6.0
- symfony/translation: ^5.0 | ^6.0
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)
,只需像注入任何服务一样注入你的存储库即可。