创建用于生成自定义类或文件的artisan命令的最佳方式(或者实际完成的方式)是什么?就像php artisan make:console
本身一样,它为我们的新工匠命令创建了一个php类。
从我的想法来看,我们有两个选择:
使用php heredoc(或新命令的类文件中的任何字符串)为该新文件添加模板,这非常麻烦。
将模板文件放在某处,读取,替换所需内容,然后创建新文件。但我不知道放置模板文件的最佳位置。
那么在Laravel处理这种情况是否有最好的做法?我用谷歌搜索了它,但是只有简单的工匠命令创建的文章和文档。
答案 0 :(得分:10)
Laravel使用.stub
个文件作为模板,并替换模板中的标记。
由于您提到了make:console
命令,以供参考,您可以查看以下文件:
vendor/laravel/framework/src/Illuminate/Foundation/Console/stubs/console.stub
vendor/laravel/framework/src/Illuminate/Foundation/Console/ConsoleMakeCommand.php
php artisan make:console
命令时执行的代码。如果你想看一下这样做的软件包,一个很好的例子就是Jeffrey Way在Laracasts的generators软件包。
答案 1 :(得分:8)
我知道这个问题有点老了,但是如果您只想创建Laravel已经做过的类似文件,这很容易。 (我想创建一个在创建时附加一些自定义特征的工作)
因此,首先看一下here on github随附的Laravel存根。
接下来,选择想要的类类型的存根(我复制了job-queued stub)并将其粘贴到可以在应用中访问的位置。我将我放在App\Console\Stubs
内,因为这很有意义,命令将使用存根。
然后,使用php artisan make:command commandName
创建您的工匠命令。
在创建的命令内部使用此文件Illuminate\Console\GeneratorCommand
。现在,使您的命令扩展此类而不是Command
;该类是Laravel用于创建类的类,它扩展了Command
本身。
在命令内部创建一些属性和方法,如下所示:
protected $name = 'make:custom-file'; The name of your command. This replaces $signature
protected $description = 'Command description.';
protected $type = 'Job'; Type of class to make
//location of your custom stub
protected function getStub()
{
return app_path().'/Console/Stubs/custom-job.stub';
}
//The root location the file should be written to
protected function getDefaultNamespace($rootNamespace)
{
return $rootNamespace.'\Jobs';
}
//option flags if any see this for how it works
protected function getOptions()
{
return [];
}
有关类的外观的完整示例如下:
<?php
namespace App\Console\Commands;
use Illuminate\Console\GeneratorCommand;
class CustomJob extends GeneratorCommand
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $name = 'make:custom';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Create a custom job.';
/**
* The type of class being generated.
*
* @var string
*/
protected $type = 'Job';
/**
* Get the stub file for the generator.
*
* @return string
*/
protected function getStub()
{
return app_path().'/Console/Stubs/custom-job.stub';
}
/**
* Get the default namespace for the class.
*
* @param string $rootNamespace
* @return string
*/
protected function getDefaultNamespace($rootNamespace)
{
return $rootNamespace.'\Jobs';
}
/**
* Get the console command options.
*
* @return array
*/
protected function getOptions()
{
return [];
}
}
运行自定义工匠命令后,它将把自定义存根写入指定的位置。