Посилення Laravel Nova: Автоматизація створення ресурсів за допомогою базового ресурсу та Artisan команди

pic

Laravel Nova — це потужна панель адміністратора, яка спрощує керування даними вашого застосунку. Однак, коли ви працюєте з великою кількістю моделей, створення ресурсів Nova вручну може швидко стати виснажливим. У цій статті ми розглянемо, як оптимізувати цей процес:

  1. Створення класу BaseResource, який автоматично генерує поля для кожної моделі.
  2. Розробка Artisan-команди для автоматичного створення ресурсів Nova для всіх моделей, що гарантує їх розширення від BaseResource.

Проблема: Ручне створення ресурсів

За замовчуванням ресурси Nova вимагають від вас визначати поля, методи авторизації та інші налаштування для кожної моделі. Такий підхід добре працює для малих проєктів, але стає повторюваним і схильним до помилок, коли кількість моделей збільшується.

Не було б чудово:

  • Генерувати всі поля динамічно на основі структури моделі?
  • Уникати дублювання спільної логіки, як-от методів авторизації?
  • Автоматизувати весь процес створення ресурсів?

Давайте перейдемо до рішення!

Крок 1: Створення BaseResource

BaseResource стане основою для всіх ваших ресурсів Nova. Він оброблятиме спільну логіку, таку як динамічне генерування полів на основі заповнюваних атрибутів моделі та налаштування стандартних методів авторизації.

Реалізація BaseResource

Створіть новий файл у app/Nova/BaseResource.php:

namespace App\Nova;  

use Illuminate\Http\Request;  
use Laravel\NovaNova\Resource;  

abstract class BaseResource extends Resource  
{  
 /**  
 * Динамічно генерує поля на основі заповнюваних атрибутів моделі.  
 *  
 * @return array  
 */  
 protected function fieldsForResource()  
 {  
 $fields = [];  
 foreach ($this->model()->getFillable() as $attribute) {  
 $fields[] = Text::make(ucwords(str_replace('_', ' ', $attribute)), $attribute)  
 ->sortable();  
 }  
 return $fields;  
 }  
 /**  
 * Визначає поля для ресурсу.  
 *  
 * @param Request $request  
 * @return array  
 */  
 public function fields(Request $request)  
 {  
 return $this->fieldsForResource();  
 }  
 /**  
 * Переозначає для вимкнення створення ресурсу за замовчуванням.  
 */  
 public static function authorizedToCreate(Request $request)  
 {  
 return false;  
 }  
 /**  
 * Переозначає для налаштування логіки авторизації для оновлення.  
 */  
 public function authorizedToUpdate(Request $request)  
 {  
 return auth()->user()->hasRole('SUPER_ADMIN|ADMIN');  
 }  
 /**  
 * Переозначає для вимкнення видалення за замовчуванням.  
 */  
 public function authorizedToDelete(Request $request)  
 {  
 return false;  
 }  
}

Крок 2: Автоматичне створення ресурсів Nova

Тепер, коли ми маємо багаторазово використовуваний BaseResource, давайте створимо команду Artisan для автоматичного створення ресурсів Nova для всіх моделей. Ці ресурси будуть розширювати BaseResource, наслідуючи його динамічне генерування полів та спільну логіку.

Створення Artisan-команди

Запустіть наступну команду для створення нової команди Artisan:

php artisan make:command GenerateNovaResources

Оновіть згенерований файл у `app/Console/CommandsCommands;
use Illuminate\Console\Command;
use Illuminate\Filesystem\Filesystem;
use Illuminate\Support\Str;
class GenerateNovaResources extends Command
{
protected $signature = 'nova:generate-resources';
protected $description = 'Генерувати ресурси Nova для всіх моделей';
public function handle()
{
$modelsPath = apppath('Models');
$filesystem = new Filesystem();
$models = $filesystem->files($modelsPath);
foreach ($models as $model) {
$modelName = Str::replaceLast('.php', '', $model->getFilename());
$resourceName = $modelName .
'Resource';
$resourcePath = app
path("Nova/{$resourceName}.php");
if (!$filesystem->exists($resourcePath)) {
$filesystem->put($resourcePath, $this->getResourceStub($modelName));
$this->info("Generated Nova resource for {$modelName}");
} else {
$this->warn("Resource for {$modelName} already exists.");
}
}
$this->info('Nova resource generation complete.');
}
protected function getResourceStub($modelName)
{
return <<

Перекладено з: Supercharging Laravel Nova: Automating Resource Creation with a Base Resource and Artisan Command

Leave a Reply

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