资源
概述
Filament 生态下的所有包都共享着一个资源管理系统。这让官方插件和第三方插件都可以注册 CSS 和 JavaScript 文件,并使它们可以供 Blade 视图消费使用。
FilamentAsset
门面
FilamentAsset
门面被用作将文件注册进资源系统。这些资源文件可以在文件系统的任何位置,不过当运行 php artisan filament:assets
命令之后会被复制到应用的 /public
目录。将这些资源复制到 /public
目录下,我们可以在 Blade 视图中更有预测性地加载它们,同时确保第三方包也能加载它们的资源而无需操心这些资源放置于何处。
资源始终有一个由你决定的唯一 ID,它作为文件名用在将资源复制到 /public
目录时。该 ID 也用于在 Blade 视图中引用资源。这个 ID 也是唯一的,由于这些资源将被复制到以你的插件命名的目录中,所以,在你为插件注册资源时,你不必担心 ID 会和其他插件产生冲突。
FilamentAsset
门面应该在服务提供者的 boot()
方法中调用。它可以在应用的服务提供者(如 AppServiceProvider
),或者在插件的 服务提供者中调用。
FilamentAsset
门面有一个主方法 register()
,它接收一个资源数组用于注册:
use Filament\Support\Facades\FilamentAsset;
public function boot(): void
{
// ...
FilamentAsset::register([
// ...
]);
// ...
}
为插件注册资源
当为插件注册资源时,你应该传入 Composer 包名作为 register()
方法的第二个参数:
use Filament\Support\Facades\FilamentAsset;
FilamentAsset::register([
// ...
], package: 'danharrin/filament-blog');
现在,插件的所有资源都将被复制到位于 public
目录下的自己的目录中,以避免与其他插件可能产生的同名冲突。
注册 CSS 文件
想要在资源系统中注册 CSS 文件,可以在服务提供者的 boot()
方法中使用 FilamentAsset::register()
方法。你必须传入一个 Css
对象数组,每个对象代表着每个要在资源系统中注册的 CSS 文件。
每个 Css
对象都有一个唯一 ID 和一个到 CSS 文件的路径:
use Filament\Support\Assets\Css;
use Filament\Support\Facades\FilamentAsset;
FilamentAsset::register([
Css::make('custom-stylesheet', __DIR__ . '/../../resources/css/custom.css'),
]);
本例中,我们使用 __DIR__
生成从当前文件到资源的相对路径。比如,如果你将这段代码添加到 /app/Providers/AppServiceProvider.php
,那么 CSS 文件应该位于 /resources/css/custom.css
。
当运行 php artisan filament:assets
命令时,CSS 文件将被复制到 /public
目录中。此外,它也被加载到其他使用 Filament 的所有 Blade 视图中。如果你只希望在页面元素需要时,才加载这些 CSS,请查看 CSS懒加载章节。
在插件中使用 Tailwind CSS
一般而言,注册 CSS 文件通常用在注册自定义的样式表。如果你像使用 Tailwind CSS 处理这些文件,你需要考虑它可能的影响,特别当你是插件开发者时。
Tailwind 编译对每个应用都是唯一的 —— 它们包含类的最小集合,只包含在应用中实际使用到的类。这意味着,如果你是插件开发者,你或许不应该编译你自己的 Tailwind CSS 文件到插件中。相反,你应该提供原始 CSS 文件,并引导用户自己编译 Tailwind CSS 文件。要完成此操作,它们可能只需要将你的 vendor 目录添加到他们的 tailwind.config.js
文件中:
export default {
content: [
'./resources/**/*.blade.php',
'./vendor/filament/**/*.blade.php',
'./vendor/danharrin/filament-blog/resources/views/**/*.blade.php', // Your plugin's vendor directory
],
// ...
}
这意味着,当编译这些 Tailwind CSS 文件时,就会包含所有插件视图中用到的样式类,同时也包含应用及 Filament 核心中使用的类。
不过,使用该技术,对于在后台面板中使用插件的用户,可能会额外的复杂度。如果他们使用的自定义主题,由于他们最终都要编译自己的 CSS 文件,这倒没什么;但是,如果他们使用面板自带的默认样式,你需要留意你插件视图中使用的样式类。比如,如果你使用了一个默认样式表中没有包含的类,用户也没有自己编译,它就不会包含在最终的 CSS 文件中。这意味着你的插件视图可能不会如你期望的那样展示。这是我推荐在插件中编译及注册 Tailwind CSS 编译后样式表的情形之一。
CSS 懒加载
默认情况下,所有使用资源系统注册的 CSS 文件,在每个 Filament 页面的 <head>
中加载。这是加载 CSS 文件最简单的方式,不过有时候这些资源太大且不是每个页面都需要。这种情况下,你可以利用与 Filament 捆绑的 Alpine.js 的懒加载资源。前提非常简单,您可以在元素上使用 x-load-css
指令,当该元素加载到页面上时,指定的css文件将加载到页面的 <head>
中。这非常适合需要 CSS 文件的小型 UI 元素和整个页面:
<div
x-data="{}"
x-load-css="[@js(\Filament\Support\Facades\FilamentAsset::getStyleHref('custom-stylesheet'))]"
>
<!-- ... -->
</div>
为防止 CSS 文件被自动加载,可以使用 loadedOnRequest()
方法:
use Filament\Support\Assets\Css;
use Filament\Support\Facades\FilamentAsset;
FilamentAsset::register([
Css::make('custom-stylesheet', __DIR__ . '/../../resources/css/custom.css')->loadedOnRequest(),
]);
如果 CSS 文件被注册到插件,你必须将插件包传入作为 FilamentAsset::getStyleHref()
方法的第二个参数。
<div
x-data="{}"
x-load-css="[@js(\Filament\Support\Facades\FilamentAsset::getStyleHref('custom-stylesheet', package: 'danharrin/filament-blog'))]"
>
<!-- ... -->
</div>
使用 URL 注册 CSS 文件
如果你想使用 URL 注册 CSS 文件,也是可行的。这些资源会像平常那样在每个页面中加载,不过运行 php artisan filament:assets
命令时,不会被复制到 /public
目录中。
这对于从 CDN 中注册外部样式表或已经直接编译到 /public
目录的样式表很有用:
use Filament\Support\Assets\Css;
use Filament\Support\Facades\FilamentAsset;
FilamentAsset::register([
Css::make('example-external-stylesheet', 'https://example.com/external.css'),
Css::make('example-local-stylesheet', asset('css/local.css')),
]);