zareismail/flexi

一个具有无与伦比灵活性的模块化Laravel解决方案。

1.1.0 2023-07-28 12:39 UTC

This package is auto-updated.

Last update: 2024-08-28 14:59:31 UTC


README

介绍

要求

安装

资源

小部件

介绍

Flexi是一个强大的包,旨在无缝地将小部件集成到Laravel应用程序中。它包含两个主要组件:小部件和资源。小部件可以实现动态内容的显示,而资源提供了一种结构化的方式来导航应用程序。

要求

在安装Flexi之前,请确保您满足以下要求

  • Composer
  • Laravel 10.x

安装

要安装Flexi,请使用以下命令

composer require zareismail/flexi

定义资源

默认情况下,Flexi资源存储在应用程序的app/Flexi目录中。您可以使用flexi:resource Artisan命令生成一个新资源

php artisan flexi:resource Post

注册资源

默认情况下,app/Flexi目录中的所有资源都自动注册到Flexi中。您可以使用resourcesInresources方法手动注册资源

Flexi::resourcesIn(app_path('Flexi'));

Flexi::resources([ 
    Post::class,
]);

请确保将这些代码片段包含在服务提供者的boot方法中。

导航

一旦您将资源注册到Flexi中,您可以使用相应的URL进行应用程序导航。默认情况下,访问生成资源的URL将组合resources前缀(默认分组名称)和资源的uriKey。例如,一个Post资源将可在https:///resources/posts访问。然而,您可以进一步自定义此URL。

分组资源

每个注册资源的URI路径都以前缀resources开头。要删除此前缀,您可以编辑资源的group属性

/**
 * The logical group associated with the resource.
 */
public static ?string $group = null;

在此更改后,您可以通过访问https:///posts来访问资源。

边界资源

默认情况下,Flexi将每个注册资源的URL路径前缀为它的uriKey(这是类名的复数化缩写)。要删除此前缀,请修改资源的bounded方法

/**
 * Determine if the resource is a bounded resource.
 */ 
public static function bounded(): bool
{
    return false;
}

bounded方法返回false时,Flexi将资源的uriKey从其URI中删除。因此,您可以使用https:/// URL访问未分组的不受限制的Post资源。

通配符资源

默认情况下,Flexi将资源限制在特定的URL上。但是,如果您想捕获资源的任何通配符URL,请覆盖资源的wildcard方法

/**
 * Determine if the resource is a wildcard resource.
 */ 
public static function wildcard(): bool
{
    return true;
}

wildcard返回true时,Flexi将资源的前缀为uriKey的所有路径进行分发。因此,您可以使用https:///posts/ANYTHING URL访问未分组的通配符Post资源,其中ANYTHING可以是任何与URL路径分隔符结合的字符串。

通配符资源

Laravel的后备路由允许您通过将它们重定向到特定路由或控制器操作来优雅地处理未定义的路由或404错误。随着“Flexi”包中新增的功能,现在您可以为Laravel应用程序中的这些后备路由指定一个后备资源,它是一个Flexi资源。如果您想确定一个资源作为后备资源,请覆盖资源的fallback方法

/**
* Determine if the resource is a fallback resource.
*/
public static function fallback(): bool
{
    return true;
}

当您需要自定义回退路由的行为,并在用户遇到未定义的路由或页面时提供用户友好的体验时,此功能非常方便。请注意,一个通配符 未分组 未限定 资源也可以像回退 资源一样工作。

解析资源

由Flexi命令生成的每个资源都包含一个resolve方法,允许您自定义数据检索,并在请求解析资源后将其附加到资源上。例如,如果您需要从数据库中检索请求资源的模型,可以使用以下方法

use App\Models\Post;

/**
 * Resolve the resource for the incoming request.
 */
public function resolve(FlexiRequest $request)
{
    $this->post = Post::findByUri($request->segment(1));

    abort_unless($this->post, 404);
}

在此示例中,resolve方法根据请求的URI段从数据库检索Post模型。然后,它将检索到的模型分配给资源的$post属性。如果找不到模型,则使用404响应终止请求。

您可以自定义resolve方法以适应特定的要求,允许您根据传入的请求检索和附加相关数据到资源。

小部件

虽然Flexi资源允许您在应用程序中进行导航,但Flexi的“小部件”功能允许您根据传入请求的导航资源显示数据。

定义小部件

您可以使用flexi:widget Artisan命令生成小部件,默认情况下,新生成的小部件放置在app/Flexi/Widgets目录中

php artisan flexi:widget PostDetail

由Flexi生成的每个小部件包含两个方法:resolverender。在调用render方法之前,resolve方法准备小部件的相关数据,该方法返回要显示的最终生成内容。

<?php

namespace App\Flexi\Widgets;

use Flexi\Widgets\Widget;

class PostDetail extends Widget
{
    /**
     * Resolve the widget data.
     */
    public function resolve($resource)
    {
        $this->post = $resource->post;
    }

    /**
     * Get the evaluated contents of the widget.
     *
     * @return string
     */
    public function render()
    {
        return view('post', $this->post);
    }
}

注册小部件

一旦您定义了一个小部件,您就可以将其附加到资源上。由Flexi生成的每个资源都包含一个widgets方法。要附加小部件,只需将其添加到此方法返回的小部件数组中。可以使用它们的静态make方法创建小部件,通常将小部件的“可读”名称作为参数传递

/**
 * Get the widgets available on the entity.
 *
 * @return array
 */
public function widgets(Request $request)
{
    return [ 
        PostDetail::make('Post Detail'),
    ];
}

授权

有时,您可能想隐藏某些小部件供一组用户使用。您可以通过将canSee方法链接到小部件定义来实现这一点。该canSee方法接受一个闭包,该闭包应返回truefalse。闭包接收传入的HTTP请求,允许您执行授权检查

/**
 * Get the widgets available on the entity.
 *
 * @return array
 */
public function widgets(Request $request)
{
    return [ 
        PostDetail::make('Post Detail')->canSee(fn ($request) => $request->user()->can('viewPost', $request->resolveResource()->post)),
    ];
}

这些额外的授权检查确保小部件只对符合指定标准的用户可见。