bhuvidya/laravel-blade-helper

一个Laravel 5包,用于在创建Blade指令时提供抽象。

v1.0.1 2018-09-07 07:27 UTC

This package is auto-updated.

Last update: 2024-09-07 20:17:34 UTC


README

License Total Downloads Latest Stable Version Latest Unstable Version

一个Laravel 5包,简化Blade指令的创建。

请注意,此包已在Laravel 5.6上进行了测试。它应该可以在>=5.5的版本上运行,但我无法保证它可以在更早的版本上工作。抱歉。

向Liamhttps://github.com/ImLiam)表示敬意,他在Laravel框架(laravel/framework#24923)上提出了这个作为pull request。我非常喜欢这个概念,所以我把他写的代码放进了这个包里,供其他人使用。这个README借鉴了他的pull request中的说明。

安装

bhuvidya/laravel-blade-helper 添加到您的应用程序中

$ composer require "bhuvidya/laravel-blade-helper"

如果您使用的是Laravel 5.5或更高版本,则无需编辑 app/config/app.php

否则,编辑 app/config/app.php 并添加服务提供者

'providers' => [
    'BhuVidya\BladeHelper\BladeHelperServiceProvider',
]

配置

该包附带自己的配置文件,您可以在应用程序中安装和调整

artisan vendor:publish --provider='BhuVidya\BladeHelper\BladeHelperServiceProvider' --tag=config

这将安装配置文件到您的应用程序的配置目录。它的内容是

return [
    /*
    |--------------------------------------------------------------------------
    | Service instance "name"
    |--------------------------------------------------------------------------
    */
    'instance' => 'bhuvidya.blade_helper',

    /*
    |--------------------------------------------------------------------------
    | You can elect to register an alias for the facade automatically, and give
    | it your own custom class name. Set to false to not register.
    |--------------------------------------------------------------------------
    */
    'facade' => 'BladeHelper',
];

如你所见,你可以自定义服务容器实例名称,以及(可能更有用),如果需要,自动加载外观,并使用你自己的类名。

用法

基本上,这个助手为“定义自定义Blade指令”的过程提供了一个优雅的抽象级别。它的好处在于允许连接的函数(或闭包)拥有一个良好的参数列表,而无需编写解析来自Laravel核心的原始表达式字符串的冗余代码。这使得您可以将外部函数快速转换为Blade指令。

例如,将php函数 join 转换为指令

// Define the helper directive
BladeHelper::helper('join');

// Use it in a view
@join('|', ['Hello', 'world'])

// Get the compiled result
<?php echo join('|', ['Hello', 'world']); ?>

// See what's echoed
"Hello|world"

虽然这是一个虚构的例子,但它可以让你明白。

第二个参数也可以接受回调。与Blade::directive(...)方法相比,这里使用回调的优点是闭包可以定义特定的参数,而不是仅通过原始表达式传递。这有几个很好的东西可以解决Liam提出的先前想法

  • 为回调的参数添加类型提示
  • 在指令调用时操作和使用单个参数,而不是将原始表达式作为字符串传递
  • 无需仅将其用作代理到应用程序另一部分的辅助函数或类的指令
// Define the helper directive
BladeHelper::helper('example', function($a, $b, $c = 'give', $d = 'you') {
    return "$a $b $c $d up";
});

// Use it in a view
@example('Never', 'gonna')

// Get the compiled result
<?php echo \Illuminate\Support\Facades\Blade::getHelper('example', 'Never', 'gonna'); ?>

// See what's echoed
"Never gonna give you up"

默认情况下,所有辅助指令在使用时都会将内容输出到视图。可以通过传递false作为第三个参数来禁用此功能。

// Define the helper directive
BladeHelper::helper('log', null, false);

// Use it in a view
@log('View loaded...')

// Get the compiled result
<?php log('View loaded...'); ?>

// Nothing is echoed

pull request中,关于指令是否应该仅用于代码结构,而不是表示,有一些讨论。就我个人而言,我喜欢自定义指令,即使是用于“表示”或“方便”用途,因为

  1. 它使模板文件更干净,更容易阅读
  2. 将代码放在一个地方更容易在将来更改

作为最后的例子,这里是一个关于FontAwesome 4图标的逻辑包装器。围绕它有一些可能不想每次都记得写的样板代码,你也不想在每次都使用@include。虽然它可以是普通函数并且操作相同,但这是你可能会想要一点语法糖的情况,因为它可以用得很频繁——而且也没有将其作为普通函数或辅助函数的优势,因为你永远不会在视图之外使用它。另外,如果你决定调整<i>元素的HTML(比如添加一个新的aria属性),你只需在一个地方做这件事。

BladeHelper::helper('fa', function(string $iconName, string $text = null, $classes = '') {
    if (is_array($classes)) {
        $classes = join(' ', $classes);
    }

    $text = $text ?? $iconName;

    return "<i class='fa fa-{$iconName} {$classes}' aria-hidden='true' title='{$text}'></i><span class='sr-only'>{$text}</span>";
});