lupennat / nova-better-lens
Laravel Nova - Better Lens
Requires
- php: ^7.4|^8.0
- laravel/nova: >=4.29.6
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.16
README
需求
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
选项的能力。使用静态方法 perPageViaRelationship
和 perPageOptions
,您可以重写父资源的 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) ]) )); } }