anik / laravel-backpack-extension
Laravel backpack/crud 的基于类的命令式方法
Requires
- php: ^8.0
- backpack/crud: ^5.0
Requires (Dev)
- orchestra/testbench: ^6.0|^7.5
README
anik/laravel-backpack-extension

在 backpack/crud 的表格视图中的列表操作,如果列存在于数据库表中,默认情况下是可搜索和可排序的,除非有其他指示。此外,要向操作中添加一个 列 或 字段,需要传递一个数组。在 PHP 中,数组键是区分大小写的,这使添加字段或列变得繁琐。此软件包允许通过基于类的命令式方法传递数组。因此,无需再进行繁琐的重复键入游戏来匹配确切的数组键。有时 忘记 了? 🤷
文档
安装
要安装此软件包,请运行
composer require anik/laravel-backpack-extension
用法
扩展控制器
在控制器中,使用 \Anik\LaravelBackpack\Extension\Controllers\CrudController 而不是 \Backpack\CRUD\app\Http\Controllers\CrudController。
添加列
创建一个 列
new \Anik\LaravelBackpack\Extension\Columns\Column(string $name, [?string $label = null])\Anik\LaravelBackpack\Extension\Columns\Column::create(string $name, [?string $label = null])\Anik\LaravelBackpack\Extension\Columns\Column::ID([?string $label = null], [?string $name = null])- 创建一个 ID 类型列
从控制器中添加列
- 对于单个列,使用
$this->registerColumn($column) - 对于多个列,使用
$this->registerColumns($columns)
默认情况下,所有 Column 实例都是 不可排序 和 不可搜索 的。
示例
use Anik\LaravelBackpack\Extension\Columns\Column; use Anik\LaravelBackpack\Extension\Controllers\CrudController; class AccountCrudController extends CrudController { public function setupListOperation () { $columns = [ Column::ID()->orderable(), // Only this column will be orderable Column::create('email')->searchable(), // Makes this field searchable Column::create('name')->searchable( fn ($q, $column, $term) => strlen($term = trim($term)) >= 3 ? $q->where('name', 'LIKE', sprintf('%%%s%%', $term)) : null) ), // Also makes this field searchable with custom logic ]; $this->registerColumns($columns); $this->registerColumn((new Column('is_verified', 'Verified'))->setType('boolean')); } }
可用方法
orderable()- 使列可排序setOrderable(bool $orderable)searchable()- 使列可搜索setSearchLogic(bool|Closure $logic)- 使用逻辑或不可搜索使列可搜索setKey(string $key)setType(string $type)- 设置列类型setEntity(bool|string $entity)setAttribute(string $attribute)setModel(string $model)setPriority(int $priority)shouldNotEscape()- 在视图中不转义值{!! $value !!}setEscaped(bool $escape)setValue(mixed $value)setLimit(int $limit)setDefault(mixed $default)setPrefix(mixed $prefix)setSuffix(mixed $suffix)setWrapper(mixed $wrapper, bool $mergeRecursive = false)setOptions(mixed $options, bool $mergeRecursive = false)isExportOnlyField()isNotExportOnlyField()shouldBeVisibleInTable()shouldNotBeVisibleInTable()shouldBeVisibleInModal()shouldNotBeVisibleInModal()isTableColumn()isNotTableColumn()setTableColumn(bool $tableColumn)related(Relation $relation, bool $mergeRecursive = false)- 检查 关系 部分
注意
列类使用 \Anik\LaravelBackpack\Extension\Extensions\Attributable 特性。检查 可属性 部分。
添加字段
实例化一个 字段
new \Anik\LaravelBackpack\Extension\Fields\Field(string $name, [?string $label = null])\Anik\LaravelBackpack\Extension\Fields\Field::create(string $name, [?string $label = null])
或者创建一个 可选字段
new \Anik\LaravelBackpack\Extension\Fields\OptionalField(string $name, [?string $label = null])\Anik\LaravelBackpack\Extension\Fields\OptionalField::create(string $name, [?string $label = null])
从控制器添加字段
- 对于单个字段,
$this->registerField($field) - 对于多个字段,
$this->registerFields($fields)
默认情况下,所有 字段 实例都是 必填的。
示例
use Anik\LaravelBackpack\Extension\Controllers\CrudController; use Anik\LaravelBackpack\Extension\Fields\Field; class AccountCrudController extends CrudController { public function setupCreateOperation () { $fields = [ Field::create('email')->setType('email'), Field::create('is_admin')->checkbox(), ]; $this->registerFields($fields); $this->registerField((new Field('csrf_token'))->hidden()); } }
可用方法
required()- 使字段必填optional()- 使字段可选setType(string $type)- 设置字段类型related(Relation $relation, bool $mergeRecursive = false)- 检查 关系 部分setRelationType(string $type)setEntity(bool|string $entity)setAttribute(mixed $attribute)setModel(string $model)setBaseModel(string $baseModel)showAsterisk()setShowAsterisk(mixed $value)allowsMultiple()setMultiple(mixed $multiple)setPivot(mixed $pivot)setSubfields(mixed $subfields)setParentFieldName(mixed $value)setPrefix(string $prefix)setSuffix(string $suffix)setDefault(mixed $default)setValue(mixed $value)setHint(string $hint)setInline(mixed $inline)hidden()- 使字段为隐藏类型checkbox()- 使字段为复选框类型radio()- 使字段为单选框类型number()- 使字段为数字类型password()- 使字段为密码类型setPlaceholder(string $placeholder)isReadOnly()- 使字段为只读isDisabled()- 使字段为禁用setClass(string $class)- 设置字段元素的 CSS 类setAttributes(array $attributes, bool $mergeRecursive = true)- 为字段元素添加额外的属性setWrapper(mixed $value, bool $mergeRecursive = true)setFake(bool $fake)setStoresIn(string $storesIn)setOptions(mixed $options, bool $mergeRecursive = true)allowsNull()setAllowsNull(bool $allowNull)setTab(string $tab)
注意
字段类使用 \Anik\LaravelBackpack\Extension\Extensions\Attributable 特性。检查 可属性 部分。
添加过滤器
实例化一个 过滤器
new \Anik\LaravelBackpack\Extension\Filters\Filter(string $name, [?string $label = null])\Anik\LaravelBackpack\Extension\Filters\Filter::create(string $name, [?string $label = null])\Anik\LaravelBackpack\Extension\Filters\AjaxFilter::create(string $name, [?string $label = null], [?string $url = null], [?string $method = null])
从控制器添加过滤器
- 对于单个过滤器,
$this->registerFilter($filter) - 对于多个过滤器,
$this->registerFilters($filters)
示例
use Anik\LaravelBackpack\Extension\Controllers\CrudController; use Anik\LaravelBackpack\Extension\Filters\Filter; use Anik\LaravelBackpack\Extension\Filters\AjaxFilter; class AccountCrudController extends CrudController { public function setupListOperation () { $filters = [ Filter::create('status') ->setValues([1 => 'Draft', 2 => 'Pending', 3 => 'Published',]) ->setLogic(fn($status) => $this->crud->query->where('status', $status)), AjaxFilter::create('user_id'), ]; $this->registerFilters($filters); $this->registerFilter((new Filter('is_deleted'))->setValues([0, 1])); } }
可用方法
setType(string $type)- 设置过滤器类型setViewNamespace(string $namespace)setPlaceholder(string $placeholder)setValues(string|array|callable $values)setLogic(callable $logic)setFallbackLogic(callable $fallbackLogic)
注意
过滤器类使用 \Anik\LaravelBackpack\Extension\Extensions\Attributable 特性。检查 可属性 部分。
添加小部件
实例化一个 小部件
new \Anik\LaravelBackpack\Extension\Widgets\Widget([?string $type = null], [?string $name = null], [?string $section = null])\Anik\LaravelBackpack\Extension\Widgets\Script::create(string $src, [?string $name = null])\Anik\LaravelBackpack\Extension\Widgets\Style::create(string $href, [?string $name = null])new \Anik\LaravelBackpack\Extension\Widgets\Hidden([?string $type = null], [?string $name = null], [?string $section = null])
从控制器添加小部件
- 对于单个小部件,
$this->registerWidget($widget) - 对于多个小部件,
$this->registerWidgets($widgets)
示例
use Anik\LaravelBackpack\Extension\Controllers\CrudController; use Anik\LaravelBackpack\Extension\Widgets\Script; use Anik\LaravelBackpack\Extension\Widgets\Style; use Anik\LaravelBackpack\Extension\Widgets\Widget; class AccountCrudController extends CrudController { public function setupListOperation () { $widgets = [ Script::create('assets/js/common.js'), Style::create('assets/css/common.css'), ]; $this->registerWidgets($widgets); $this->registerWidget((new Widget('script'))->setContent('assets/js/another_common.js')); } }
可用方法
-
setSection(string $section) -
setContent(mixed $content) -
setViewNamespace(string $namespace) -
shouldBeHidden() -
shouldBeFirst() -
shouldBeLast() -
Script::setSrc(string $src) -
Script::setStack(string $stack) -
Style::setRel(string $rel) -
Style::setHref(string $href) -
Style::setStack(string $stack)
注意
Widget 类使用了 \Anik\LaravelBackpack\Extension\Extensions\Attributable 特性。请查看Attributable 部分。
关系
如果列或字段指向一个 Eloquent 关系,则可以使用 Anik\LaravelBackpack\Extension\Relations\Relation。
实例化一个 关系
new \Anik\LaravelBackpack\Extension\Relations\Relation(string $type, string $method, [?string $attribute = null])new \Anik\LaravelBackpack\Extension\Relations\CustomRelation::create(string $type, string $method, [?string $attribute = null])new \Anik\LaravelBackpack\Extension\Relations\BelongsTo::create(string $method, [?string $attribute = null])new \Anik\LaravelBackpack\Extension\Relations\HasOne::create(string $method, [?string $attribute = null])new \Anik\LaravelBackpack\Extension\Relations\BelongsTo::BelongsToMany(string $method, [?string $attribute = null])new \Anik\LaravelBackpack\Extension\Relations\HasOne::HasMany(string $method, [?string $attribute = null])
参数
$method- 在 eloquent 模型 中关系的方法名称。$attribute- 相关 eloquent 模型的 字段/列/属性。$type- 由 backpack 使用以选择显示关系计算值的 视图。
该软件包提供了 4 个内置关系,这些关系使用 backpack 建议的 类型。
HasOne、BelongsTo- 类型: 选择HasMany、BelongsToMany- 类型: 多选
如果您需要自定义关系,可以使用 \Anik\LaravelBackpack\Extension\Relations\CustomRelation。
示例
use Anik\LaravelBackpack\Extension\Columns\Column; use Anik\LaravelBackpack\Extension\Controllers\CrudController; use Anik\LaravelBackpack\Extension\Fields\Field; use Anik\LaravelBackpack\Extension\Relations\BelongsTo; use Anik\LaravelBackpack\Extension\Relations\HasMany; class AccountCrudController extends CrudController { public function setupListOperation () { $columns = [ // Other columns Column::create('phone')->related(HasMany::create('phones', 'number')), ]; $this->registerColumns($columns); } public function setupCreateOperation() { $fields = [ // Other fields Field::create('country_id', 'Country')->related(BelongsTo::create('country', 'name')), ]; $this->registerFields($fields); } }
可用方法
setValueResolver(Closure $resolver)- 设置一个闭包,该闭包将负责计算字段/列的值
注意
只有 CustomRelation 类使用 \Anik\LaravelBackpack\Extension\Extensions\Attributable 特性。请查看Attributable 部分。
Attributable 特性
Attributable 特性允许类以数组格式保存和检索属性。使用该特性的类将能够访问以下方法。
-
addAttribute(string $key, mixed $value, bool $mergeRecursive = false) -
addAttributes(array $attributes, bool $mergeRecursive = false) -
unset(string $key) -
toArray(): array -
$mergeRecursive表示是否使用 array_merge 而不是 array_merge_recursive 来合并。 -
addAttribute、addAttributes、unset方法在 添加 或 删除 值时允许使用 点表示法 的键。
示例
use Anik\LaravelBackpack\Extension\Fields\Field; $field = Field::create('name'); $field->addAttribute('attributes.readonly', 'readonly'); // ['attributes' => ['readonly' => 'readonly']] // $field->addAttribute('attributes.disabled', 'disabled'); // w/o the parameter [mergeRecursive: true] -> ['attributes' => ['disabled' => 'disabled']] $field->addAttribute('attributes.disabled', 'disabled', true); // ['attributes' => ['readonly' => 'readonly', 'disabled' => 'disabled']] $field->addAttributes(['wrapper.class' => 'col-md-12'], true); $field->addAttributes(['wrapper' => ['another' => ['key' => 'value']]], true); // $field->addAttributes(['wrapper.another.key' => 'value'], true); // Alternative implementation of the above line /** * STRUCTURE: $field->toArray(); * * [ * 'attributes' => [ * 'readonly' => 'readonly', * 'disabled' => 'disabled' * ], * 'wrapper' => [ * 'class' => 'col-md-12', * 'another' => [ * 'key' => 'value' * ] * ] * ] */ $field->unset('wrapper.another'); /** * STRUCTURE: $field->toArray(); * * [ * 'attributes' => [ * 'readonly' => 'readonly', * 'disabled' => 'disabled' * ], * 'wrapper' => [ * 'class' => 'col-md-12' * ] * ] */