# 如何自行建立 php artisan make: 模板 PART(2)
>製作:Tinn
>參考:Google各位大神、laravel官網...
---
在PART(1) 建立repository後 現在難度要再增加了
目前我們所要建立的 services 程式裡會 use 到 repository
預設讓use的repository 名稱與services相同
Ex:
要讓 TestServices.php use TestRepository
TestServices.php
```php=
<?php
namespace App\Services;
use App\Repository\TestRepository;
class DummyClass
{
public function __construct()
{
}
}
?>
```
---
## 目標?
- [php aritisan make:repository](https://hackmd.io/X1z5ahqDQli6PbVf8IOLFw?both)
- [php aritisan make:services](https://hackmd.io/pf2a8UYHTBWIJRkwXUL3xg)
- php aritisan make:autoclass (一次性創建controller、repository、services)
---
### 生成文件
在app\Console\Commands資料夾下建立ServicesMakeCommand.php檔案
---
```php=
<?php
/**
* Created by PhpStorm.
* User: 20181201
* Date: 2019/2/22
* Time: 下午 01:46
*/
namespace App\Console\Commands;
use Illuminate\Console\GeneratorCommand;
use Symfony\Component\Console\Input\InputOption;
class ServicesMakeCommand extends GeneratorCommand
{
/**
* The console command name.
*
* @var string
*/
protected $name = 'make:services';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Create a new services class';
/**
* The type of class being generated.
*
* @var string
*/
protected $type = 'Services';
/**
* Get the stub file for the generator.
*
* @return string
*/
protected function getStub()
{
return __DIR__ . '/stubs/services.stub';
}
/**
* Get the default namespace for the class.
*
* @param string $rootNamespace
* @return string
*/
protected function getDefaultNamespace($rootNamespace)
{
return $rootNamespace . '\Services';
}
/**
* Replace the namespace for the given stub.
*
* @param string $stub
* @param string $name
* @return $this
*/
protected function replaceNamespace(&$stub, $name)
{
$stub = str_replace(
[/*'RepositoryNamespace', */
'NameRepository'],
[/*$this->getNamespace($name),*/
$this->setModel()],
$stub
);
return $this;
}
/**
* set Model
*
*/
private function setModel()
{
if (!empty($this->option('repository'))) {
return $this->option('repository') . "Repository";
} else {
$name = explode('/', $this->getNameInput('name'));
$new = str_replace('Services', '', $name[0]);
// return str_replace('Services"', '', $new . "Repository");
return $new . "Repository";
}
}
/**
* Get the console command options.
*
* @return array
*/
protected function getOptions()
{
return [
['repository', 'r', InputOption::VALUE_OPTIONAL, 'Injection repository.'],
];
}
}
```
---
### 建立模版檔案
在app\Console\Commands\stubs下建立模版檔案 .stub檔案是make命令生成的類檔案的模版,用來定義要生成的類檔案的通用部分建立Services.stub模版檔案:
我的範例檔如下 <font color='red'>目前看專案與架構 未來可將常用的class 引入</font>:
---
```php=
namespace App\Services;
use App\Repository\NameRepository;
use App\Repository\EmployeeRepository;
class DummyClass
{
protected $_employeeRepository;
protected $_NameRepository;
public $employeeId;
public $companyId;
public function __construct()
{
$this->_employeeRepository = new EmployeeRepository;
$this->_NameRepository = new NameRepository;
}
}
```
---
### 註冊命令類
---
將ServicesMakeCommand新增到App\Console\Kernel.php中
---
```php=
protected $commands = [
//
Commands\RepositoryMakeCommand::class,
Commands\ServicesMakeCommand::class,
Commands\AutoMakeCommand::class
];
```
---
# 好了完成可以開始食用 :fork_and_knife:
---
### Thank you! :sheep: