lukeraymonddowning / stubble
用于stub文件的模板引擎
Requires
- php: ^7.4|^8.0
- illuminate/support: ^8.0
- spatie/macroable: ^1.0|^2.0
Requires (Dev)
- nunomaduro/collision: ^5.4
- orchestra/testbench: ^6.18
- pestphp/pest-plugin-expectations: ^1.3
- phpunit/phpunit: ^9.5
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
的,允许您定义自己的修饰符。我们建议您在 ServiceProvider
的 boot
方法中这样做。每个修饰符应该返回一个修改后的字符串值。
// 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