zenstruck / twig-service-bundle
使函数、静态方法、Symfony服务方法在您的twig模板中可用。
Requires
- php: >=8.0
- symfony/framework-bundle: ^5.4|^6.0|^7.0
- symfony/twig-bundle: ^5.4|^6.0|^7.0
Requires (Dev)
- phpstan/phpstan: ^1.4
- phpunit/phpunit: ^9.5
- symfony/console: ^5.4|^6.0|^7.0
- symfony/phpunit-bridge: ^6.1|^7.0
- symfony/var-dumper: ^5.4|^6.0|^7.0
- zenstruck/console-test: ^1.4
README
将应用程序服务的数据在twig模板中可用可以通过以下方式实现
- 在渲染模板时注入服务/数据。
- 创建一个可以访问服务/数据的twig扩展。
对于#1,这并不总是可行的选择(例如,您需要在布局中需要此数据)。对于#2,存在一些样板代码,如果做得不正确(例如,没有使用运行时或服务代理重服务),可能会导致性能问题。
此包提供了一种简单的方法来使函数、静态方法、服务方法和甚至整个服务对象在您的twig模板中可用。
安装
composer require zenstruck/twig-service-bundle
注意
如果没有由symfony/flex
自动添加,请启用ZenstruckTwigServiceBundle
。
使用方法
注意
以下函数/过滤器输出的结果将被转义。如果您的函数/过滤器返回您不想转义HTML,请使用|raw
过滤器。
作为函数/过滤器的服务方法
您可以使用#[AsTwigFunction]
属性标记您配置的服务中的任何公共方法,以便在twig模板中使用fn()
twig函数/过滤器。
// ... use Zenstruck\Twig\AsTwigFunction; class SomeService { // ... #[AsTwigFunction] // will be available as "fn_someMethod()" in twig public function someMethod($arg1, $arg2): string { // ... } #[AsTwigFunction('alias')] // will be available as "fn_alias()" in twig public function anotherMethod($arg1, $arg2): string { // ... } }
在您的twig模板中,使用fn()
函数/过滤器来调用
{# as a function: #} {{ fn('someMethod', 'foo', 'bar') }} {{ fn('alias', 'foo', 'bar') }} {# as a filter: #} {{ 'foo'|fn('someMethod', 'bar') }} {{ 'foo'|fn('alias', 'bar') }}
动态函数/过滤器现在可用。以下与上面相同
{# as a function: #} {{ fn_someMethod('foo', 'bar') }} {{ fn_alias('foo', 'bar') }} {# as a filter: #} {{ 'foo'|fn_someMethod('bar') }} {{ 'foo'|fn_alias('bar') }}
作为函数/过滤器的用户定义
您可以使用#[AsTwigFunction]
属性标记您自己的任何自定义函数,以便在twig模板中使用fn()
twig函数/过滤器。
use Zenstruck\Twig\AsTwigFunction; #[AsTwigFunction] // will be available as "some_function" in twig function some_function($arg1, $arg2): string { // ... } #[AsTwigFunction('alias')] // will be available as "alias" in twig function another_function($arg1, $arg2): string { // ... }
在您的twig模板中,使用fn()
函数/过滤器来调用
{# as a function: #} {{ fn('some_function', 'foo', 'bar') }} {{ fn('alias', 'foo', 'bar') }} {# as a filter: #} {{ 'foo'|fn('some_function', 'bar') }} {{ 'foo'|fn('alias', 'bar') }}
动态函数/过滤器现在可用。以下与上面相同
{# as a function: #} {{ fn_some_function('foo', 'bar') }} {{ fn_alias('foo', 'bar') }} {# as a filter: #} {{ 'foo'|fn_some_function('bar') }} {{ 'foo'|fn_alias('bar') }}
第三方函数/过滤器
如果您需要将函数、静态/服务方法在您的twig模板中提供,但这些代码不是您控制的(例如,内部PHP函数/第三方包),您可以在包配置中配置这些。
zenstruck_twig_service: functions: - strlen # available as "fn_strlen()" in twig - [service.id, serviceMethod] # available as "fn_serviceMethod()" in twig - [Some\Class, somePublicStaticMethod] # available as "fn_somePublicStaticMethod()" in twig # use the array key to customize the name functions: len: strlen # available as "fn_len()" in twig custom: [service.id, serviceMethod] # available as "fn_custom()" in twig alias: [Some\Class, somePublicStaticMethod] # available as "fn_alias()" in twig
服务函数
使用#[AsTwigService]
标记您希望在twig模板中可用的任何服务。
注意
虽然您可以标记任何服务为twig服务,但建议不要标记与模板无关的服务(例如,存储库)为这种类型。您可以认为twig服务是轻量级-延迟加载的twig扩展函数,其目的是简化大型自定义twig扩展。
namespace App\Twig\Service; // ... use Zenstruck\Twig\AsTwigService; #[AsTwigService(alias: 'posts')] class PostService { public function __construct(private PostRepository $repo) { } /** * @return Post[] */ public function latestPosts(int $number = 10): array { return $this->repo->findLatestPosts($number); } }
现在您可以在任何twig模板中访问该服务
{% for post in service('posts').latestPosts(5) %} {# ... #} {% endfor %}
每个服务别名都作为动态函数提供。以下与上面相同
{% for post in service_posts().latestPosts(5) %} {# ... #} {% endfor %}
可调用的服务过滤器
您可以通过实现__invoke()
将任何twig服务转换为twig过滤器。
namespace App\Twig\Service; // ... use Zenstruck\Twig\AsTwigService; #[AsTwigService(alias: 'image_transformer')] class ImageTransformer { public function __invoke(string $imageUrl, string ...$transformations): string { // adds transformation to url and returns new url } }
在您的模板中使用service
twig过滤器
{{ url|service('image_transformer', 'square-200', 'watermark') }}
每个服务别名都作为动态过滤器提供。以下与上面相同
{{ url|service_image_transformer('square-200', 'watermark') }}
参数函数
您可以使用提供的parameter()
twig函数访问任何服务容器参数。
{% for locale in parameter('kernel.enabled_locales') %} {# ... #} {% endfor %}
zenstruck:twig-service:list
命令
使用此命令列出此包配置的所有函数/过滤器/服务以及它们在您的twig模板中可用。
注意
此命令仅在 debug: true
的情况下可用。
bin/console zenstruck:twig-service:list
Available Functions/Filters
---------------------------
// As function: call with fn('{alias}', {...args}) or fn_{alias}({...args})
// As filter: use as {value}|fn('{alias}', {...args}) or {value}|fn_{alias}({...args})
---------- ---------------------------------------------
Alias Callable
---------- ---------------------------------------------
strlen strlen
generate @router->generate()
---------- ---------------------------------------------
Available Services
------------------
// Access via service('{alias}') or service_{alias}()
// If invokable, use as {value}|service('{alias}', {...args}) or {value}|service_{alias}({...args})
------- -------------------- ------------
Alias Service Invokable?
------- -------------------- ------------
foo App\SomeService yes
bar App\AnotherService no
------- -------------------- ------------
完整默认组件配置
zenstruck_twig_service: # Callables to make available with fn() twig function/filter functions: # Examples: 0: strlen # available as "strlen" alias: [Some\Class, somePublicStaticMethod] # available as "alias"