如何向 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;
}
当然,您还必须复制存根文件并根据需要进行编辑。
我想在我的资源控制器 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;
}
当然,您还必须复制存根文件并根据需要进行编辑。