Версія v1.6.5 Попередні версії: документація на GitHub
Фільтри
На цій сторінці
Фільтри обмежують список записів Entity. Їхній стан зберігається в рядку запиту:
?filters[<key>]=<value>. Фільтри діють на index, на панелі HasMany/BelongsToMany та на дії
з resources: 'all' (Дії).
Фільтри повертає метод Entity::filters(Request $request): array:
use Maxcxam\Larsadmin\Filters\BooleanFilter;
use Maxcxam\Larsadmin\Filters\DateRangeFilter;
use Maxcxam\Larsadmin\Filters\SelectFilter;
public function filters(Request $request): array
{
return [
SelectFilter::make('Статус', 'status')->withOptions([
'draft' => 'Чернетка',
'live' => 'Опубліковано',
]),
BooleanFilter::make('Опубліковано', 'published'),
DateRangeFilter::make('Дата публікації', 'published_at', 'published-range'),
];
}
Вбудовані фільтри
Усі три створюються як Filter::make(?string $label, ?string $column, ?string $key):
$labelпідпис в інтерфейсі (перекладається через__());$columnколонка моделі (кваліфікується таблицею моделі);$keyключ у рядку запиту. За замовчуванням це$columnз.на_.
| Фільтр | Значення в запиті | Додатково |
|---|---|---|
SelectFilter |
один із ключів options |
withOptions(array|Closure), defaultTo(string|int|null) |
BooleanFilter |
1 або 0 (Так/Ні) |
defaultTo(?bool) |
DateRangeFilter |
filters[key][from]=Y-m-d&filters[key][to]=Y-m-d |
напіввідкритий інтервал [from, to + 1 день): >= from і < to + 1 день; кожну межу можна пропустити |
withOptions() приймає масив значення => підпис або замикання fn (Request $request): array:
SelectFilter::make('Перегляди', 'views', 'v')->withOptions(fn () => [10 => 'Десять', 20 => 'Двадцять']);
Значення за замовчуванням
Коли ключа фільтра немає в рядку запиту, застосовується його defaultTo(). Явне порожнє значення
(filters[status]=) скидає фільтр, і значення за замовчуванням тоді не застосовується. Саме так
інтерфейс очищає фільтр, що має значення за замовчуванням.
SelectFilter::make('Статус', 'status')->withOptions([...])->defaultTo('live');
Невидимі фільтри
canSee(Closure) ховає фільтр; його значення та значення за замовчуванням не застосовуються:
SelectFilter::make('Внутрішній', 'status', 'internal')
->withOptions(['review' => 'На перевірці'])
->canSee(fn (Request $request) => $request->user()->can('moderate'));
Фільтри це UX, а не межа безпеки
Фільтри зручні для користувача, але не обмежують доступ до даних. Фільтр, прихований через
canSee, перестає діяти разом зі своїм значенням за замовчуванням, а користувач може будь-коли
прибрати чи змінити значення в рядку запиту. Обмеження рядків (власні записи, тенант тощо) завжди
задавайте в indexQuery / detailQuery (Авторизація).
Безпека значень
- Невідомі ключі, недозволені фільтри й некоректні значення мовчки ігноруються (виняток не
кидається). Для select значення має бути серед ключів
optionsі не довше 255 символів. - Кожен фільтр застосовується в окремій групі
where (...), тому не може вийти за межіindexQueryEntity, навіть якщо йогоapply()використовуєorWhere.
Власний фільтр
php artisan larsadmin:filter StatusFilter
Опція --force перезаписує існуючий клас.
Клас створюється як App\Larsadmin\Filters\StatusFilter. Генератор записує заглушку з __('{{ class }}')
у name() і порожнім списком опцій; після редагування клас може виглядати так:
namespace App\Larsadmin\Filters;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Http\Request;
use Maxcxam\Larsadmin\Filters\Filter;
class StatusFilter extends Filter
{
public string $component = 'select-filter';
public function name(): string
{
return __('Status');
}
public function apply(Request $request, Builder $query, mixed $value): Builder
{
return $query->where('status', $value);
}
public function options(Request $request): array
{
return [
'draft' => 'Draft',
'live' => 'Live',
];
}
}
Підключення: StatusFilter::make().
Методи базового класу Maxcxam\Larsadmin\Filters\Filter:
| Метод | Призначення |
|---|---|
apply($request, $query, $value): Builder |
обов'язковий; отримує вже нормалізоване значення |
name() |
підпис; за замовчуванням з назви класу |
key() |
ключ у запиті; за замовчуванням kebab-case назви класу (StatusFilter дає status-filter) |
options($request) |
варіанти значення => підпис |
default() |
значення, коли ключа немає в запиті |
normalize($request, $raw) |
перетворює сире значення; null означає «фільтр не активний» |
canSee(Closure) |
умова видимості |
$component |
компонент фронтенду: select-filter, boolean-filter, date-range-filter або ключ розширення vendor/name |
Заглушка генератора створює select-фільтр. Для іншої логіки значення перевизначте normalize() і apply().
Власний компонент фронтенду для нового типу фільтра додає розширення (див.
Розширення: фільтри), а власні props компоненту дає стабільний хук
serialize(Request $request, mixed $value) (результат parent::serialize() з усіма базовими ключами плюс
ваші); інтерфейс вбудованих фільтрів можна
перевизначити.
Далі: Дії.