Laravel Nova — це потужна панель адміністратора, яка спрощує керування даними вашого застосунку. Однак, коли ви працюєте з великою кількістю моделей, створення ресурсів Nova вручну може швидко стати виснажливим. У цій статті ми розглянемо, як оптимізувати цей процес:
- Створення класу BaseResource, який автоматично генерує поля для кожної моделі.
- Розробка 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 = apppath("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