106
common/Generators/Action/GenerateAction.php
Executable file
106
common/Generators/Action/GenerateAction.php
Executable file
@@ -0,0 +1,106 @@
|
||||
<?php
|
||||
|
||||
namespace Common\Generators\Action;
|
||||
|
||||
use Illuminate\Support\Str;
|
||||
use Illuminate\Console\GeneratorCommand;
|
||||
use InvalidArgumentException;
|
||||
use Symfony\Component\Console\Input\InputOption;
|
||||
|
||||
class GenerateAction extends GeneratorCommand
|
||||
{
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
protected $name = 'make:action';
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
protected $description = 'Create a new action class';
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
protected $type = 'Action';
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
protected function getStub()
|
||||
{
|
||||
return __DIR__.'/stubs/action.stub';
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $rootNamespace
|
||||
* @return string
|
||||
*/
|
||||
protected function getDefaultNamespace($rootNamespace)
|
||||
{
|
||||
$base = "$rootNamespace\Actions";
|
||||
$modelClass = class_basename($this->parseModel($this->option('model')));
|
||||
return $this->option('model') ? "$base\\$modelClass" : $base;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $name
|
||||
* @return string
|
||||
*/
|
||||
protected function buildClass($name)
|
||||
{
|
||||
$replace = [];
|
||||
|
||||
if ($this->option('model')) {
|
||||
$replace = $this->buildModelReplacements($replace);
|
||||
}
|
||||
|
||||
return str_replace(
|
||||
array_keys($replace), array_values($replace), parent::buildClass($name)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $replace
|
||||
* @return array
|
||||
*/
|
||||
protected function buildModelReplacements(array $replace)
|
||||
{
|
||||
$modelClass = $this->parseModel($this->option('model'));
|
||||
|
||||
return array_merge($replace, [
|
||||
'DummyFullModelClass' => $modelClass,
|
||||
'DummyModelClass' => class_basename($modelClass),
|
||||
'DummyModelVariable' => lcfirst(class_basename($modelClass)),
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $model
|
||||
* @return string
|
||||
*/
|
||||
protected function parseModel($model)
|
||||
{
|
||||
if (preg_match('([^A-Za-z0-9_/\\\\])', $model)) {
|
||||
throw new InvalidArgumentException('Model name contains invalid characters.');
|
||||
}
|
||||
|
||||
$model = trim(str_replace('/', '\\', $model), '\\');
|
||||
|
||||
if (! Str::startsWith($model, $rootNamespace = $this->laravel->getNamespace())) {
|
||||
$model = $rootNamespace.$model;
|
||||
}
|
||||
|
||||
return $model;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
protected function getOptions()
|
||||
{
|
||||
return [
|
||||
['model', 'm', InputOption::VALUE_OPTIONAL, 'The model that the request applies to.'],
|
||||
];
|
||||
}
|
||||
}
|
||||
44
common/Generators/Action/stubs/action.stub
Executable file
44
common/Generators/Action/stubs/action.stub
Executable file
@@ -0,0 +1,44 @@
|
||||
<?php
|
||||
|
||||
namespace DummyNamespace;
|
||||
|
||||
use Auth;
|
||||
use DummyFullModelClass;
|
||||
|
||||
class CrupdateDummyModelClass
|
||||
{
|
||||
/**
|
||||
* @var DummyModelClass
|
||||
*/
|
||||
private $DummyModelVariable;
|
||||
|
||||
/**
|
||||
* @param DummyModelClass $DummyModelVariable
|
||||
*/
|
||||
public function __construct(DummyModelClass $DummyModelVariable)
|
||||
{
|
||||
$this->DummyModelVariable = $DummyModelVariable;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $data
|
||||
* @param DummyModelClass $DummyModelVariable
|
||||
* @return DummyModelClass
|
||||
*/
|
||||
public function execute($data, $DummyModelVariable = null)
|
||||
{
|
||||
if ( ! $DummyModelVariable) {
|
||||
$DummyModelVariable = $this->DummyModelVariable->newInstance([
|
||||
'user_id' => Auth::id(),
|
||||
]);
|
||||
}
|
||||
|
||||
$attributes = [
|
||||
'name' => $data['name'],
|
||||
];
|
||||
|
||||
$DummyModelVariable->fill($attributes)->save();
|
||||
|
||||
return $DummyModelVariable;
|
||||
}
|
||||
}
|
||||
52
common/Generators/Controller/GenerateController.php
Executable file
52
common/Generators/Controller/GenerateController.php
Executable file
@@ -0,0 +1,52 @@
|
||||
<?php
|
||||
|
||||
namespace Common\Generators\Controller;
|
||||
|
||||
use Illuminate\Routing\Console\ControllerMakeCommand;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
class GenerateController extends ControllerMakeCommand
|
||||
{
|
||||
public function handle()
|
||||
{
|
||||
if (parent::handle() !== false) {
|
||||
// add route
|
||||
$path = base_path('routes/web.php');
|
||||
if ($this->option('model')) {
|
||||
$marker = "});";
|
||||
file_put_contents($path, str_replace(
|
||||
$marker,
|
||||
"\n{$this->getRouteStub()}\n{$marker}",
|
||||
file_get_contents($path)
|
||||
));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected function getRouteStub()
|
||||
{
|
||||
$resourceName = Str::kebab(class_basename($this->option('model')));
|
||||
$resourceComment = strtoupper(Str::title($this->option('model')));
|
||||
return str_replace(
|
||||
['dummyResourceName', 'dummyControllerName', 'dummyResourceComment'],
|
||||
[$resourceName, $this->getNameInput(), $resourceComment],
|
||||
file_get_contents(__DIR__ . '/stubs/route.resource.stub')
|
||||
);
|
||||
}
|
||||
|
||||
protected function buildClass($name)
|
||||
{
|
||||
$modelClass = $this->parseModel($this->option('model'));
|
||||
$modelName = class_basename($modelClass);
|
||||
return str_replace('DummyModelName', $modelName, parent::buildClass($name));
|
||||
}
|
||||
|
||||
protected function getStub()
|
||||
{
|
||||
if ($this->option('model')) {
|
||||
return __DIR__ . '/stubs/controller.model.stub';
|
||||
}
|
||||
|
||||
return parent::getStub();
|
||||
}
|
||||
}
|
||||
105
common/Generators/Controller/stubs/controller.model.stub
Executable file
105
common/Generators/Controller/stubs/controller.model.stub
Executable file
@@ -0,0 +1,105 @@
|
||||
<?php
|
||||
|
||||
namespace DummyNamespace;
|
||||
|
||||
use Common\Core\BaseController;
|
||||
use Common\Database\Paginator;
|
||||
use Illuminate\Http\Request;
|
||||
use DummyFullModelClass;
|
||||
use Illuminate\Http\Response;
|
||||
use App\Http\Requests\CrupdateDummyModelNameRequest;
|
||||
use App\Actions\DummyModelName\CrupdateDummyModelName;
|
||||
|
||||
class DummyClass extends BaseController
|
||||
{
|
||||
/**
|
||||
* @var DummyModelClass
|
||||
*/
|
||||
private $DummyModelVariable;
|
||||
|
||||
/**
|
||||
* @var Request
|
||||
*/
|
||||
private $request;
|
||||
|
||||
/**
|
||||
* @param DummyModelClass $DummyModelVariable
|
||||
* @param Request $request
|
||||
*/
|
||||
public function __construct(DummyModelClass $DummyModelVariable, Request $request)
|
||||
{
|
||||
$this->DummyModelVariable = $DummyModelVariable;
|
||||
$this->request = $request;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Response
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
$userId = $this->request->get('userId');
|
||||
$this->authorize('index', [DummyModelClass::class, $userId]);
|
||||
|
||||
$paginator = new Paginator($this->DummyModelVariable, $this->request->all());
|
||||
|
||||
if ($userId = $paginator->param('userId')) {
|
||||
$paginator->where('user_id', $userId);
|
||||
}
|
||||
|
||||
$pagination = $paginator->paginate();
|
||||
|
||||
return $this->success(['pagination' => $pagination]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param DummyModelClass $DummyModelVariable
|
||||
* @return Response
|
||||
*/
|
||||
public function show(DummyModelClass $DummyModelVariable)
|
||||
{
|
||||
$this->authorize('show', $DummyModelVariable);
|
||||
|
||||
return $this->success(['DummyModelVariable' => $DummyModelVariable]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param CrupdateDummyModelNameRequest $request
|
||||
* @return Response
|
||||
*/
|
||||
public function store(CrupdateDummyModelNameRequest $request)
|
||||
{
|
||||
$this->authorize('store', DummyModelClass::class);
|
||||
|
||||
$DummyModelVariable = app(CrupdateDummyModelClass::class)->execute($request->all());
|
||||
|
||||
return $this->success(['DummyModelVariable' => $DummyModelVariable]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param DummyModelClass $DummyModelVariable
|
||||
* @param CrupdateDummyModelNameRequest $request
|
||||
* @return Response
|
||||
*/
|
||||
public function update(DummyModelClass $DummyModelVariable, CrupdateDummyModelNameRequest $request)
|
||||
{
|
||||
$this->authorize('store', $DummyModelVariable);
|
||||
|
||||
$DummyModelVariable = app(CrupdateDummyModelClass::class)->execute($request->all(), $DummyModelVariable);
|
||||
|
||||
return $this->success(['DummyModelVariable' => $DummyModelVariable]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $ids
|
||||
* @return Response
|
||||
*/
|
||||
public function destroy($ids)
|
||||
{
|
||||
$DummyModelVariableIds = explode(',', $ids);
|
||||
$this->authorize('store', [DummyModelClass::class, $DummyModelVariableIds]);
|
||||
|
||||
$this->DummyModelVariable->whereIn('id', $DummyModelVariableIds)->delete();
|
||||
|
||||
return $this->success();
|
||||
}
|
||||
}
|
||||
2
common/Generators/Controller/stubs/route.resource.stub
Executable file
2
common/Generators/Controller/stubs/route.resource.stub
Executable file
@@ -0,0 +1,2 @@
|
||||
// dummyResourceComment
|
||||
Route::apiResource('dummyResourceName', 'dummyControllerName');
|
||||
54
common/Generators/Model/GenerateModel.php
Executable file
54
common/Generators/Model/GenerateModel.php
Executable file
@@ -0,0 +1,54 @@
|
||||
<?php
|
||||
|
||||
namespace Common\Generators\Model;
|
||||
|
||||
use Illuminate\Foundation\Console\ModelMakeCommand;
|
||||
|
||||
class GenerateModel extends ModelMakeCommand
|
||||
{
|
||||
public function handle()
|
||||
{
|
||||
$this->input->setOption('resource', true);
|
||||
$this->input->setOption('migration', true);
|
||||
$this->createPolicy();
|
||||
$this->createRequest();
|
||||
$this->createAction();
|
||||
|
||||
parent::handle();
|
||||
}
|
||||
|
||||
protected function createPolicy()
|
||||
{
|
||||
$modelName = $this->getNameInput();
|
||||
|
||||
$this->call('make:policy', [
|
||||
'name' => "{$modelName}Policy",
|
||||
'--model' => $modelName
|
||||
]);
|
||||
}
|
||||
|
||||
protected function getStub()
|
||||
{
|
||||
return __DIR__.'/stubs/model.stub';
|
||||
}
|
||||
|
||||
private function createRequest()
|
||||
{
|
||||
$modelName = $this->getNameInput();
|
||||
|
||||
$this->call('make:request', [
|
||||
'name' => "Crupdate{$modelName}Request",
|
||||
'--model' => $modelName
|
||||
]);
|
||||
}
|
||||
|
||||
private function createAction()
|
||||
{
|
||||
$modelName = $this->getNameInput();
|
||||
|
||||
$this->call('make:action', [
|
||||
'name' => "Crupdate{$modelName}",
|
||||
'--model' => $modelName
|
||||
]);
|
||||
}
|
||||
}
|
||||
26
common/Generators/Model/stubs/model.stub
Executable file
26
common/Generators/Model/stubs/model.stub
Executable file
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
namespace DummyNamespace;
|
||||
|
||||
use Eloquent;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
/**
|
||||
* DummyNamespace\DummyClass
|
||||
*
|
||||
* @property int $id
|
||||
* @property int $user_id
|
||||
* @property Carbon|null $created_at
|
||||
* @property Carbon|null $updated_at
|
||||
* @mixin Eloquent
|
||||
*/
|
||||
class DummyClass extends Model
|
||||
{
|
||||
protected $guarded = ['id'];
|
||||
|
||||
protected $casts = [
|
||||
'id' => 'integer',
|
||||
'user_id' => 'integer',
|
||||
];
|
||||
}
|
||||
46
common/Generators/Policy/GeneratePolicy.php
Executable file
46
common/Generators/Policy/GeneratePolicy.php
Executable file
@@ -0,0 +1,46 @@
|
||||
<?php
|
||||
|
||||
namespace Common\Generators\Policy;
|
||||
|
||||
use Illuminate\Foundation\Console\PolicyMakeCommand;
|
||||
|
||||
class GeneratePolicy extends PolicyMakeCommand
|
||||
{
|
||||
public function handle()
|
||||
{
|
||||
if (parent::handle() !== false) {
|
||||
// auto-register policy
|
||||
$path = app_path('Providers/AuthServiceProvider.php');
|
||||
$model = str_replace('/', '\\', $this->option('model'));
|
||||
$policy = $this->getNameInput();
|
||||
|
||||
// add policy to providers
|
||||
$marker = "'App\\Model' => 'App\\Policies\\ModelPolicy',";
|
||||
file_put_contents($path, str_replace(
|
||||
$marker,
|
||||
"$marker\n {$model}::class => $policy::class,",
|
||||
file_get_contents($path)
|
||||
));
|
||||
|
||||
// import policy and model
|
||||
$marker = 'use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;';
|
||||
$namespaceModel = $this->laravel->getNamespace().$model;
|
||||
$namespacePolicy = $this->qualifyClass($policy);
|
||||
|
||||
file_put_contents($path, str_replace(
|
||||
$marker,
|
||||
"use {$namespaceModel};\nuse {$namespacePolicy};\n$marker",
|
||||
file_get_contents($path)
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
protected function getStub()
|
||||
{
|
||||
if ($this->option('model')) {
|
||||
return __DIR__.'/stubs/policy.model.stub';
|
||||
}
|
||||
|
||||
return parent::getStub();
|
||||
}
|
||||
}
|
||||
43
common/Generators/Policy/stubs/policy.model.stub
Executable file
43
common/Generators/Policy/stubs/policy.model.stub
Executable file
@@ -0,0 +1,43 @@
|
||||
<?php
|
||||
|
||||
namespace DummyNamespace;
|
||||
|
||||
use Common\Auth\BaseUser;
|
||||
use NamespacedDummyModel;
|
||||
use Common\Core\Policies\BasePolicy;
|
||||
|
||||
class DummyClass extends BasePolicy
|
||||
{
|
||||
public function index(BaseUser $user, $userId = null)
|
||||
{
|
||||
return $user->hasPermission('dummyModel.view') || $user->id === (int) $userId;
|
||||
}
|
||||
|
||||
public function show(BaseUser $user, DummyModel $dummyModel)
|
||||
{
|
||||
return $user->hasPermission('dummyModel.view') || $dummyModel->user_id === $user->id;
|
||||
}
|
||||
|
||||
public function store(BaseUser $user)
|
||||
{
|
||||
return $user->hasPermission('dummyModel.create');
|
||||
}
|
||||
|
||||
public function update(BaseUser $user, DummyModel $dummyModel)
|
||||
{
|
||||
return $user->hasPermission('dummyModel.update') || $dummyModel->user_id === $user->id;
|
||||
}
|
||||
|
||||
public function destroy(BaseUser $user, $dummyModelIds)
|
||||
{
|
||||
if ($user->hasPermission('dummyModel.delete')) {
|
||||
return true;
|
||||
} else {
|
||||
$dbCount = app(DummyModel::class)
|
||||
->whereIn('id', $dummyModelIds)
|
||||
->where('user_id', $user->id)
|
||||
->count();
|
||||
return $dbCount === count($dummyModelIds);
|
||||
}
|
||||
}
|
||||
}
|
||||
42
common/Generators/Request/GenerateRequest.php
Executable file
42
common/Generators/Request/GenerateRequest.php
Executable file
@@ -0,0 +1,42 @@
|
||||
<?php
|
||||
|
||||
namespace Common\Generators\Request;
|
||||
|
||||
use Illuminate\Foundation\Console\RequestMakeCommand;
|
||||
use Str;
|
||||
use Symfony\Component\Console\Input\InputOption;
|
||||
|
||||
class GenerateRequest extends RequestMakeCommand
|
||||
{
|
||||
protected function getStub()
|
||||
{
|
||||
return __DIR__.'/stubs/request.stub';
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $name
|
||||
* @return string
|
||||
*/
|
||||
protected function buildClass($name)
|
||||
{
|
||||
$stub = parent::buildClass($name);
|
||||
|
||||
$model = Str::snake($this->option('model'));
|
||||
$table = Str::plural($model);
|
||||
|
||||
$stub = str_replace('DummyModel', $model, $stub);
|
||||
$stub = str_replace('DummyTable', $table, $stub);
|
||||
|
||||
return $stub;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
protected function getOptions()
|
||||
{
|
||||
return [
|
||||
['model', 'm', InputOption::VALUE_OPTIONAL, 'The model that the request applies to.'],
|
||||
];
|
||||
}
|
||||
}
|
||||
35
common/Generators/Request/stubs/request.stub
Executable file
35
common/Generators/Request/stubs/request.stub
Executable file
@@ -0,0 +1,35 @@
|
||||
<?php
|
||||
|
||||
namespace DummyNamespace;
|
||||
|
||||
use Auth;
|
||||
use Common\Core\BaseFormRequest;
|
||||
use Illuminate\Validation\Rule;
|
||||
|
||||
class DummyClass extends BaseFormRequest
|
||||
{
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
public function authorize()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public function rules()
|
||||
{
|
||||
$required = $this->getMethod() === 'POST' ? 'required' : '';
|
||||
$ignore = $this->getMethod() === 'PUT' ? $this->route('DummyModel')->id : '';
|
||||
$userId = $this->route('DummyModel') ? $this->route('DummyModel')->user_id : Auth::id();
|
||||
|
||||
return [
|
||||
'name' => [
|
||||
$required, 'string', 'min:3',
|
||||
Rule::unique('DummyTable')->where('user_id', $userId)->ignore($ignore)
|
||||
],
|
||||
];
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user