Download the PHP package vasichmen/laravel-foundation without Composer
On this page you can find all versions of the php package vasichmen/laravel-foundation. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.
Download vasichmen/laravel-foundation
More information about vasichmen/laravel-foundation
Files in vasichmen/laravel-foundation
Package laravel-foundation
Short Description Laravel Package Foundation
License MIT
Informations about the package laravel-foundation
- Описание
- Установка
- Примеры
- Сервис-провайдер
- Базовая авторизация
- Полезные трейты
- Первод Enum
- Значения Enum
- Обновление полей enum в миграциях
- Партиционирование таблиц
- Логирование
- Реквест и DTO
- Модель
- Репозиторий
- Ресурс
- Презентер
Описание
Пакет с базовыми классами репозиториев, сервисов, реквестов для приложений на laravel. Базовый функционал включает в себя наиболее часто требующиеся методы и классы в любом приложении.
Установка
- Установить пакет
Примеры использования
AppServiceProvider
Базовая авторизация
Создаем новый мидлвар, наследуясь от AbstractBasicAuthMiddleware.php
Регистрируем в Http\Kernel.php в поле $routeMiddleware:
После чего надо добавить в конфиг auth.php секцию с настройками логинов и паролей:
Используем как обычный мидлвар на любых роутах или группах:
Полезные трейты
EnumTranslatable
Трейт, который можно подключить в любой enum, он добавляет метод trans() в элемент перечисления.
Чтобы заработал перевод надо добавить файл /lang/<lang>/enums.php
с содержимым примерно такого вида:
Получить перевод можно так:
Параметром $args
можно передать массив аргументов для функции laravel trans().
Этот метод используется в методе AbstractResource->getEnum()
EnumValues
Добавляет к перечислениям статический метод values(), который возвращает массив всех значений этого перечисления
EnumDBCheckAlterable
Добавляет в миграцию метод alterEnum() для изменения поля с ограничением значений.
PartitionedByHash
Добавляет в миграцию метод makePartitionedTable
, создающий таблицу, разделенную на партиции (только для Postgres)
Logger
Добавляет метод formatLogMessage, который работает по принципу sprintf, но может красиво форматировать эксепшены, массивы, коллекции итд.
Реквест и DTO
Реквест определяет правила валидации и (при необходимости) сообщения об ошибках, наследуется от AbstractRequest. DTO определяет структуру данных для прозрачности передачи данных внутри приложения, наследуется от GetListRequestDTO, в нем определены основные поля, используемые при получении списков с фильтрацией и пагинацией.
Для подключения валидации надо добавить \Laravel\Foundation\ServiceProviders\RequestServiceProvider::class
в конфиг app.php
Чтоб подключить DTO к реквесту надо в реквесте переопределить поле $dtoClassName - имя класса DTO.
При вызове метода $request->validated()
проверяется существование класса DTO, его принадлежность к базовому классу и в
конструктор передается массив параметров из реквеста.
Внутри DTO в конструкторе ключи массива из реквеста приводятся в camelCase и данные из них записываются в
соответствующие поля класса DTO.
Таким образом для создания DTO достаточно только определить список полей с такими же именами, как в реквесте, но в
camelCase.
Для обратного преобразования в массив в DTO есть метод toArray().
Пример реквеста с сортировкой и постраничкой
Пример DTO
Такой реквест при вызове у него метода validated() вернет объект DTO. Чтобы возвращался массив, надо убрать указание DTO
из реквеста. В поле sort
в DTO вернется массив ключ=>значение, где ключ - название столбца, значение - направление сортировки
Если в классе DTO поле не будет найдено, то сгенерируется исключение DTOPropertyNotExists. Такое поведение задано по умолчанию для самопроверки, его можно изменить, переопределив метод parseData(), передав вторым параметром false, например вот так:
Модель
Использование кэширования при работе с моделями
Подключить провайдер \Laravel\Foundation\ServiceProviders\CacheServiceProvider::class
в конфиг app.php
Простое кэширование с автоматическим сбросом при вызове событий eloquent: updated,created,deleted:
Установка кастомных тегов кэша. Такой кэш автоматически сбрасываться не будет, для сброса надо переопределять метод invalidateCustomCache в модели
Для корректного хранения кэша в одной БД redis от нескольких микросервисов надо задать переменную SERVICE_NAME в .env
Методы getCacheTag, getCacheKey подключаются из трейта CacheKeysTrait
Репозиторий
Все репозитории наследуются от AbstractRepository. Для каждой модели создается репозиторий и регистрируется через провайдер.
Для создания select запросов используется RepositoryBuilder. В нем определены основные методы фильтрации, получения связей и выборки результатов.
Можно вызывать из RepositoryBuilder напрямую методы Builder, они проксируются на внутренний объект построителя запросов.
Для остальных операций есть статические методы в AbstractRepository
: create, update, updateOrCreate, delete, getModel.
Примеры:
Ресурс
Ресурсы делаются под каждую возвращаемую сущность (обычно это модели). Все ресурсы наследуются от AbstractResource. По сути ресурсы повторяют собой стандартные laravel JsonResource, но дополняются некоторыми методами.
Пример ресурса:
Метод $this->getEnum
рендерит enum в структуру вида {code:<enum_code>,name:<название enum>}
. Для получения названия
вызывается метод trans
трейта EnumTranslatable.
Если enum не расширен этим трейтом, то будет ошибка NeedTranslatableEnumException
.
Метод $this->getRelation
добавляет в выдачу связь eloquent модели. Первым параметром передается название связи,
вторым - класс ресурса для элементов этой связи.
Если связь не загружена, то ключ добавлен не будет. Если связь загружена, то в ответ добавится ключ с названием связи.
Если надо вывести коллекцию элементов через ресурс, то есть стандартный статический метод collection:
Презентер
Обычно не требуется создавать кастомные презенторы и всегда пользуемся DataResultPresenter для вывода простых данных или расширяем этот класс.
Презентер с пагинацией
В качестве основного презентера с пагинацией выступает PaginatedDataPresenter
Пример использования без агрегаций:
Первым параметром передается объект LengthAwarePaginator, полученный из метода getList репозитория. Если коллекция получена другим способом, то можно установить в пагинатор нужную коллекцию через метод setCollection.
Вторым параметром передается коллекция или массив агрегаций (то, что рендерится в ключе filters). Обычно агрегации это возможные значения фильтров при установленных текущих фильтрах. Стандартная реализация заточена под ответ от elasticsearch, но можно переопределить метод aggregationToArray и задать любую другую логику.
Третьим параметром передается класс ресурса, который надо применить к элементам коллекции. Если надо рендерить элемент массива не через ресурс, а каким-то другим способом, то можно передать третьим параметром null и переопределить метод bodyToArray, задать в нем свою логику обработки элемента коллекции.
All versions of laravel-foundation with dependencies
ext-json Version *
laravel/framework Version ^9.32|^10.0|^11.0
graylog2/gelf-php Version ^2.0
monolog/monolog Version ^3.0|^2.0
guzzlehttp/guzzle Version >=7.0