用于stub文件的模板引擎

v0.2.0 2021-06-01 16:38 UTC

This package is auto-updated.

Last update: 2024-08-29 05:10:02 UTC


README

为Laravel项目和包中的.stub文件提供简单模板语言的工具。

Stubble是什么?

如果您曾经为Laravel创建过包,那么您可能也创建了一些小的stub文件,这些文件在执行特定命令时会被发布到用户的项目的用户目录下。通常,这些stub文件将包含基于用户输入的动态内容。例如,您可能需要根据传递给Artisan命令的参数填写类名、命名空间或文件名。

通常,动态内容的实际值是相同的,但格式可能需要根据其位置进行更改;文件名可能需要使用短横线连接法,而类名应该是PascalCase。重新定义所有这些简单的转换以发布stub确实很麻烦。如果可以在stub文件内部定义这些转换会怎样呢?这正是Stubble允许您做到的。

安装

您可以通过Composer安装Stubble

composer require lukeraymonddowning/stubble

使用方法

假设您正在编写一个Artisan命令,该命令发布2个文件:一个类和一个blade视图。类引用blade视图,但我们不想让用户必须指定两个名称;blade视图的文件名应该由类的名称自动确定。让我们假设命令看起来像这样

php artisan make:magic MyDesiredClassName

您有一个类的stub文件,可能看起来像这样

// class.php.stub

<?php

class {{ class }} extends Component {

    public function render() {
        return view('{{ view }}');
    }

}

在这里,我们需要创建2个替换值:"class"和"view",但实际上视图的名称就是类的名称,只是格式是kebab-case而不是PascalCase。让我们用stubble重写我们的stub

// class.php.stub

<?php

class {{ class | pascal }} extends Component {

    public function render() {
        return view('{{ class | kebab }}');
    }

}

请注意,我们不再需要引用两个不同的变量。相反,我们给变量添加一个修饰符,描述它在替换之前应该如何转换。

现在,在我们的Artisan命令中,我们可以使用publish方法轻松地将我们的stub发布到用户的应用程序

public function handle() {
    Stubble::publish('path/to/your/stub.php', app_path('Some/Directory/File.php'), ['class' => $this->argument('name')]);
}

Stubble将负责复制文件,执行必要的内容转换,并将其发布到新位置。

可用的修饰符

修饰符是转换stub文件内内容的关键。您可以使用竖线|字符分隔多个修饰符。

basename

basename修饰符将返回给定类字符串的基本名称

// class: Some\Deeply\Nested\Thing
class {{ class | basename }} {} // class Thing {}

camel

camel修饰符将给定的值转换为大驼峰命名法。

classname

classname修饰符如果可能,将字符串转换为其完全限定的类名

// class: Some/Class/With/Forward/Slashes
use {{ class | classname }} // Some\Class\With\Forward\Slashes

// view: some-nested.view
use {{ view | classname }} // SomeNested\View

kebab

kebab修饰符将给定的值转换为kebab-case。

lower

lower修饰符将给定的值转换为小写。

plural

plural修饰符将给定的值转换为复数形式。例如,'duck'将变成'ducks'。

singular

singular修饰符将给定的值转换为其单数形式。例如,'ducks'将变成'duck'。

snake

snake修饰符将给定的值转换为snake_case。

studly

studly修饰符将给定的值转换为大驼峰命名法。

upper

upper修饰符将给定的值转换为大写。

view

view修饰符将类字符串转换为有效的视图目标

// class: Some\ProjectClass

return view('{{ class | view }}'); // some.project-class

链式多个修饰符

修饰符可以串联在一起以执行多个转换。它们将按从左到右的顺序应用。修饰符使用 | 字符分隔

// .stub
Welcome to the {{ jungle | upper | plural }}! // Welcome to the JUNGLES!

添加新的修饰符

Lukeraymonddowning\Stubble\Modifier 类是 Macroable 的,允许您定义自己的修饰符。我们建议您在 ServiceProviderboot 方法中这样做。每个修饰符应该返回一个修改后的字符串值。

// ServiceProvider
Modifier::macro('vowelless', function ($content) {
    return Str::of($content)->remove(['a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'])->__toString();
});

// .stub
Hello {{ example | vowelless }} // All vowels will be removed from the value of 'example'

替换文件内容而不发布

如果您想在文件上执行标签转换,但将其作为字符串返回以进行其他工作,可以使用 file 方法

$content = Stubble::file('path/to/your/stub.php.stub', ['key' => 'value']);

在存根文件外部转换值

有时,您可能想在存根文件之外使用 Stubble 的功能,例如用于给定存根的文件名。您可以使用替换方法做到这一点

$filename = (new Stubble)->replace("path/to/your/{{ file | kebab }}.php", ['file' => $this->argument('name')]);

提示!当使用 publish 方法时,您可以在 $destinationPath 参数中直接使用标签,以轻松实现动态文件名。

Stubble::publish(
    'path/to/stub.php',
    'Path/To/Your/{{ class | basename }}.php',
    ['class' => $this->argument('class')]
);

自定义存根标签

默认情况下,Stubble 将使用 {{}} 分别作为标签的开始和结束。您可以使用 defineTags 方法自定义这些定位符

Stubble::defineTags('--', '--'); // Use -- as the tag locators
Stubble::defineTags('{{', '--'); // Use {{ as the starting locator and -- as the ending locator