larasoft / admin
Requires
- php: >=5.4.0
- doctrine/dbal: ^2.5
- guzzlehttp/guzzle: 6.*
- illuminate/support: 5.*
- intervention/image: ^2.3
- intervention/imagecache: ^2.3
- laravelcollective/html: ~5.2
Requires (Dev)
- mockery/mockery: 0.9.*@dev
- phpunit/phpunit: ~4.0.7
This package is auto-updated.
Last update: 2024-09-21 20:05:33 UTC
README
安装
- 在Composer中通过运行
composer require larasoft/admin
来要求此包 - 将
Larasoft\Admin\AdminServiceProvider
添加到app/config/app.php中的providers数组 - 可选地,将
Larasoft\MediaLibrary\Models\Media
添加到app/config/app.php中的aliases数组
控制器
Controllers\ModelAdminController
和Controllers\BulkAdminController
是包含模型标准CRUD功能的抽象类。子类 - 至少 - 必须定义一个构造函数,该函数传递一个Decorators\ModelAdminDecorator
或Decorators\BulkAdminDecorator
实例。例如。
use Larasoft\Admin\Decorators\FooAdminDecorator;
class FooAdminController extends ModelAdminController
{
public function __construct(FooAdminDecorator $foo)
{
parent::__construct($foo);
}
}
Laravel将在实例化控制器时智能地从IoC容器中解析依赖,因此剩下要做的就是将此控制器作为资源在路由文件中注册,如下所示
Route::resource('admin/foo', 'FooAdminController');
这将启用在Decorators\ModelAdminDecorator
依赖中定义的模型上的完整CRUD功能。
装饰器
装饰器包含有关模型在管理区域中如何显示的信息。如果您有一个应该可以在管理区域中访问的模型,则需要一个相关的装饰器。抽象的Decorators\ModelAdminDecorator
类包含一些必须在子类中定义的抽象方法。
getLabel
应返回一个适合的模型字符串表示形式;通常是实体的标题。getFields
应返回一个Fields\Field
实例数组,用于在相关屏幕上创建/编辑实体。
有一些可选方法可以重写
getColumns
应返回要在管理概览页上显示的列的关键/值数组getHeading
应返回整体模型的字符串表示形式(而不是像getLabel
那样特定实例)。此方法接受一个布尔参数(默认为false),允许调用脚本请求复数或单数形式。modifyListingQuery
允许修改列表查询,例如,加载关系、应用自定义排序或条件。
与Controllers\ModelAdminController
的子类类似,装饰器必须在构造函数中传递一个依赖项。这应该是装饰器在管理区域中代表的实体。此类必须实现Models\BaseInterface
类。
例如。
use Larasoft\Admin\Models\Page;
class PageAdminDecorator extends ModelAdminDecorator
{
public function __construct(Page $page)
{
parent::__construct($page);
}
}
表示多对多关系
多对多关系也可以以同步和列表关系的形式在管理区域中表示。这两种类型都使用Select2字段,并允许您管理两个实例之间的多对多关系。
同步关系是更常见的关系,允许从列表中选择相关模型,并在保存时创建正在编辑的模型和相关模型之间的映射。要定义同步关系,请将getSyncRelations
方法添加到您的装饰器中,并返回要同步的关系数组,例如。
public function getSyncRelations()
{
return ['categories'];
}
列表关系在相关模型可以由简单的字符串表示时很有用(例如标签)。列表关系类似于同步关系,但它们可以在编辑/创建屏幕中组合。使用select2的“标签”选项,您可以在select2输入中添加新选项。任何创建的新实例将在父模型保存时保存。
列表关系与同步关系定义类似,但必须指定要保存新字符串的字段,例如。
public function getListRelations()
{
return [
'tags' => 'name'
];
}
在上面的示例中,标签模型必须包含“名称”属性。
一旦定义了任何同步/列表关系,为了在编辑模型的表单中表示它们,您必须在装饰器的getFields
方法中添加一个BelongsToManyField
实例。
public function getFields($instance)
{
return [
..
new BelongsToManyField(new FooDecorator(new Foo), $instance->foos());
];
}
此外,对于列表关系,要启用 Select2 的 "标签" 功能,必须在 BelongsToManyField 参数中设置一个 data-tags
属性。
public function getFields($instance)
{
return [
..
new BelongsToManyField(new TagDecorator(new Tag), $instance->tags(), [
'data-tags' => true
]);
];
}
筛选列表
可以通过装饰器指定列表过滤器,以在管理界面中提供筛选结果选项。应在相应的装饰器上的 getListingFilters
方法中定义它们。此方法应返回一个 Reports\Filters\ListingFilter
子类的数组。
现成的两种列表过滤器:ArrayListingFilter
和 SearchListingFilter
。
数组列表过滤器
此过滤器接受一个选项数组并渲染一个选择框。它接受一个可选的第三个参数,允许自定义过滤逻辑。如果省略此参数,则根据选定的选项在模型上执行基于名称的查找。如果传递字符串作为第三个参数,则将在 WHERE 条件中使用此字段。如果参数是回调函数,则将运行此回调来筛选列表查询。
可以指定一个第四个 "默认" 值,如果默认选项不是 0/空值。
例如。
public function getListingFilters()
{
return [
new ArrayListingFilter('state',
['All', 'New', 'Completed', 'Failed']
, 'state_id', 2)
];
}
搜索列表过滤器
此过滤器为每个输入的单词提供对指定列的相当基本的 LIKE 搜索。它用于搜索的字段默认为过滤器的名称(第一个参数),但可以通过传递数组作为第二个参数来可选地指定。
默认查询将对构造过滤器时定义的每个列执行查询词的通配符 LIKE 搜索。例如,在 "name" 和 "description" 列上搜索 "foo" 将产生以下 SQL WHERE 条件
WHERE `name` LIKE '%foo%' OR `description` LIKE '%foo%'
要覆盖此默认实现,可以将闭包作为构造函数的第三个参数传入,该闭包接受一个查询构建器对象,并允许您按需查询。
模型
本包内的所有模型都扩展了 Models\Base
(Models\BaseInterface
的实现)。
验证器
模型的验证规则存储在单独的验证器服务类中。验证子类应扩展 Services\Validators\Validator
类。希望进行验证的模型有责任定义自己的验证器子类型,以在其中定义验证规则来验证模型数据。
"rules" 属性
这些是在所有验证实例中应应用的规则。
"storeRules" 属性
仅应在存储新的模型实例时应用的规则。将与 "rules" 属性合并。
"updateRules" 属性
仅应在更新现有模型实例时应用的规则。将与 "rules" 属性合并。
唯一规则
Laravel 的唯一规则在更新时会失败,因为正在保存的模型上要验证的值会与数据库中已存在的条目上的值冲突。为了解决这个问题,Laravel 提供了以下更详细的语法来定义唯一验证规则:'unique:<table>,<field>,<id>'
。
可以在规则中硬编码表和字段,但 ID 是一个动态值。您可以使用花括号占位符在验证服务中表示此值,例如 'unique:pages,slug,{id}'
。
占位符语法适用于模型上的任何属性,因此可以用于 Laravel 的扩展唯一功能,例如 'unique:users,email_address,{id},id,account_id,{account_id}'
特性
DynamicSlugTrait
自动为模型生成 slug 值。在相应的模型上使用 use
特性,并定义一个返回用于派生 slug 的属性名称的 getSlugSourceField
方法。
字段
DateTimeField
使用 datetimepicker 扩展了 jQuery UI DatePicker 的功能。文档可以在 此处 找到。
实例化 DateTimeField
对象时,可以通过传递映射到 'options' 键的数组来覆盖默认的 datetimepicker 配置。
这将使用JSON编码,并在DOM渲染时与默认值合并。当在datetimepicker文档中传递定义为JS日期对象的值时,请将这些定义为纪元值(例如 time()
或 $dateTime->format('U')
)。
URLField
URLField可以从另一个字段自动生成slug。为了使用此功能,您必须将data-auto-slug-from
属性设置为要针对的字段的名称属性。
例如。
<?php
new URLField('slug', [
'route' => '...',
'data-auto-slug-from' => 'name',
]);
辅助工具
asset_version
将最后修改时间追加到资产文件名末尾,用于缓存破坏。
用法
{{ asset_version('assets/css/min/style.css') }}
为了使其工作,您必须在
.htaccess
文件中添加以下内容# Rewrite cachebusted assets RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_URI} ^.*\.(css|js)$ RewriteRule ^(.+)--\d+\.([^\.]+)$ $1.$2 [L]