vasichmen/laravel-handbooks

Package Handbooks

Installs: 1

Dependents: 0

Suggesters: 0

Security: 0

Stars: 0

Watchers: 0

Forks: 0

Open Issues: 0

pkg:composer/vasichmen/laravel-handbooks

v1.0.0 2025-11-07 19:34 UTC

This package is auto-updated.

Last update: 2025-11-07 19:40:51 UTC


README

  • установить пакет
 composer require vasichmen/laravel-handbooks
  • подключить \Laravel\Handbooks\LaravelHandbooksServiceProvider::class в config\app.php
  • опубликовать конфиг
php artisan vendor:publish --provider="Laravel\Handbooks\LaravelHandbooksServiceProvider"
  • заполнить заготовку конфига handbooks.php.

  • Пример конфига:

[
    'route_prefix' => env('HANDBOOKS_ROUTE_PREFIX', ''),
    'global_middleware' => ['user-auth', 'local-auth'],
    'defaults' => [
        'middleware' => [
            'create' => ['can-create'], //мидлвары для создания по умолчанию, например can:manage_handbooks
            'update' => ['can-update'], //мидлвары для обновления по умолчанию, например can:manage_handbooks
            'delete' => ['can-delete'], //мидлвары для удаления по умолчанию, например can:manage_handbooks
            'view' => ['can-view'], //мидлвары для просмотра по умолчанию, например can:manage_handbooks
        ],
    ],
    'dynamic' => [
        'model_base_namespace' => '\\App\\Models\\',
        'repository_base_namespace' => '\\App\\Repositories\\',
        'default_select' => ['id', 'name'],
        'default_with' => [],
        'default_searchable_fields' => ['name'],
        'custom' => [
            //модели, которые находятся в других пространствах имен или нужны кастомные настройки
//            'model-code' => [
//                'model' => ModelClass::class,
//                'resource' => ModelResourceClass::class,
//                'repository' => ModelRepositoryClass::class,
//                'select' => ['id','name'],//массив полей, которые надо доставать для short-лист. По умолчанию id,name
//                'with' => [], //массив отношений, которые надо доставать для short-лист. По умолчанию пустой
//                'searchable_fields' => [], //массив полей, по которым возможен поиск
//            ],
        ]
    ],
    'crud' => [
        'functional-area' => [
            'repository' => \App\Repositories\FunctionalAreaRepository::class,
            'resource' => \App\Http\Resources\FunctionalAreaResource::class,
            'create_request' => \App\Http\Requests\Handbook\Create\CreateFunctionalAreaRequest::class,
            'update_request' => \App\Http\Requests\Handbook\Update\UpdateFunctionalAreaRequest::class,
            'create_dto' => \App\DTO\Request\Handbook\FunctionalAreaHandbookDTO::class,
            'update_dto' => \App\DTO\Request\Handbook\FunctionalAreaHandbookDTO::class,
            'searchable_fields'=>['name'],
            'with'=>['detail'=>['system', 'architectManagers'],'list'=>['system']]
        ]
    ],
    'enums'=>[
        ComponentTypeEnum::class,
        MicroserviceCodeEnum::class,
    ]   
]
  • Пример реквеста создания:
class CreateFunctionalAreaRequest extends AbstractRequest
{
    protected ?string $dtoClassName = FunctionalAreaHandbookDTO::class;

    public function rules()
    {
        return [
            'name' => ['required', 'string', 'max:255', new Unique(FunctionalArea::class, 'name')],
            'architect_managers' => ['array', 'sometimes'],
            'architect_managers.*' => ['uuid', new Exists(User::class, 'id')],
            'corp_architects' => ['array', 'sometimes'],
            'corp_architects.*' => ['uuid', new Exists(User::class, 'id')],
        ];
    }
}
  • Пример реквеста обновления:
class UpdateFunctionalAreaRequest extends CreateFunctionalAreaRequest
{
    protected ?string $dtoClassName = FunctionalAreaHandbookDTO::class;

    public function rules()
    {
        return [
            ...parent::rules(),
            'name' => [
                'sometimes',
                'string',
                'max:255',
                (new Unique(FunctionalArea::class, 'name'))->ignore($this->getRouteParameter('handbookId'))
            ],
        ];
    }
}
  • Если в проекте используются кастомные связи BelongsToMany, то такие связи могут реализовать интерфейс ProvidesUniqueRelatedKeys.