Skip to content

Commit 2e34a50

Browse files
committed
Create Interface Repositories Using Stubs (PHP 7.4)
1 parent 4e1f88f commit 2e34a50

9 files changed

+78
-25
lines changed

src/Commands/MakeInterfaceRepository.php

Lines changed: 52 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,20 @@ class MakeInterfaceRepository extends Command
2727

2828
use CustomMySqlQueries;
2929

30+
private function writeGetOneFunction(string $getOneStub, string $columnName, string $attributeType): string
31+
{
32+
return str_replace(['{{ FunctionName }}', '{{ ColumnName }}', '{{ AttributeType }}', '{{ AttributeName }}'],
33+
[ucfirst(camel_case($columnName)), $columnName, $attributeType, camel_case($columnName)],
34+
$getOneStub);
35+
}
36+
37+
private function writeGetAllFunction(string $getOneStub, string $columnName, string $attributeType): string
38+
{
39+
return str_replace(['{{ FunctionNamePlural }}', '{{ AttributeType }}', '{{ AttributeNamePlural }}'],
40+
[ucfirst(str_plural(camel_case($columnName))), $attributeType, str_plural(camel_case($columnName))],
41+
$getOneStub);
42+
}
43+
3044
/**
3145
* Execute the console command.
3246
*
@@ -39,8 +53,11 @@ public function handle(): int
3953
$entityName = str_singular(ucfirst(camel_case($tableName)));
4054
$entityVariableName = camel_case($entityName);
4155
$interfaceName = "I$entityName" . "Repository";
42-
$interfaceNamespace = config('repository.path.namespace.repositories');
56+
$entityNamespace = config('repository.path.namespace.entities');
57+
$repositoryNamespace = config('repository.path.namespace.repositories');
4358
$relativeInterfacePath = config('repository.path.relative.repositories') . "\\$entityName";
59+
$interfaceRepositoryStubsPath = config('repository.path.stub.repositories.interface');
60+
$filenameWithPath = $relativeInterfacePath.'\\'.$interfaceName.'.php';
4461

4562
if ($this->option('delete')) {
4663
unlink("$relativeInterfacePath/$interfaceName.php");
@@ -69,38 +86,53 @@ public function handle(): int
6986
$foreignKeys = $this->extractForeignKeys($tableName);
7087
}
7188

72-
// Initialize Interface
73-
$interfaceContent = "<?php\n\nnamespace $interfaceNamespace\\$entityName;\n\n";
74-
$interfaceContent .= "use App\Models\Entities\\$entityName;\n";
75-
$interfaceContent .= "use Illuminate\Support\Collection;\n\n";
76-
$interfaceContent .= "interface $interfaceName\n{";
89+
$baseContent = file_get_contents($interfaceRepositoryStubsPath.'class.stub');
90+
$getOneStub = file_get_contents($interfaceRepositoryStubsPath.'getOneBy.stub');
91+
$getAllStub = file_get_contents($interfaceRepositoryStubsPath.'getAllBy.stub');
92+
$createFunctionStub = file_get_contents($interfaceRepositoryStubsPath.'create.stub');
93+
$updateFunctionStub = file_get_contents($interfaceRepositoryStubsPath.'update.stub');
94+
$deleteAndUndeleteStub = file_get_contents($interfaceRepositoryStubsPath.'deleteAndUndelete.stub');
7795

78-
// Declare functions
79-
$interfaceContent .= "\n\tpublic function getOneById(int \$id): ?$entityName;\n";
80-
$interfaceContent .= "\n\tpublic function getAllByIds(array \$ids): Collection;\n";
96+
$baseContent = substr_replace($baseContent,
97+
$this->writeGetOneFunction($getOneStub, 'id', 'int'),
98+
-1, 0);
99+
$baseContent = substr_replace($baseContent,
100+
$this->writeGetAllFunction($getAllStub, 'id', 'int'),
101+
-1, 0);
81102

82103
if ($detectForeignKeys) {
83104
foreach ($foreignKeys as $_foreignKey) {
84-
$foreignKeyInCamelCase = camel_case($_foreignKey->COLUMN_NAME);
85-
$interfaceContent .= "\n\tpublic function getOneBy" . ucfirst($foreignKeyInCamelCase) . "(int \$" . $foreignKeyInCamelCase . "): ?$entityName;\n";
86-
$interfaceContent .= "\n\tpublic function getAllBy" . ucfirst(str_plural($foreignKeyInCamelCase)) . "(array \$" . str_plural($foreignKeyInCamelCase) . "): Collection;\n";
105+
$baseContent = substr_replace($baseContent,
106+
$this->writeGetOneFunction($getOneStub, $_foreignKey->COLUMN_NAME, $entityName),
107+
-1, 0);
108+
$baseContent = substr_replace($baseContent,
109+
$this->writeGetAllFunction($getAllStub, $_foreignKey->COLUMN_NAME, $entityName),
110+
-1, 0);
87111
}
88112
}
89113

90114
$allColumns = $columns->pluck('COLUMN_NAME')->toArray();
91115

92-
$interfaceContent .= "\n\tpublic function create($entityName \$" . $entityVariableName . "): $entityName;\n";
93-
$interfaceContent .= "\n\tpublic function update($entityName \$" . $entityVariableName . "): int;\n";
94-
if (in_array('deleted_at', $allColumns)) {
95-
$interfaceContent .= "\n\tpublic function delete($entityName \$" . $entityVariableName . "): int;\n";
96-
$interfaceContent .= "\n\tpublic function undelete($entityName \$" . $entityVariableName . "): int;\n";
116+
if (in_array('created_at', $allColumns, true)) {
117+
$baseContent = substr_replace($baseContent, $createFunctionStub, -1, 0);
97118
}
98-
$interfaceContent .= "}";
99119

100-
file_put_contents("$relativeInterfacePath/$interfaceName.php", $interfaceContent);
120+
if (in_array('updated_at', $allColumns, true)) {
121+
$baseContent = substr_replace($baseContent, $updateFunctionStub, -1, 0);
122+
}
123+
124+
if (in_array('deleted_at', $allColumns, true)) {
125+
$baseContent = substr_replace($baseContent, $deleteAndUndeleteStub, -1, 0);
126+
}
127+
128+
$baseContent = str_replace(['{{ EntityName }}', '{{ EntityNamespace }}', '{{ EntityVariableName }}', '{{ InterfaceRepositoryName }}', '{{ RepositoryNamespace }}'],
129+
[$entityName, $entityNamespace, $entityVariableName, $interfaceName, $repositoryNamespace],
130+
$baseContent);
131+
132+
file_put_contents($filenameWithPath, $baseContent);
101133

102134
if ($this->option('add-to-git')) {
103-
shell_exec("git add $relativeInterfacePath/$interfaceName.php");
135+
shell_exec("git add $filenameWithPath");
104136
}
105137

106138
$this->info("Interface \"$interfaceName\" has been created.");

src/Commands/MakeMySqlRepository.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ public function handle(): int
6464
$mysqlRepositoryName = 'MySql'.$entityName.'Repository';
6565
$entityNamespace = config('repository.path.namespace.entities');
6666
$factoryNamespace = config('repository.path.namespace.factories');
67-
$mysqlRepositoryNamespace = config('repository.path.namespace.repositories');
67+
$repositoryNamespace = config('repository.path.namespace.repositories');
6868
$relativeMysqlRepositoryPath = config('repository.path.relative.repositories') . "\\$entityName";
6969
$mysqlRepositoryStubsPath = config('repository.path.stub.repositories.mysql');
7070
$filenameWithPath = $relativeMysqlRepositoryPath.'\\'.$mysqlRepositoryName.'.php';
@@ -158,8 +158,8 @@ public function handle(): int
158158
$baseContent = substr_replace($baseContent,$deleteAndUndeleteStub, -1, 0);
159159
}
160160

161-
$baseContent = str_replace(['{{ EntityName }}', '{{ EntityNamespace }}', '{{ FactoryName }}', '{{ FactoryNamespace }}', '{{ EntityVariableName }}', '{{ MySqlRepositoryName }}', '{{ MySqlRepositoryNamespace }}', '{{ RepositoryInterfaceName }}', '{{ TableName }}', '{{ HasSoftDelete }}'],
162-
[$entityName, $entityNamespace, $factoryName, $factoryNamespace, $entityVariableName, $mysqlRepositoryName, $mysqlRepositoryNamespace, $interfaceName, $tableName, $hasSoftDelete ? 'true' : 'false'],
161+
$baseContent = str_replace(['{{ EntityName }}', '{{ EntityNamespace }}', '{{ FactoryName }}', '{{ FactoryNamespace }}', '{{ EntityVariableName }}', '{{ MySqlRepositoryName }}', '{{ RepositoryNamespace }}', '{{ RepositoryInterfaceName }}', '{{ TableName }}', '{{ HasSoftDelete }}'],
162+
[$entityName, $entityNamespace, $factoryName, $factoryNamespace, $entityVariableName, $mysqlRepositoryName, $repositoryNamespace, $interfaceName, $tableName, $hasSoftDelete ? 'true' : 'false'],
163163
$baseContent);
164164

165165
file_put_contents($filenameWithPath, $baseContent);
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?php
2+
3+
namespace {{ RepositoryNamespace }}\{{ EntityName }};
4+
5+
use {{ EntityNamespace }}\{{ EntityName }};
6+
use Illuminate\Support\Collection;
7+
8+
interface {{ InterfaceRepositoryName }}
9+
{}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
2+
public function create({{ EntityName }} ${{ EntityVariableName }}): {{ EntityName }};
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
2+
public function delete({{ EntityName }} ${{ EntityVariableName }}): int;
3+
4+
public function undelete({{ EntityName }} ${{ EntityVariableName }}): int;
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
2+
public function getAllBy{{ FunctionNamePlural }}(array ${{ AttributeNamePlural }}): Collection;
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
2+
public function getOneBy{{ FunctionName }}(int ${{ AttributeName }}): ?{{ EntityName }};
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
2+
public function update({{ EntityName }} ${{ EntityVariableName }}): int;

src/stubs/PHP7.4/repository.mysql.class.stub

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
<?php
22

3-
namespace {{ MySqlRepositoryNamespace }};
3+
namespace {{ RepositoryNamespace }}\{{ EntityName }};
44

55
use {{ EntityNamespace }}\{{ EntityName }};
66
use {{ FactoryNamespace }}\{{ FactoryName }};
7-
use {{ MySqlRepositoryNamespace }}\MySqlRepository;
7+
use {{ RepositoryNamespace }}\MySqlRepository;
88
use Illuminate\Support\Collection;
99

1010
class {{ MySqlRepositoryName }} extends MySqlRepository implements {{ RepositoryInterfaceName }}

0 commit comments

Comments
 (0)