zareismail / flexi
一个具有无与伦比灵活性的模块化Laravel解决方案。
Requires
- php: ^8.1
- illuminate/support: ^10.13
- spatie/once: ^3.1
- symfony/finder: ^6.3
Requires (Dev)
- orchestra/testbench: ^8.5
- pestphp/pest: ^2.7
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中。您可以使用resourcesIn
或resources
方法手动注册资源
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生成的每个小部件包含两个方法:resolve
和render
。在调用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
方法接受一个闭包,该闭包应返回true
或false
。闭包接收传入的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)), ]; }
这些额外的授权检查确保小部件只对符合指定标准的用户可见。