Laravel 提供了一项功能,允许我们生成一些常用的类,如模型、工厂、通知等。如果我们想创建一个模型,例如,可以通过以下命令来创建:
php artisan make:model MyModel
但如果我们可以为我们自定义的类做这件事呢?为什么不用一个简单的命令来自动化这个过程?在本篇文章中,我会向您展示如何做到这一点。
我们从最后开始
在我们开始之前,我们需要考虑我们正在构建什么。我想创建一个命令,该命令创建一个空的报告类,该类扩展了一个不同的虚构的 Report
类。我希望可以运行这样一个命令:
php artisan make:report MonthlyReport
这将创建一个位于 app/Reports/
目录下的类,内容如下:
<?php
namespace App\Reports;
class MontlyReport extends Report
{
public function generate()
{
// TODO: add code..
}
}
当然,你的类不必完全像我这样,你可以使用我将向您展示的来创建一个生成命令,以满足你的需求。
生成生成命令
首先,我们需要创建一个处理类生成的命令。使用以下命令创建一个新的命令:
php artisan make:command MakeReport
我把我的命令命名为 MakeReport
,你可以根据你的用例来命名。
之后,我们可以在 app/Console/Commands/
下找到它。打开文件,将扩展的类从 Command
改为 GeneratorCommand
。
此时,我们还应该将签名更改为 make:report {name}
(将 "report" 替换为你的类型)。
<?php
namespace App\Console\Commands;
use Illuminate\Console\GeneratorCommand;
class MakeReport extends GeneratorCommand
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'make:report {name}';
...
}
我们先回到这个命令。在这之前,让我们创建我们类的模板。
添加类模板
为了创建我们班级的模板,我们需要在app/Console/Commands
目录下创建一个新的文件夹,命名为Stubs
。在这个文件夹中,我们需要创建一个新的文本文件,包含我们类的模板。我创建了一个名为make-report.stub
的文件,并在该文件中添加了类的模板
<?php
namespace App\Reports;
class DummyReport extends Report
{
public function generate()
{
// TODO: add code..
}
}
类名DummyReport
只是一个占位符,用于实际的类名。您可以将其设置为任何您想要的内容,但请记住这只是占位符,因为我们将在下一步中替换它。
生成逻辑
现在,在我们之前创建的命令MakeReport
内部,我删除了每一个方法,并覆盖了三个新方法:getStub
、getDefaultNamespace
和replaceClass
class MakeReport extends GeneratorCommand
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'make:report {name}';
//...
public function getStub()
{
return app_path() . '/Console/Commands/Stubs/make-report.stub';
}
public function getDefaultNamespace($rootNamespace)
{
return $rootNamespace . '\Reports';
}
public function replaceClass($stub, $name)
{
$stub = parent::replaceClass($stub, $name);
return str_replace("DummyReport", $this->argument('name'), $stub);
}
}
在第一个方法中,我们定义了我们的stub文件路径。在第二个方法中,我们添加了生成命令的命名空间,在这种情况下,它将是App\Reports
。命名空间将用于计算新类的正确路径。在最后的方法中,我们将DummyReport
类名替换为作为命令参数发送的实际类名。
最终结果
至此,我们已创建了一个命令,通过在终端中运行这个命令即可生成我们的自定义类
php artisan make:report MyReport
并且会自动创建一个新的报告。
如果您喜欢这篇文章,请在Twitter上关注我点击这里,我在那里发布技巧和其他Laravel内容。
brunoalfred, cosmeoes, yvan-burrie, suandedev 喜欢了这篇文章