bozboz/admin

此包已废弃且不再维护。未建议替代包。
此包最新版本(v2.17.2)没有可用的许可证信息。


README

安装

  1. 使用Composer安装此包,运行composer require bozboz/admin

  2. 安装Intervention Image composer require intervention/image

  3. 将包添加到config/app.php中的providers数组

     Bozboz\Admin\Providers\AdminServiceProvider::class,
     Bozboz\Admin\Providers\MediaLibraryServiceProvider::class,
    
     Intervention\Image\ImageServiceProvider::class,
    
  4. 可选,将Bozboz\Admin\Media\Media添加到app/config/app.php中的aliases数组

  5. providers.users.model设置为Bozboz\Admin\Users\User::class在config/auth.php中

  6. 删除database/migrations/中的默认Laravel用户和密码重置迁移表

  7. 运行php artisan vendor:publish && php artisan migrate

  8. 编辑config/imagecache.php

<?
        ...
        // set route to images
        'route' => 'images', 
        ...
        // add path to uploaded images
        'paths' => array(
            ...
            public_path('media/image'), 
        ),

控制器

Controllers\ModelAdminControllerControllers\BulkAdminController是包含模型标准CRUD功能的抽象类。子类 - 至少 - 必须定义一个构造函数,该构造函数传递一个Decorators\ModelAdminDecoratorDecorators\BulkAdminDecorator的实例。例如:

use Bozboz\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 Bozboz\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子类的数组。

有两种内置的列表筛选器:ArrayListingFilterSearchListingFilter

数组列表筛选器

此筛选器接受一个选项数组,并渲染一个选择框。它接受一个可选的第三个参数,允许自定义筛选逻辑。如果省略此参数,则根据所选选项在模型上执行基于筛选名称的查找。如果传递一个字符串作为第三个参数,则该字段将用于where条件。如果参数是回调,则将运行此回调以筛选列表查询。

可以指定一个第四个"默认"值,如果默认选项不是0/空。

例如:

public function getListingFilters()
{
    return [
        new ArrayListingFilter('state',
            ['All', 'New', 'Completed', 'Failed']
        , 'state_id', 2)
    ];
}

搜索列表筛选器

此筛选器为每个输入的单词提供了相当基本的LIKE搜索指定的列。它用于搜索的字段默认为筛选器的名称(第一个参数),但可以指定为一个数组作为第二个参数。

默认查询将对构造筛选器时定义的每个列执行查询词的通配符LIKE搜索。例如,对"名称"和"描述"列的"foo"搜索将生成以下SQL where条件:

WHERE `name` LIKE '%foo%' OR `description` LIKE '%foo%'

要覆盖此默认实现,可以将闭包作为构造函数的第三个参数传递,该闭包接受查询构建器对象,并允许您按需查询。

模型

本包中的所有模型都扩展了Models\BaseModels\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 生成值。在相应的模型上使用该特性并定义一个返回用于生成 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]