bhuvidya / laravel-blade-helper
一个Laravel 5包,用于在创建Blade指令时提供抽象。
Requires
- php: >=7.1.0
- laravel/framework: ~5.5.0|~5.6.0|~5.7.0
This package is auto-updated.
Last update: 2024-09-07 20:17:34 UTC
README
一个Laravel 5包,简化Blade指令的创建。
请注意,此包已在Laravel 5.6上进行了测试。它应该可以在>=5.5的版本上运行,但我无法保证它可以在更早的版本上工作。抱歉。
向Liam(https://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中,关于指令是否应该仅用于代码结构,而不是表示,有一些讨论。就我个人而言,我喜欢自定义指令,即使是用于“表示”或“方便”用途,因为
- 它使模板文件更干净,更容易阅读
- 将代码放在一个地方更容易在将来更改
作为最后的例子,这里是一个关于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>";
});