支持Laravel.io的持续发展 →

使用自定义Blade指令提升Laravel模板功能

2023年4月11日 阅读时间:5分钟

简介

Blade 是 Laravel 中功能强大的模板引擎,您可以使用它编写简洁的模板,使用简单易懂的语法来构建复杂的布局。

我喜欢 Blade 的一个酷特性是可以创建自己的自定义指令。它们允许您定义自己的自定义语法,您可以在 Blade 模板中使用这些语法来使模板更具表达性并且更易于阅读。

在本篇文章中,我们将探讨如何在 Laravel 中创建您自己的自定义 Blade 指令。

什么是 Blade 指令?

Blade 指令是一些实用的快捷方式,您可以将它们添加到模板中以减少使用原始 PHP 的需要。它们以 @ 符号开始,后跟指令和任何参数。

如果您以前使用过 Laravel,您可能已经使用过 Blade 指令,但没有意识到。例如,您可能使用 @if@endif 指令在 Blade 模板中编写过 if 语句,如下所示:

@if($user->isAdmin())
    <p>This user is an admin.</p>
@endif

当 Blade 模板被转换为常规 PHP 时,它将转换为这个样子:

{!! <?php if($user->isAdmin()): ?>
    <p>This user is an admin.</p>
{!! <?php !!} endif; ?>

如你所见,尽管原始 PHP 版本并不那么优雅,但阅读起来仍然相当容易。

所以,为了表明 Blade 掩盖了多少复杂性,我们来了解一下另一个表面上看似简单但背后有很多进程的指令。

您可能已经使用过@foreach@endforeach指令来遍历一组项目。

@foreach($users as $user)
    <p>{{ $user->name }}</p>
@endforeach

当这个Blade模板转换为常规PHP时,它将被转换为这样

{!! <?php $__currentLoopData = $users; $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $user): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
    <p>{!! <?php echo e($user->name); ?></p>
{!! <?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); ?>

如您所见,这里有更多的事情发生,Blade为我们很好地整理了。

Laravel附带了许多内置的Blade指令,您可以在文档中查看。对于您项目中大多数需求,这些指令可能提供您所需的所有功能。

但可能有时候您想创建自己的个性化Blade指令。如果您发现自己反复编写相同的小块代码,您可能会这样做。因此,它是一种很好的简化模板并使其更具有表现力的方式。

但是,值得注意的是,如果反复重写的代码超过几行,您可能想考虑将其移动到一个组件中。指令最适合短的代码片段(可能是一到两个PHP语句)。

创建自定义Blade指令

让我们快速看看您如何编写自己的个性化Blade指令。

我们可以想象我们希望编写一个自定义指令,该指令渲染一个特定的有利于人类的格式的Carbon日期对象。我们将这个指令称为@friendlyDateTime

在我们尝试创建新的指令之前,让我们看看如果没有使用自定义指令,我们将如何编写将Carbon日期对象渲染成我们想要的格式的代码。我们可能这么做:

$carbonObject = \Carbon\Carbon::parse('2023-03-24 14:30:00');

echo $carbonObject->format('D d M Y @ H:i');

运行上述代码将输出以下内容:

Fri 24 Mar 2023 @ 14:30

现在让我们将这段代码转换为Blade指令。为了做到这一点,我们需要将指令注册到Blade编译器中。我们可以在服务提供商中使用Blade::directive方法。为了这篇文章的目的,我们将使用现有的AppServiceProvider,但您可能希望将此代码添加到新的服务提供商中,如果这样更符合您的喜好。

让我们来看看我们注册指令的代码:

namespace App\Providers;

use Illuminate\Support\Facades\Blade;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    // ...

    public function boot()
    {
        Blade::directive('friendlyDateTime', function (string $expression): string {
            return "{!! <?php echo ($expression)->format('D d M Y @ H:i'); ?>";
        });
    }
}

如上图所示,我们定义了一个新的@friendlyDateTime指令,它接受一个字符串,例如$user->created_at。当Blade模板编译成普通PHP代码时,它看起来可能像这样:

{!! <?php echo ($user->created_at)->format('D d M Y @ H:i'); ?>

在我们的Blade模板中,我们应该能够使用@friendlyDateTime指令。以下是如何使用它的几个示例:

@friendlyDateTime(\Carbon\Carbon::parse('2023-03-24 14:30:00'))

@friendlyDateTime(now())

@friendlyDateTime($user->created_at)

@friendlyDateTime($post->updated_at)

@friendlyDateTime($user->last_login_at)

如您所见,创建您自己的自定义Blade指令相对简单。您还可以向这些指令添加更复杂的逻辑。例如,您可能决定让应用程序的用户选择他们看到的日期格式(我们假设存储在users表上的datetime_format字段中)。

所以,您可以将Blade指令代码更改为如下所示:

Blade::directive('friendlyDateTime', function (string $expression): string {
    return "{!! <?php echo ($expression)->format(auth()->datetime_format); ?>";
});

如果我们想象一些用户可能更喜欢看到"Fri Mar 24 2023 @ 14:30"而不是"Fri 24 Mar 2023 @ 14:30",则该指令会处理这种情况,而无需在我们的模板中添加任何条件逻辑。

结论

希望这篇文章能让您迅速了解Blade指令是什么,它们如何工作,以及如何创建自己的。

如果您喜欢阅读这篇文章,我会很乐意听到您的想法。同样,如果您有任何改善将来文章的反馈,我也乐意听到。

您还可能对我的220多页的电子书感兴趣,“Battle Ready Laravel”,它更深入地讨论了类似的主题。

如果您想要在每次我发布新帖子时收到更新,请自由地订阅下面的通讯。

继续搭建精彩的事物!🚀

最后更新 1年前。

driesvints, zamon, achmedislamic, massimoselvi 点赞了这篇文章

4
喜欢这篇文章吗? 告诉作者并给予他们点赞!
ash-jc-allen (Ash Allen) 我是一名来自英国普雷斯顿的自由职业Laravel网络开发者。我维护Ash Allen设计博客,并参与了许多酷炫和令人兴奋的项目 🚀

你可能喜欢的其他文章

2024年3月11日

如何使用Larastan将您的Laravel应用程序从0发展到9

在您的Laravel应用程序执行之前找到错误是可能的,这要归功于Larastan,它...

阅读文章
2024年7月19日

不带性状的API响应标准化

我注意到大多数人创建的API响应库都是使用性状实现的,并且...

阅读文章
2024年7月17日

在您的Laravel项目中通过Discord通知收集反馈

如何在Laravel项目中创建一个反馈模块,并在收到消息时收到Discord通知...

阅读文章

我们感谢这些 令人惊叹的公司 对我们的支持

在这里放您的标志?

Laravel.io

问题解决、知识共享和社区建设的Laravel门户。

© 2024 Laravel.io - 版权所有。