lupennat/nova-better-lens

Laravel Nova - Better Lens

v2.0.1 2024-08-29 11:38 UTC

This package is auto-updated.

Last update: 2024-08-29 11:46:06 UTC


README

  1. 需求
  2. 安装
  3. 使用
  4. 特性改进
    1. 授权
    2. 从工具栏中隐藏
    3. 相关显示
    4. 每页显示数量
    5. 装饰集合
    6. 资源链接参数
    7. 创建链接参数
    8. 面包屑
  5. 多字段
  6. 透镜字段

需求

  • php: ^7.4 | ^8
  • laravel/nova: ^4

安装

composer require lupennat/nova-better-lens:^2.0

使用

Laravel Nova Better Lens,改进Nova 透镜行为

// in app/Nova/Resource.php

use Lupennat\BetterLens\ResolvesBetterLenses;

class User extends Resource
{
    use ResolvesBetterLenses;

    public function lenses(NovaRequest $request)
    {
        return [
            new Lenses\MostValuableUsers,
        ];
    }
}

在透镜上包含特性。

use Lupennat\BetterLens\BetterLens;

class MostValuableUsers extends Lens
{
    use BetterLens;
}

特性改进

授权

Better Lens 提供为透镜定义授权的能力。您可以使用标准的 Laravel 授权方法重写父资源方法。

use Lupennat\BetterLens\BetterLens;
use Illuminate\Http\Request;

class MostValuableUsers extends Lens
{
    use BetterLens;

    public function authorizedToView(Request $request)
    {
        return false;
    }
}

授权创建

默认情况下,Nova 透镜不提供创建/附加资源的能力,为了保持兼容性,authorizedToCreate 只有在透镜将加载许多*字段或方法在透镜中显式定义时才会工作。

从工具栏中隐藏

Better Lens 提供通过静态方法 hideFromToolbar(默认为 false)从父资源工具栏列表中排除透镜的能力。

use Lupennat\BetterLens\BetterLens;
use Illuminate\Http\Request;

class MostValuableUsers extends Lens
{
    use BetterLens;

    /**
     * Hide lens from resource toolbar.
     *
     * @return bool
     */
    public static function hideFromToolbar() {
        return true;
    }

}

相关显示

Better Lens 提供将透镜仅作为相关资源可见的能力。
默认情况下,Nova 上的所有透镜都可以在菜单中链接,并且可以作为独立的索引资源加载。使用静态方法 withRelated,您可以重写默认行为并防止透镜在没有 viaResource 请求的情况下加载(默认为空数组)。

use Lupennat\BetterLens\BetterLens;
use Illuminate\Http\Request;

class MostValuableUsers extends Lens
{
    use BetterLens;

    /**
     * Load lens only if viaResource request match resources.
     *
     * @return array<int, class-string<\Laravel\Nova\Resource>>
     */
    public static function withRelated() {
        return [Post::class, Video::class];
    }

}

每页显示数量

Better Lens 提供为透镜定义 perPage 选项的能力。使用静态方法 perPageViaRelationshipperPageOptions,您可以重写父资源的 perPage 选项(默认使用父资源选项)。

use Lupennat\BetterLens\BetterLens;
use Illuminate\Http\Request;

class MostValuableUsers extends Lens
{
    use BetterLens;

    /**
     * The number of resources to show per page via relationships.
     *
     * @return int
     */
    public static function perPageViaRelationship()
    {
        return 5;
    }


    /**
     * The pagination per-page options configured for this resource.
     *
     * @return array<int, int>
     */
    public static function perPageOptions()
    {
        return [10, 20, 30];
    }

}

您还可以选择在透镜作为关系加载时显示分页过滤器,通过静态方法 showPaginationViaRelationship(默认为 false)。

use Lupennat\BetterLens\BetterLens;
use Illuminate\Http\Request;

class MostValuableUsers extends Lens
{
    use BetterLens;

    /**
     * Show pagination filter when via relationship.
     *
     * @return bool
     */
    public static function showPaginationViaRelationship()
    {
        return true;
    }

}

装饰集合

Better Lens 提供操纵查询返回的模型集合的能力。您可以通过重写静态方法 decorateCollection 并在序列化之前更改集合来实现这一点(默认返回原始集合)。

