lupennat/nova-better-lens
Composer 安装命令:
composer require lupennat/nova-better-lens
包简介
Laravel Nova - Better Lens
README 文档
README
Requirements
php: ^7.4 | ^8laravel/nova: ^4
Installation
composer require lupennat/nova-better-lens:^2.0
| NOVA | PACKAGE |
|---|---|
| <4.29.5 | 1.x |
| >4.29.6 | 2.x |
Usage
Laravel Nova Better Lens, improve Nova Lenses Behaviours
// in app/Nova/Resource.php use Lupennat\BetterLens\ResolvesBetterLenses; class User extends Resource { use ResolvesBetterLenses; public function lenses(NovaRequest $request) { return [ new Lenses\MostValuableUsers, ]; } }
Include trait on Lens.
use Lupennat\BetterLens\BetterLens; class MostValuableUsers extends Lens { use BetterLens; }
Trait Improvements
Authorization
Better Lens provide the ability to define authorization for lens. You can override parent resource methods using standard laravel authorization methods.
use Lupennat\BetterLens\BetterLens; use Illuminate\Http\Request; class MostValuableUsers extends Lens { use BetterLens; public function authorizedToView(Request $request) { return false; } }
Authorize To Create
By Default Nova Lens does not provide the ability to Create/Attach resource, to mantain compatibility authorizedToCreate will work only if lens will be loaded with many* Fields or if the method is explicitly defined in the lens.
Hide From Toolbar
Better Lens provide the ability to exclude a lens from parent resource toolbar list by the static method hideFromToolbar (by default is 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; } }
With Related
Better Lens provide the ability to make lens Viewable only as related resource.
By default all lens on Nova can be linked on Menu and can be loaded as a standalone index resource. With static method withRelated, you can override default behaviour and prevent lens to be loaded without a viaResource request (by default is empty array).
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]; } }
Per Page
Better Lens provide the ability to define perPage options for lens. Using static methods perPageViaRelationship and perPageOptions you can override parent resource perPage options (by default use parent resource options).
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]; } }
you can also choose to show pagination filter when lens are loaded as relation via static showPaginationViaRelationship method (by default is 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; } }
Decorate Collection
Better Lens provide the ability to manipulate the collection of models returned by the query, you can override the static method decorateCollection and change the collection before it will be used to serialization (by default it return the original collection).
Returned Collection should always return a Collection of Eloquent models, returning other types can generate runtime errors.
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; } }
Resource Link Parameters
Better Lens provide the ability to define extra parameters for view and edit url. You can define a list of parameter => value using static method resourceLinkParameters (by Default is empty array).
/** * Url Extra Parameters. * * @param \Illuminate\Database\Eloquent\Model $model * * @return array<string,string> */ public static function resourceLinkParameters($model, LensRequest $request) { return [ 'name' => $model->name ]; }
Create Link Parameters
Better Lens provide the ability to define extra parameters for creation url. You can define a list of parameter => value using static method createLinkParameters (by Default is empty array).
/** * Creation Url Extra Parameters. * * @return array<string,string> */ public static function createLinkParameters(NovaRequest $request) { return [ 'param' => 'value' ]; }
Breadcrumbs
Better Lens provide the ability to override default Breadcrumbs for Lens pages using method breadcrumbs (by Default Nova Lens page breadcrumbs are loaded).
/** * Page Breadcrumbs. * * @return \Laravel\Nova\Menu\Breadcrumbs */ public function breadcrumbs(LensRequest $request) { return Breadcrumbs::make([]); }
Many Fields
Better Lens automatically enable a new method lens for all Many Relationship Fields:
- BelongsToMany
- HasMany
- HasManyThrough
- MorphedByMany
- MorphMany
- MorphToMany
many relationship will load the lens view instead of the main resource.
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) ]; } }
Lens Field
Better Lens provide a new field Lens that can be used to load a resource lens without a "real many relationship".
By the field Lens it is possible to create a related table without creating a Custom ResourceTool.
Example
We want to load a table with all translation key and the related translation value for current website.
The table translation_keys does not have a real relation with the website resource and only contains all the translation keys. The table translations instead contains both the relation with key and website.
We don't want to use directly the translations table because we will lost the key not translated for the current website, we need to start from translation_keys table and load the website value from the translations table if present.
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) ]) )); } }
lupennat/nova-better-lens 适用场景与选型建议
lupennat/nova-better-lens 是一款 基于 Vue 开发的 Composer 扩展包,目前已累计 3.53k 次下载、GitHub Stars 达 7, 最近一次更新时间为 2023 年 07 月 24 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「nova」 「laravel」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 lupennat/nova-better-lens 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 lupennat/nova-better-lens 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 lupennat/nova-better-lens 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
A Laravel Nova card that shows you your system information.
A Laravel Nova card.
A Laravel Nova package for publishable fields
A Laravel Nova package for translatable fields
A Laravel Nova Image field. you can paste or drag or chose an image
A Laravel Nova Mail testing tool.
统计信息
- 总下载量: 3.53k
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 7
- 点击次数: 0
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2023-07-24