Laravel 包

MKSine:一款基于 Filament 的内容管理系统,支持插件、主题和模块

发布
MKSine:一款基于 Filament 的 CMS,支持插件、主题和模块(图片)

有些 Laravel 项目除了应用程序之外,还需要一个营销网站,其中包含编辑可以更新的页面、可以重新排序的菜单以及存储图像的地方。 灯丝 它覆盖了管理面板,通常你需要手动编写围绕它的内容层。MKSine,作者 米兰·萨利希 它提供页面、文章、分类、基于区块的页面构建器、主题、菜单、媒体库以及具有安装激活生命周期的插件系统。它支持 Filament 4 和 5。

安装和引导

安装软件包并设置 Filament 面板:

作曲家 要求 米兰/mksine
php 工匠 耗材:安装 --面板

然后手动编辑两个文件。 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:discover
php 工匠 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' ;
}
}
MKSine 价格表块
自定义 MKSine 页面构建器模块的屏幕截图

区块没有自动发现功能。需要将每个区块注册到系统中。 ComponentRegistry 通常来自插件的 boot() :

使用 米兰\Mksine\Core\PageBuilder\ComponentRegistry ;
应用程序 组件注册表 ::班级 -> 登记 价格表块 ::班级 (英文):

编辑人员随后将该模块拖放到页面上,树状结构便会存储在页面中。 builder_payload 列,一个 JSON 列,被转换为数组。 Page 模型。视图接收块的 $data 数组,加上 $children 当代码块是容器时,即使页面上次编辑时间是一年前,它仍然可能包含基于旧架构编写的有效负载,因此视图必须为其读取的每个键设置默认值。当类型未注册时,或者 getRenderView() 命名一个已不存在的视图,渲染器会进行检查 View::exists() 然后会显示一个黄色的“未知组件类型:”面板,其中列出了它无法解析的类型。

区块没有单独的屏蔽权限。任何可以编辑页面的人都可以添加任何已注册的区块,因此,暴露敏感信息的区块应该对其渲染输出进行保护。

MKSine 页面生成器
MKSine页面生成器的屏幕截图

设置选项卡

“设置”页面包含“常规”和“固定链接”两个核心选项卡,“地理位置”则位于单独的页面上。插件可以通过以下方式添加选项卡: 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

Yannick Lyn Fatt 的照片

Laravel News 的特约撰稿人和全栈 Web 开发人员。

归档于

赞助

Laravel Cloud 标志
Laravel 云

轻松创建和管理服务器,并在几秒钟内部署 Laravel 应用程序。

访问 Laravel Cloud
组合:多列上的精妙关系图

组合:多列上的精妙关系

阅读文章
在 Inertia.js v3.7 图片中取消飞行中表单提交

在 Inertia.js v3.7 中取消飞行中表单提交

阅读文章
Laravel Starter Kits 现在附带 Vite+ 图片

Laravel Starter Kits 现在随附 Vite+

阅读文章
Laravel Eloquent 中使用 refreshForUpdate() 实现悲观锁定 图片

Laravel Eloquent 中使用 refreshForUpdate() 实现悲观锁定

阅读文章
Laravel 异常消息中的掩码查询绑定图片

Laravel 异常消息中的查询绑定掩码

阅读文章
whereBinary():Laravel 图片中区分大小写的 MySQL 查询

whereBinary():Laravel 中区分大小写的 MySQL 查询

阅读文章