返回的集合应始终返回 Eloquent 模型的集合,返回其他类型可能会生成运行时错误。

use Lupennat\BetterLens\BetterLens;
use Illuminate\Http\Request;

class MostValuableUsers extends Lens
{
    use BetterLens;

    /**
     * Decorate collection before returning data.
     *
     * @param \Illuminate\Support\Collection $models
     *
     * @return \Illuminate\Support\Collection
     */
    public static function decorateCollection(LensRequest $request, $models)
    {
        // do stuff ...
        return $models;
    }

}

资源链接参数

Better Lens 提供为视图和编辑 URL 定义额外参数的能力。您可以使用静态方法 resourceLinkParameters 定义一个 parameter => value 列表(默认为空数组)。

    /**
     * Url Extra Parameters.
     *
     * @param \Illuminate\Database\Eloquent\Model $model
     *
     * @return array<string,string>
     */
    public static function resourceLinkParameters($model, LensRequest $request)
    {
        return [
            'name' => $model->name
        ];
    }

创建链接参数

Better Lens 提供为创建 URL 定义额外参数的能力。您可以使用静态方法 createLinkParameters 定义一个 parameter => value 列表(默认为空数组)。

    /**
     * Creation Url Extra Parameters.
     *
     * @return array<string,string>
     */
    public static function createLinkParameters(NovaRequest $request)
    {
        return [
            'param' => 'value'
        ];
    }

面包屑

Better Lens 提供使用方法 breadcrumbs 重写默认透镜页面面包屑的能力(默认加载 Nova 透镜页面面包屑)。

    /**
     * Page Breadcrumbs.
     *
     * @return \Laravel\Nova\Menu\Breadcrumbs
     */
    public function breadcrumbs(LensRequest $request)
    {
        return Breadcrumbs::make([]);
    }

多字段

Better Lens 自动为所有多关系字段启用新的 lens 方法

  • 多对多
  • 多对一
  • 通过中间表的多对一
  • 多态多对多
  • 多态多对一
  • 多态多对多

多关系将加载透镜视图而不是主资源。

use Laravel\Nova\Fields\HasMany;
use Laravel\Nova\Http\Requests\NovaRequest;

class User extends Resource
{

    public function fields(Request $request)
    {
        return [
            HasMany::make('User Post', 'posts', Post::class)->lens(MostValuablePosts::class)
        ];
    }
}

透镜字段

Better Lens 提供一个名为 Lens 的新字段,可用于在没有“真正的多关系”的情况下加载资源透镜。
通过字段 Lens 可以创建一个相关表,而无需创建自定义资源工具。

示例

我们希望加载一个包含所有翻译键及其对应当前网站翻译值的表格。表 translation_keys 并没有与网站资源的真正关系,仅包含所有翻译键。而表 translations 则包含与键和网站的关联。
我们不希望直接使用 translations 表,因为我们将会丢失当前网站未翻译的键,我们需要从 translation_keys 表开始,并在存在的情况下从 translations 表加载网站值。

use Laravel\Nova\Http\Requests\NovaRequest;
use Lupennat\BetterLens\Fields\Lens;

class Website extends Resource
{

    public function fields(Request $request)
    {
        return [
           Lens::make(__('Translations'), TranslationKey::class, TranslationKeyForWebsite::class)->collapsedByDefault(),
        ];
    }
}
use Lupennat\BetterLens\BetterLens;
use Illuminate\Http\Request;
use Laravel\Nova\Fields\Text;

class TranslationKeyForWebsite extends Lens
{
    use BetterLens;

    public function fields(Request $request)
    {
        return [
           Text::make(__('key'), 'key'),
           Text::make(__('Value'), 'value')
        ];
    }

    /**
     * Get the query builder / paginator for the table.
     *
     * @param \Illuminate\Database\Eloquent\Builder $query
     *
     * @return mixed
     */
    public static function query(LensRequest $request, $query)
    {
        return $request->withOrdering($request->withFilters(
            $query->addSelect([
                'value' => Translation::whereColumn('translation_keys.id', 'translation.translation_key_id')
                            ->where('translation.website_id', $request->viaResourceId)
            ])
        ));
    }
}