Скажіть “Ні” хардкодингу: ефективне управління колонками моделей у Laravel

pic

Фото: 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
  1. Скопіюйте та вставте скрипт, наведений вище, у файл вашої новоствореної команди.

  2. Опублікуйте шаблон (stub) та створіть новий шаблон з назвою model.column.stub:

php artisan stub:publish
  1. Скопіюйте наступний код у файл 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

Leave a Reply

Your email address will not be published. Required fields are marked *