iotronlab/filament-multi-guard 问题修复 & 功能扩展

解决BUG、新增功能、兼容多环境部署,快速响应你的开发需求

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

iotronlab/filament-multi-guard

Composer 安装命令:

composer require iotronlab/filament-multi-guard

包简介

Multi Guard Context for Filament Admin

README 文档

README

Build Status Total Downloads Latest Stable Version License Watcher Release Language

This features have been natively added to Filament v3. Use this package for v2 only!

This package allows you to register multiple filament route/path based contexts in your application with their own set of resources, pages, widgets and guard. The contexts can also be used on the same guard instance. eg. for role based setups.

This package is derived from filament-multi-context package but doesn't include it as a dependency as the package doesn't support multiple guard instances.

Installation

You can install the package via composer:

composer require iotronlab/filament-multi-guard

Single Guard Usage

Create a new filament context with out GuardLogin and GuardMiddleware.

php artisan make:filament-context FilamentTeams

The above command will create the following files and directories:

app/FilamentTeams/Pages/
app/FilamentTeams/Resources/
app/FilamentTeams/Widgets/
app/Providers/FilamentTeamsServiceProvider.php
config/filament-teams.php

Filament cannot be passed as a context to this command as it is reserved for the default filament installation

Register Provider: Be sure to add the FilamentTeamsServiceProvider class to your providers array in config/app.php

Multi Guard Usage

To create a new context with GuardLogin and GuardMiddleware.

php artisan make:filament-context FilamentTeams --guard

or make a GuardLogin and GuardMiddleware for a already generated context

php artisan make:filament-guard FilamentTeams 

The above command will create the following files and directories:

app/FilamentTeams/Middleware/FilamentTeamsMiddleware.php
app/FilamentTeams/Pages/
app/FilamentTeams/Resources/
app/FilamentTeams/Widgets/
app/Http/Livewire/FilamentTeamsLogin.php
app/Providers/FilamentTeamsServiceProvider.php
config/filament-teams.php

Filament cannot be passed as a context to this command as it is reserved for the default filament installation

Register Provider: Be sure to add the FilamentTeamsServiceProvider class to your providers array in config/app.php

Replace the auth guard, pages login and middleware auth in the context config with the generated login page and middleware.

use App\FilamentTeams\Middleware\FilamentTeamsMiddleware;
use App\Http\Livewire\FilamentTeamsLogin;

    'auth' => [
        'guard' => 'your-custom-guard',
        'pages' => [
            'login' => FilamentTeamsLogin::class,
        ],
    ],

     'middleware' => [
        'auth' => [
            // Authenticate::class,
            FilamentTeamsMiddleware::class
        ],
   
    ],

Now, you can go to /{context-path}/login to login to the new context. You can remove the dashboard from 'pages' in the context pages folder and implement your own dashboard.

You should implement the logout components UserMenuItem in a service provider with Filament::serving()

Filament::serving(function () {
    Filament::forContext('filament-teams', function () {
            Filament::registerUserMenuItems([
                'logout' => UserMenuItem::make()->label('Log Out')->url(route('filament-teams.logout')),
                ]);
            });
        });

Adding Pages/Resources to context

You may now add filament resources in your FilamentTeams directories. Generate Filament pages/resources/widgets as you normally would. Move them into the context-folder and update the namespace.

Context Traits: be sure to add the ContextualPage and ContextualResource traits to their associated classes inside of your context directories. Without this when filament generates navigation links it will try to use filament.pages.* and filament.resources.{resource}.* instead of {context}.pages.* and {context}.resources.{resource}.* as the route names

ContextualPage & ContextualResource traits

Pages:

namespace App\FilamentTeams\Resources;

use Iotronlab\FilamentMultiGuard\Concerns\ContextualPage;
use Filament\Pages\Page;

class Dashboard extends Page
{
    use ContextualPage;
}

Resources:

namespace App\FilamentTeams\Resources;

use Iotronlab\FilamentMultiGuard\Concerns\ContextualResource;
use Filament\Resources\Resource;

class UserResource extends Resource
{
    use ContextualResource;
}

Configuration

The config/filament-teams.php file contains a subset of the config/filament.php configuration file. The values in the filament-teams.php file can be adjusted and will only affect the pages, resources, widgets, and auth guard for the filament-teams context.

Currently the configuration values that can be modified for a specific context are:

'path'
'domain'
'pages'
'resources'
'widgets'
'livewire'
'auth'
'middleware'

ContextServiceProvider

Your ContextServiceProvider found in your app/Providers/FilamentTeamsServiceProvider.php is an extension of the Filament PluginServiceProvder so features of the PluginServiceProvider may be used for your context

Custom Page and Resource Routing

If you would like more control over the way pages and resources are routed you may override the componentRoutes() function in your FilamentTeamsServiceProvider

protected function componentRoutes(): callable
    {
        return function () {
            Route::name('pages.')->group(function (): void {
                foreach (Facades\Filament::getPages() as $page) {
                    Route::group([], $page::getRoutes());
                }
            });

            Route::name('resources.')->group(function (): void {
                foreach (Facades\Filament::getResources() as $resource) {
                    Route::group([], $resource::getRoutes());
                }
            });
        };
    }

The Filament Facade

In order for this package to work the filament app service has been overriden. Each context is represented by its own FilamentMultiGuard\ContextManager extending Filament\FilamentManager object. Within your application calls to the filament facade (such as Filament::serving) will be proxied to the appropriate Filament\FilamentManager object based on the current context of your application (which is determined by the route of the request)

Context Functions

The following functions have been added to facilitate multiple Filament\FilamentManger objects in your application:

// retrieve the string name of the current application context
// defaults to `filament`

Filament::currentContext(): string
// retrieve the Filament\FilamentManager object for the current app context

Filament::getContext()
// retrieve the array of Filament\FilamentManager objects keyed by the context name

Filament::getContexts()
// set the current app context. 
// Passing null or nothing sets the context to 'filament'

Filament::setContext(string|null $context)
// sets the context for the duration of the callback function, then resets it back to the original value
Filament::forContext(string $context, function () {
    // ...
})
// loops through each registered context (including the default 'filament' context), 
// sets that context as the current context, 
// runs the callback, then resets to the original value
Filament::forAllContexts(function () {
    // ...
})
// creates a new FilamentManager object and registers it under the $name context
// this method is used by your ContextServiceProvider to register your context
// you shouldn't need to use this method during normal development
Filament::addContext(string $name)

Testing

composer test

Changelog

Please see CHANGELOG for more information on what has changed recently.

Contributing

Please see CONTRIBUTING for details.

Security Vulnerabilities

Please review our security policy on how to report security vulnerabilities.

Credits

License

The MIT License (MIT). Please see License File for more information.

iotronlab/filament-multi-guard 适用场景与选型建议

iotronlab/filament-multi-guard 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 6.33k 次下载、GitHub Stars 达 50, 最近一次更新时间为 2022 年 10 月 10 日, 在 PHP 生态内属于活跃度较高的组件。

它主要适用于以下技术方向: 「laravel」 「filament」 「filament-multi-context」 「iotronlab」 「filament-multi-guard」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。

我们在过去多个企业项目中使用过 iotronlab/filament-multi-guard 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。

围绕 iotronlab/filament-multi-guard 我们能提供哪些服务?
定制开发 / 二次开发

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

BUG 修复 & 性能优化

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

项目外包 & 长期维护

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

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

统计信息

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

GitHub 信息

  • Stars: 50
  • Watchers: 3
  • Forks: 7
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2022-10-10