如何向 Laravel Artisan 生成的代码添加更多内容?

How can I add more to the code generated by Laravel Artisan?

我想在我的资源控制器 class 声明上方包含一些注释代码,最好在使用 php artisan make:controller MyController -resource 生成控制器时添加。即,我想在每个控制器文件的顶部添加路径别名:

/*
Verb            URI                     Action              Route Name              desc
GET             /photos                 index               photos.index            Display a listing of the resource.
GET             /photos/create          create              photos.create           Show the form for creating a new resource.
POST            /photos                 store               photos.store            Store a newly created resource in storage.
GET             /photos/{photo}         show                photos.show             Display the specified resource.
GET             /photos/{photo}/edit    edit                photos.edit             Show the form for editing the specified resource.
PUT/PATCH       /photos/{photo}         update              photos.update           Update the specified resource in storage.
DELETE          /photos/{photo}         destroy             photos.destroy          Remove the specified resource from storage.
*/

这纯粹是一个方便的示例,但有时我想向使用 artisan 生成的模型和迁移添加其他内容。这可以做到吗?我需要重新编译 artisan 二进制文件吗?

这有点棘手,但如果您知道如何绕过容器,您应该没问题。

首先,您必须通过扩展默认方法来覆盖 ArtisanServiceProvider 并更改此方法。

/**
 * Register the command.
 *
 * @return void
 */
protected function registerControllerMakeCommand()
{
    $this->app->singleton('command.controller.make', function ($app) {
        return new ControllerMakeCommand($app['files']);
    });
}

通过这样做,您只需允许自己在容器中分配自定义 ControllerMakeCommand

然后您只需复制 class 并更改您想要的代码。

在你的例子中是存根文件。

/**
 * Get the stub file for the generator.
 *
 * @return string
 */
protected function getStub()
{
    $stub = null;

    if ($this->option('parent')) {
        $stub = '/stubs/controller.nested.stub';
    } elseif ($this->option('model')) {
        $stub = '/stubs/controller.model.stub';
    } elseif ($this->option('invokable')) {
        $stub = '/stubs/controller.invokable.stub';
    } elseif ($this->option('resource')) {
        $stub = '/stubs/controller.stub';
    }

    if ($this->option('api') && is_null($stub)) {
        $stub = '/stubs/controller.api.stub';
    } elseif ($this->option('api') && ! is_null($stub) && ! $this->option('invokable')) {
        $stub = str_replace('.stub', '.api.stub', $stub);
    }

    $stub = $stub ?? '/stubs/controller.plain.stub';

    return __DIR__.$stub;
}

当然,您还必须复制存根文件并根据需要进行编辑。