一、需求介绍
在接口开发项目中,我们常常是分为这么两层,第一层是Controller,第二层是service。
使用php artisan
命令查看,可以知道,Laravel提供了创建控制器的命令,但没有提供创建Service的命令,在这个背景下,我们自己来定制一个创建Service的命令。
注:在命令行中使用 php artisan
之后,Laravel 会加载所有继承于 Command
类的子类。
二、开始定制
1、先创建执行命令
php artisan make:command MakeServiceCommand
执行成功后,我们可以在 app\Console\Commands
下找到一个名为 MakeServiceCommand.php 的文件
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
class MakeServiceCommand extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'command:name';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Command description';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
//
}
}
2、正式开始定制
我们可以模仿创建Event,来定制一个创建service的命令。
被模仿文件位置:
vendor\laravel\framework\src\Illuminate\Foundation\Console\EventMakeCommand.php
<?php
namespace Illuminate\Foundation\Console;
use Illuminate\Console\GeneratorCommand;
class EventMakeCommand extends GeneratorCommand
{
/**
* The console command name.
*
* @var string
*/
protected $name = 'make:event';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Create a new event class';
/**
* The type of class being generated.
*
* @var string
*/
protected $type = 'Event';
/**
* Determine if the class already exists.
*
* @param string $rawName
* @return bool
*/
protected function alreadyExists($rawName)
{
return class_exists($rawName);
}
/**
* Get the stub file for the generator.
*
* @return string
*/
protected function getStub()
{
return __DIR__.'/stubs/event.stub';
}
/**
* Get the default namespace for the class.
*
* @param string $rootNamespace
* @return string
*/
protected function getDefaultNamespace($rootNamespace)
{
return $rootNamespace.'\Events';
}
}
注:由于这个文件比较简单,适合对比模仿参照。
(1)修改继承类
我们可以看到,我们模仿的这个文件是继承于GeneratorCommand
类(GeneratorCommand
类继承于 Command
类)。
因此,首先我们也将之前我们创建的 MakeServiceCommand
类继承也变为 GeneratorCommand
。
(2)修改命令执行名称
修改 $signature
的值为 make:service
(3)修改命令描述
修改 $description
的值为 创建service
(4) 按照被模仿文件修改之后的的样子
<?php
namespace App\Console\Commands;
use Illuminate\Console\GeneratorCommand;
class MakeServiceCommand extends GeneratorCommand
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'make:service {name}';
/**
* The console command description.
*
* @var string
*/
protected $description = '创建service';
/**
* The type of class being generated.
*
* @var string
*/
protected $type = 'Service';
/**
* 指定模板位置
* Get the stub file for the generator.
* @return string
*/
protected function getStub()
{
return __DIR__.'/stubs/service.stub';
}
/**
* Get the default namespace for the class.
*
* @param string $rootNamespace
* @return string
*/
protected function getDefaultNamespace($rootNamespace)
{
return $rootNamespace.'\Http\Service';
}
}
(4)创建生成模板
在 app\Console\Commands 下创建一个命令模板目录,stubs。
并在这个目录下创建 创建Service的命令模板
service.stub
代码:
<?php
namespace DummyNamespace;
class DummyClass
{
public function index()
{
//
}
}
(5)试验效果
php artisan make:service OrderService
会在 app\Http\Service 下生成一个 名为 OrderService.php 的文件,长这个样子。
<?php
namespace App\Http\Service;
class OrderService
{
public function index()
{
//
}
}
php artisan make:service backend/AdminService
会在 app\Http\Service\backend 下生成一个名为 AdminService.php 的文件,它长下面这个样子。
<?php
namespace App\Http\Service\backend;
class AdminService
{
public function index()
{
//
}
}
到此,我们定制的创建service的命令就结束了。