我在项目中用到了repository 模式 需要新创建repository模板,我在想是不是也用命令生成来比较好一些,我搜了一些命令找到 相对应的文件
Illuminate\Foundation\Console\ProviderMakeCommand
Illuminate\Routing\Console\ControllerMakeCommand
使用命令创建一个新的命令生成文件
php artisan make:command MakeRepository
文件内容
<?php
namespace App\Console\Commands;
use Illuminate\Console\GeneratorCommand;
use Symfony\Component\Console\Input\InputOption;
class RepositoryMakeCommand extends GeneratorCommand
{
/**
* The console command name.
*
* @var string
*/
protected $name = 'make:repository';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Create a new repository class';
/**
* The type of class being generated.
*
* @var string
*/
protected $type = 'Repository';
/**
* Get the stub file for the generator.
*
* @return string
*/
protected function getStub()
{
return '.\resources\stubs\Repository\repository.stub'; 对应你的模板文件目录
}
/**
* Get the default namespace for the class.
*
* @param string $rootNamespace
* @return string
*/
protected function getDefaultNamespace($rootNamespace)
{
return $rootNamespace . '\Repositories';
}
/**
* Replace the namespace for the given stub.
*
* @param string $stub
* @param string $name
* @return $this
*/
protected function replaceNamespace(&$stub, $name)
{
$stub = str_replace(
['RepositoryNamespace', 'ModelName'],
[$this->getNamespace($name), $this->setModel()],
$stub
);
return $this;
}
/**
* set Model
*
*/
private function setModel()
{
if (!empty($this->option('model'))) {
return $this->option('model');
} else {
$name = explode('/', $this->getNameInput('name'));
return str_replace('Repository','',$name[count($name)-1]);
}
}
/**
* Get the console command options.
*
* @return array
*/
protected function getOptions()
{
return [
['model', 'm', InputOption::VALUE_OPTIONAL, 'Injection model.']
];
}
}
然后创建 Repository 模板文件 repository.stub
/resources/stubs/repository.stub 我是把模板目录放到这个地方,和上面引入的路径一样就行
文件内容(也可以自已按照需求定义自己的模板)
<?php
namespace RepositoryNamespace;
use App\Model\ModelName;
use App\Repositories\EloquentRepository;
class DummyClass extends EloquentRepository
{
public function __construct(ModelName $model)
{
parent::__construct($model);
}
}
RepositoryNamespace和ModelName 这俩个是自动分配到模板的
注册命令类
将RepositoryMakeCommand添加到 App\Console\Kernel.php
中
protected $commands = [
Commands\RepositoryMakeCommand::class
];
最后使用
php artisan make:repository /Test/TestRepository 生成到 app/repositorys/Test/TestRepository.php
php artisan make:repository TestRepository 生成到 app/repositorys/TestRepository.php
php artisan make:repository TestRepository --model=AAA 生成到 app/repositorys/TestRepository.php,指定model AAA
我们还设置了一个model的参数 用来指定model 不设置默认为 你的Repository文件名,你也可以设置自己需要的参数