承接 lupennat/nova-better-lens 相关项目开发

从需求分析到上线部署,全程专人跟进,保证项目质量与交付效率

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

lupennat/nova-better-lens

Composer 安装命令:

composer require lupennat/nova-better-lens

包简介

Laravel Nova - Better Lens

关键字:

README 文档

README

  1. Requirements
  2. Installation
  3. Usage
  4. Trait Improvements
    1. Authorization
    2. Hide From Toolbar
    3. With Related
    4. Per Page
    5. Decorate Collection
    6. Resource Link Parameters
    7. Create Link Parameters
    8. Breadcrumbs
  5. Many Fields
  6. Lens Field

Requirements

  • php: ^7.4 | ^8
  • laravel/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 我们能提供哪些服务?
定制开发 / 二次开发

基于 lupennat/nova-better-lens 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。

BUG 修复 & 性能优化

线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。

项目外包 & 长期维护

承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。

yvsm@zunyunkeji.com QQ:316430983 微信:yvsm316 西安尊云信息科技 · 专注 PHP / Go / 分布式系统研发

统计信息

  • 总下载量: 3.53k
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 7
  • 点击次数: 0
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 7
  • Watchers: 2
  • Forks: 2
  • 开发语言: Vue

其他信息

  • 授权协议: MIT
  • 更新时间: 2023-07-24