开发面板插件
前言
概述
此教程中,我们将开发一个简单的插件,添加一个可以在表单中使用的新表单字段。这也意味着它可以在面板中使用。
此插件的最终代码在 https://github.com/awcodes/clock-widget。
步骤 1:创建插件
首先,我们将使用开始向导中提到的步骤创建插件。
步骤 2:清理
接下来,我们将清理插件移除不需要的样板代码。这看起来很多,但由于这是一个简单的插件,我们可以删除很多样板代码。
删除下列目录和文件:
configdatabasesrc/Commandssrc/Facadesstubs
由于我们的插件没有任何设置或功能所需的其他方法,我们还可以删除 ClockWidgetPlugin.php 文件。
ClockWidgetPlugin.php
因为 Filament v3 推荐用户使用自定义的 Filament 主题来定义插件样式,我们将移除在插件中使用 CSS 所需的文件。这一操作是可选的,如果你想使用 CSS,依然可以使用,不过并不推荐。
resources/csspostcss.config.jstailwind.config.js
然后清理 composer.json 文件移除不需要的选项。
"autoload": {
"psr-4": {
// We can remove the database factories
"Awcodes\\ClockWidget\\Database\\Factories\\": "database/factories/"
}
},
"extra": {
"laravel": {
// We can remove the facade
"aliases": {
"ClockWidget": "Awcodes\\ClockWidget\\Facades\\ClockWidget"
}
}
},
最后一步是更新 package.json 文件,移除不需要的选项。使用如下内容替换 package.json 中的内容。
{
"private": true,
"type": "module",
"scripts": {
"dev": "node bin/build.js --dev",
"build": "node bin/build.js"
},
"devDependencies": {
"esbuild": "^0.17.19"
}
}
然后,我们需要安装依赖。
npm install
你可能也想删除测试目录及其文件,不过我们暂时先把它们留着,虽然我们在这个例子中我们不会使用测试,我还是强烈推荐为你的插件编写测试。
步骤 3:服务提供者
既然已经清理完了,我们可以开始添加代码了。src/ClockWidgetServiceProvider 文件中的样板代码中有很多内容,因此,我们删除所有内容,从头开始。
本例中,我们将注册异步 Alpine 组件。由于这些资源仅在请求时加载,因此我们可以在
packageBooted()方法中注册它们。如果你注册的资源(比如 CSS 或 JS 文件)在每个页面上都加载,无论是否使用,我们建议在Plugin配置对象的register()方法中通过$panel->assets()进行注册。否则,如果你在packageBooted()方法中注册它们,它们将适用于每个面板,而不管插件是否在该面板上注册。
我们需要在面板中注册 Widget 并且在使用 widget 时加载 Alpine 组件。为此,我们需要添加以下内容 到服务提供者的 packageBooted 方法。这将会向 Livewire 注册 widget 组件并向 Filament 资源管理器注册 Alpine 组件。
use Filament\Support\Assets\AlpineComponent;
use Filament\Support\Facades\FilamentAsset;
use Livewire\Livewire;
use Spatie\LaravelPackageTools\Package;
use Spatie\LaravelPackageTools\PackageServiceProvider;
class ClockWidgetServiceProvider extends PackageServiceProvider
{
public static string $name = 'clock-widget';
public function configurePackage(Package $package): void
{
$package->name(static::$name)
->hasViews()
->hasTranslations();
}
public function packageBooted(): void
{
Livewire::component('clock-widget', ClockWidget::class);
// Asset Registration
FilamentAsset::register(
assets:[
AlpineComponent::make('clock-widget', __DIR__ . '/../resources/dist/clock-widget.js'),
],
package: 'awcodes/clock-widget'
);
}
}