支持 Laravel.io 的持续开发 →

创建 make:custom 命令

5 Mar, 2022 3 min read

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内部,我删除了每一个方法,并覆盖了三个新方法:getStubgetDefaultNamespacereplaceClass

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内容。

上次更新1年前。

brunoalfred, cosmeoes, yvan-burrie, suandedev 喜欢了这篇文章

4
喜欢这篇文章?让作者知道并为他们鼓掌!

您可能还喜欢以下文章

March 11th 2024

如何使用 Larastan 将 Laravel 应用从 0 到 9 进行优化

器官在您的 Laravel 应用在执行之前找到错误是可能的,归功于 Larastan,它...

阅读文章
July 19th 2024

无需特性即可标准化 API 响应

我注意到大多数用于 API 响应的库都是在 traits 中实现的,并且...

阅读文章
July 17th 2024

通过 Discord 通知收集你的 Laravel 项目反馈

如何在 Laravel 项目中创建一个反馈模块,并在发布消息时收到 Discord 通知...

阅读文章

感谢这些 令人惊叹的公司 对我们的支持

你的标志在这里?

Laravel.io

Laravel 问题解决、知识共享和社区建设的门户。

© 2024 Laravel.io - 版权所有。