Фото: Mohammad Rahmani на Unsplash
Пройшло кілька років з часу, коли я востаннє працював із Laravel, і зараз я знову занурююся в нього. Переглядаючи навчальні матеріали, ви помітили нескінченне повторення імен полів у коді? Контролери, RequestForms, моделі, репозиторії — де завгодно. Це як дежавю для ваших пальців.
А коли ви працюєте в команді розробників, це може призвести до:
- Помилок у написанні імен колонок/полів 😅
- Відсутності прозорості — немає централізованого місця для підтримки імен колонок/полів, а відсутність IntelliSense лише ускладнює процес.
- Проблем із підтримкою — впровадження змін стає складнішим, ніж повинно бути.
Після роботи з цим я подумав: чому б не зробити життя простішим для мене і моєї команди? Тому я створив простий скрипт для автоматичної генерації колонок моделі.
Скрипт
argument('table');
$className = $this->getClassName($this->toSingularStudly($table));
$filePath = $this->getFilePath($className);
$columns = $this->getTableColumns($table);
if ($columns == null) {
return Command::FAILURE;
}
$stubPath = self::STUB_MODEL_COLUMN;
if ($this->isStubPathExists($stubPath)) {
$this->generateModelColumns($filePath, $className, $columns, $stubPath);
} else {
return Command::FAILURE;
}
return Command::SUCCESS;
}
private function getClassName($table): string
{
return $this->toSingularStudly($table) . self::COLUMN;
}
private function getFilePath(string $className): string
{
return app_path(self::APP_SUPPORT_MODEL_COLUMNS . "/{$className}.php");
}
private function isStubPathExists(string $stubPath) : bool {
if (!file_exists($stubPath)) {
$this->error("Stub file not found at: {$stubPath}");
return false;
}
return true;
}
private function generateModelColumns(string $filePath, string $className, array $columns, string $stubPath)
{
$stubContent = $this->generateStubContent($stubPath, $className, $columns);
$directory = dirname($filePath);
if (!is_dir($directory)) {
mkdir($directory, self::PERMISSION_0775, true);
}
file_put_contents($filePath, $stubContent);
$this->info("Class '{$className}' generated/updated successfully at '{$filePath}'.");
}
private function generateStubContent(string $stubPath, string $className, array $columns): string
{
$constants = array_map(function ($column) {
$constantName = strtoupper(Str::snake($column));
return " public const {$constantName} = '{$column}';";
}, $columns);
$constantsCode = implode("\n", $constants);
$stubContent = file_get_contents($stubPath);
return str_replace(
['{{ className }}', '{{ constants }}'],
[$className, $constantsCode],
$stubContent
);
}
private function getTableColumns(string $table): ?array {
if (!Schema::hasTable($table)) {
$this->error(sprintf($this->errTableDoesNotExists, $table));
return null;
}
return Schema::getColumnListing($table);
}
private function toSingularStudly(string $string): string
{
return Str::studly(Str::singular($string));
}
}
Налаштування
1.
Створіть команду за допомогою:
php artisan make:command MakeModelColumnsCommand
-
Скопіюйте та вставте скрипт, наведений вище, у файл вашої новоствореної команди.
-
Опублікуйте шаблон (stub) та створіть новий шаблон з назвою
model.column.stub
:
php artisan stub:publish
- Скопіюйте наступний код у файл
model.column.stub
:
'required|string|max:200',
UserColumn::PHONE_NO => 'required|string|max:20',
UserColumn::EMAIL => 'required|string|email|max:255|unique:users,email',
];
}
}
У Resource
$this->user_id,
UserColumn::PHONE_NO => $this->phone_no,
UserColumn::EMAIL => $this->email
];
}
}
У Моделі
Перекладено з: Say Goodbye to Hard-Coding: Manage Laravel Model Columns Efficiently