balping / laravel-blade-function
这个 Laravel 5.1+ 包允许您在 blade 模板内声明函数。
Requires
- balping/laravel-version: ^1.0.0
- illuminate/support: ^5.1|^6.0|^7.0|^8.0|^9.0|^10.0|^11.0
Requires (Dev)
- orchestra/testbench: ^9.0
- phpunit/phpunit: ^11.0|^12.0
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
也很丑陋。