balping/laravel-blade-function

这个 Laravel 5.1+ 包允许您在 blade 模板内声明函数。

v0.4.3 2024-03-30 18:23 UTC

This package is auto-updated.

Last update: 2024-08-30 18:20:24 UTC


README

此 Laravel 包允许您在 blade 模板内声明函数。安装后,您将不再需要使用部分函数。

此包与 Laravel 5.1 – 5.8, 6 - 11 兼容

在 Laravel 5.4 中引入了 组件。组件与这个包解决的问题存在重叠。因此,从 5.4 开始,您可能希望考虑使用组件。尽管如此,它们是不同的,此包在某些情况下可能仍然提供更干净、更简单的解决方案。

安装

在终端中运行此命令

composer require balping/laravel-blade-function

如果您使用 Laravel >=5.5,则此步骤是不必要的,多亏了 包自动发现

将此行添加到 config/app.php 文件中的 providers 数组

Balping\BladeFunction\BladeFunctionServiceProvider::class,

就这么多。

如何使用它

您可以在视图中这样声明和使用函数

@extends('layouts.app')

@function(hello ($who))
    Hello {{$who}}!
@endfunction

@section('content')
    <p>
        @hello('World')
    </p>
@endsection

@function 指令接受函数名称和参数列表作为参数。如果您的函数不需要参数,则可以省略括号

{{-- Both are correct: --}}

@function( printhello () )
    Hello
@endfunction

@function(printhello)
    Hello
@endfunction

在这种情况下,调用函数时也可以省略括号:@printhello()@printhello 都是正确的。

您可以在函数内部使用任何其他 blade 指令

@function(mylist ($items))
    <ul>
        @foreach($items as $item)
            <li>{{$item}}</li>
        @endforeach
    </ul>
@endfunction

@mylist([1, 2, 3]) {{-- Prints ∙1 ∙2 ∙3  --}}

还有一个 @return 指令,以防万一。但您可能不需要这个。

@function(theanswer())
	@return(42)
@endfunction

您可以使用 use 关键字自动从父作用域传递变量作为引用

@function(hello ($who) use ($lang))
    {{$lang == 'de' ? 'Hallo' : 'Hello'}} {{$who}}!
@endfunction

<?php $lang = 'en'; ?>
@hello('World')

需要注意的事项和注意事项

与 PHP 的一般用法不同,blade 函数必须在调用它们之前声明!就像在古老的 C 天一样。但是,尽管在 C 中您可以使用头文件来实现这一点,在这种情况下,函数必须在您使用它们的 同一视图文件 中声明。然而,这不应该成为问题,请参阅 何时(不)使用它 部分。

使用 @function 指令声明函数时,该函数将是一个真正的 PHP 函数,并且它将位于全局命名空间中。这意味着您不能使用 PHP 关键字和已声明的函数作为函数名称。

您可以在纯 PHP 代码中调用以传统方式声明的函数。然而,在这种情况下,您需要手动传递 $__env 变量。(这被 blade 用于各种事情,例如在 foreach 循环中。)

{{-- These are the same --}}
@hello('world')
<?php hello('world', $__env); ?>

如果您使用 use 关键字,也需要手动传递额外的参数

@function(hello ($who) use ($lang))
    ...
@endfunction

<?php $lang = 'en'; ?>


{{-- These are the same --}}
@hello('World')
<?php hello('world', $lang, $__env); ?>

何时(不)使用它

此包旨在帮助 展示 小事物。但只有当 blade 语法很有用的时候。

我创建了这个包,因为我经常发现自己将部分视为函数。这可以相当丑陋且方便,尤其是在您将一些数据 作为参数 传递时。所以,当您想提取一些 blade 代码,但不想将其放入单独的部分视图中时,这可能就是您想要使用 blade 函数的时候。将部分包含在函数中(见下面的示例)也可能是一个好主意。

请注意,在大多数情况下,将逻辑和展示分离是一个好主意。因此,你不应该用它来解析数据或计算阶乘序列(尽管你可以,见示例)。它也不适合用作辅助函数,在这些函数中,你可以不使用HTML格式化一些数据(例如,你可以在app/Http/helpers.php文件中添加你自定义的日期格式化函数等)。

示例

包装部分视图

这看起来是一个常见的情况

@include('partials.modal', [
	'header' => 'Alert',
	'body'   => 'Something terrible happened.'
])

你可以用上面的代码替换为这个

@function(modal ($header, $body))
    @include('partials.modal', compact('header', 'body'))
@endfunction

...

@modal('Alert', 'Something terrible happened.')

{{-- Let's reuse it --}}

@modal('Success', 'You\'re great!')

干净多了,不是吗?

阶乘

你不应该这样做。我的意思是,你真的不应该这样做。这不是blade设计的目的。但是的,现在你可以使用bladish语法进行递归了 :-P

@function(factorials ($n))
    @if($n <= 1)
        {{1}}
        @return(1)
    @endif


    {{$tmp = $n * factorials($n - 1, $__env)}}

    @return($tmp)
@endfunction

@factorials(5) {{-- prints 1 2 6 24 120 --}}

贡献

欢迎任何贡献。可能有一个更好的方法来做这件事,因为你可以向blade添加扩展和自定义编译器。但它是不文档化的,我对Laravel的了解还不够深入,无法理解blade解析器中的运作。如果你了解更多,请帮助我重写这部分。我真的不喜欢函数必须首先在同一个文件中定义,而且每次都必须传递$__env也很丑陋。