有些 Laravel 项目除了应用程序之外,还需要一个营销网站,其中包含编辑可以更新的页面、可以重新排序的菜单以及存储图像的地方。 灯丝 它覆盖了管理面板,通常你需要手动编写围绕它的内容层。MKSine,作者 米兰·萨利希 它提供页面、文章、分类、基于区块的页面构建器、主题、菜单、媒体库以及具有安装激活生命周期的插件系统。它支持 Filament 4 和 5。
安装和引导
安装软件包并设置 Filament 面板:
作曲家
要求
米兰/mksinephp
工匠
耗材:安装
--面板
然后手动编辑两个文件。
AdminPanelProvider
, 登记
MksinePlugin::make()
在面板上删除
->pages([Dashboard::class])
阻塞,因为 MKSine 在
/admin
运行这两个程序都会返回 500。
routes/web.php
删除默认值
Route::get('/')
由于 MKSine 通过当前主题提供首页服务,因此需要先运行安装程序并创建第一个帐户。
php
工匠
mksine:安装
- 迁移php
工匠
mksine:创建超级管理员
mksine:install
发布配置、迁移和运行
shield:generate --all
它会在面板注册的那一刻对其进行扫描。如果
MksinePlugin
尚未添加到面板中,不会创建任何 MKSine 权限,恢复意味着运行
php artisan shield:generate --panel=admin --all
事后你自己也会有这种感觉。
授权运行于
丝状屏蔽层
该软件包将其作为依赖项引入,同时引入的还有语言切换器和选择树字段。Shield 写入
政策
在主机应用程序中进行类
App\Policies
,而 MKSine 通过以下方式将它们绑定到自己的模型中:
Gate::policy()
该绑定受到保护
class_exists()
因此,策略从未生成的模型将不受监管,对其执行的任何操作都是允许的。
安装程序还会重写
app/Models/User.php
,并添加了 Filament 的
FilamentUser
合同和MKSine的
InteractsWithMksine
特性:它会先写入一个带有时间戳的备份,如果该补丁应用失败,管理菜单将只显示仪表盘。
插件
MKSine插件是一个位于以下目录下的
plugins/{id}/
和
plugin.php
清单和一个实现类
PluginInterface
清单文件中包含了插件的 ID、版本、命名空间和插件类:
返回
[
'ID'
=>
'笔记'
,
'姓名'
=>
'笔记'
,
'描述'
=>
“演示插件”
,
'版本'
=>
'0.1.0'
,
'作者'
=>
“你的名字”
,
'命名空间'
=>
插件
\\
笔记'
,
'plugin_class'
=>
插件\笔记\笔记插件
::班级
,];
生成器命令会搭建插件框架、注册插件,并添加模型和 Filament 资源:
php
工匠
mks-plugin:make
笔记
--作者=
你的名字php
工匠
mks-plugin:discoverphp
工匠
mks-plugin:安装
笔记php
工匠
mks-plugin:activate
笔记php
工匠
mks-plugin:make-model
笔记
笔记
--迁移php
工匠
mks-plugin:migrate
笔记php
工匠
mks-plugin:make-resource
笔记
笔记
--model=Note
Discovery 扫描每个
plugin.php
并将注册表缓存到
bootstrap/cache/mks_plugins_discovery.php
因此,后续启动会读取缓存而不是文件系统。插件激活后,会从规范路径加载其 Filament 资源、页面和小部件,无需进行任何面板注册。其迁移文件保留在插件树中,并且仅通过该路径运行。
mks-plugin:migrate {id}
并将编译后的资产发布到
public/plugins/{id}/
。
这
mks_plugins
该表存储每个插件的状态:已发现、已安装、已激活、已停用或失败。如果一个插件……
boot()
抛出异常后,启动保护程序会将其标记为失败并将消息写入。
mks_plugins.boot_error
应用程序的其余部分将继续运行。停用插件会停止应用程序的运行。
boot()
它会隐藏管理界面,但保留表格和行数据。只有在使用卸载程序时才会删除数据。
--delete-data
。
钩子
扩展点分为两类。发现钩子是监听器类,由……扫描。
php artisan mks:discover
它会为每个监听器写入一行数据。
mks_hooks
该行还会使监听器在管理后台可见,超级管理员可以启用、禁用或更改其优先级。标记为系统监听器的监听器始终运行。每次代码更改后,都需要重新运行监听器发现。
运行时钩子是通过以下方式注册的闭包或类回调:
Hooks::
插件内部的门面
boot()
它们会驻留在内存中,每次请求都会重新注册,并且不会显示在管理后台的任何位置。资源关系、小部件、页面头部操作和运行时过滤器只能通过这种方式使用。卸载插件会移除其运行时钩子。
通配符监听器名称,例如
post.*
不支持。已注册的运行时筛选器
Hooks::addFilter()
远离
mks_hooks
因此它们无法切换。表单和表格扩展始终同步运行。只有
FormHookManager
捕获监听器抛出的异常;表格、资源和页面钩子允许异常传播。对于比序列化事件更繁重的任务,监听器可以实现
QueueableHookEventInterface
并排队。
页面构建器模块
页面构建器模块扩展
BaseBuilderComponent
该类描述了模块在选择器中的显示方式、用于编辑它的 Filament 架构以及在网站上渲染它的 Blade 视图:
使用
Miran\Mksine\Core\PageBuilder\BaseBuilderComponent
;班级
价格表块
延伸
基础构建组件{
民众
静止的
功能
获取类型
()
:
细绳{
返回
'acme_price_table'
;}
民众
静止的
功能
获取名称
()
:
细绳{
返回
__
(
'acme-pricing::builder.price_table.name'
(英文):}
民众
静止的
功能
获取图标
()
:
细绳{
返回
'heroicon-o-table-cells'
;}
民众
静止的
功能
获取类别
()
:
细绳{
返回
自己::
类别部分
;}
民众
静止的
功能
获取模式
()
:
大批{
返回
[
文本输入
::
制作
(
'标题'
)
->
最大长度
(
255
),
中继器
::
制作
(
“计划”
)
->
模式
([
文本输入
::
制作
(
'姓名'
)
->
必需的
()
->
最大长度
(
80
),
文本输入
::
制作
(
'价格'
)
->
必需的
()
->
最大长度
(
40
),
切换
::
制作
(
“特色”
)
->
默认
(
错误的
),])
->
可重新订购
(),];}
民众
静止的
功能
获取默认数据
()
:
大批{
返回
[
'标题'
=>
“”
,
“计划”
=>
[]];}
民众
静止的
功能
获取渲染视图
()
:
细绳{
返回
'acme-pricing::builder.price-table'
;}}
区块没有自动发现功能。需要将每个区块注册到系统中。
ComponentRegistry
通常来自插件的
boot()
:
使用
米兰\Mksine\Core\PageBuilder\ComponentRegistry
;应用程序
(
组件注册表
::班级
)
->
登记
(
价格表块
::班级
(英文):
编辑人员随后将该模块拖放到页面上,树状结构便会存储在页面中。
builder_payload
列,一个 JSON 列,被转换为数组。
Page
模型。视图接收块的
$data
数组,加上
$children
当代码块是容器时,即使页面上次编辑时间是一年前,它仍然可能包含基于旧架构编写的有效负载,因此视图必须为其读取的每个键设置默认值。当类型未注册时,或者
getRenderView()
命名一个已不存在的视图,渲染器会进行检查
View::exists()
然后会显示一个黄色的“未知组件类型:”面板,其中列出了它无法解析的类型。
区块没有单独的屏蔽权限。任何可以编辑页面的人都可以添加任何已注册的区块,因此,暴露敏感信息的区块应该对其渲染输出进行保护。
设置选项卡
“设置”页面包含“常规”和“固定链接”两个核心选项卡,“地理位置”则位于单独的页面上。插件可以通过以下方式添加选项卡:
SettingsTabManager
而不是通过编辑页面类:
使用
Miran\Mksine\Core\Hooks\SettingsTabManager
;应用程序
(
设置选项卡管理器
::班级
)
->
注册表
(
ID
:
'acme_seo'
,
标签
:
fn
() =>
__
(
'acme-seo::settings.tab_label'
),
模式
:[
文本输入
::
制作
(
'acme_seo_meta_description'
)
->
最大长度
(
320
),
切换
::
制作
(
'acme_seo_enable_og_tags'
)
->
默认
(
真的
),],
黑秩序
:
50
,(英文):
标签页只是用户界面上的分组方式。每个字段都会保存到数据中。
settings
表格位于其自身的字段名称下,并且
mks_setting('acme_seo_meta_description')
它使用每个请求的缓存来读取数据。因为键是字段名,所以一个定义该字段的插件会……
site_name
覆盖核心
site_name
所以文档要求你给每个插件字段名称加上前缀。保存会立即覆盖之前的更改,不会保留草稿和审计日志。
主题、菜单和媒体
主题要么是一个软件包,要么是一个目录。
themes/{id}/
一次只能激活一个主题,它会提供店面 Blade 视图以及已发布的 CSS 和 JS,超级管理员可以从面板对其进行编辑。
菜单构建器支持嵌套和拖拽重新排序。菜单项可以来自页面、文章、分类或自定义 URL,每个菜单都会被分配到主题的某个位置,例如页眉或页脚。

媒体库是软件包自身的单磁盘文件存储,而不是对其他软件包的封装。
spatie/laravel-medialibrary
一个
media_attachments
连接表将文件附加到任何模型,并通过表单从库中选择文件。
MediaPicker
组件。上传的图片会生成小、中、大三种缩略图,并且默认启用图像优化,但这一步骤需要在服务器上安装 jpegoptim 等优化器二进制文件。
翻译和管理控制台
您可以在面板中按语言和文件编辑应用程序、插件和主题的翻译文件。
控制台页面仅限超级管理员访问,可运行一组允许的 Artisan 和 Composer 命令,并显示实时输出和运行历史记录。
MKSine 需要 PHP 8.2、Laravel 11 和 Filament 4 或 5,并采用 MIT 许可证。Filament 5 则要求 Laravel 11.28、Livewire 4 和 Tailwind 4。这是一个社区插件,并非由 Filament 团队开发。当前版本为 v1.5.1,因此在将其部署到生产环境之前,请务必阅读源代码。代码以及涵盖插件开发、模块编写、部署和升级的文档位于 [此处应填写文档链接]。 GitHub 创作、部署和升级正在进行中 GitHub 。







