环境:php8.3 laravel12 filament4.5
接下来我想从0开始搭建上面说的laravel12+filament 构建一个带用户注册登录功能 带rbac权限的文章知识库网站 请你一步一步的教我如何做
从 0 开始构建一个基于 Laravel 12 和 Filament v4.5 的文章站。我们按照“安装 -> 基础配置 -> 权限系统 (RBAC) -> 核心功能”的顺序进行。
第一步:初始化 Laravel 12 项目
打开你的终端,执行以下命令创建一个全新的 Laravel 12 项目:
1composer create-project laravel/laravel:^12.0 article-base2cd article-base配置 .env 文件中的数据库(Laravel 12 默认使用 SQLite,非常适合快速开发;如果你想用 MySQL,请修改 DB_CONNECTION)。
使用SQLite的话,要注意开启PHP扩展:pdo_sqlite,sqlite3
Filament 4 需要开启PHP扩展:intl,fileinfo,gd
改中文
.env 文件中
1APP_LOCALE=zh_CN下载中文语言包
1composer require laravel-lang/common --dev2php artisan lang:update时区
1'timezone' => 'Asia/Shanghai',第二步:安装并配置 Filament v4
我们将安装 Filament 并创建一个“管理后台”面板。
1# 安装 Filament 核心2composer require filament/filament:"^4.0" -W3
4# 安装面板功能5php artisan filament:install --panels执行命令后,它会询问面板 ID,直接按回车(默认为 admin)。
可选项:配置文件导出,以供修改 config/filament.php
1php artisan vendor:publish --tag=filament-config开启注册功能
打开 app/Providers/Filament/AdminPanelProvider.php,在 panel() 方法中链式调用 registration():
1public function panel(Panel $panel): Panel2{3 return $panel4 ->default()5 ->id('admin')6 ->path('admin')7 ->login()8 ->registration() // 开启用户注册9 ->passwordReset()10 ->emailVerification()11 ->profile();12}预览效果:
1php artisan serve没用户的话可以通过如下命令创建:
1php artisan make:filament-user第三步:构建 RBAC 权限系统 (使用 Filament Shield)
在 Filament 生态中,最快、最强大的权限管理方式是使用 Filament Shield 插件,它基于经典的 spatie/laravel-permission。
1# 安装插件2composer require bezhansalleh/filament-shield3
4# 运行安装向导5php artisan shield:install6
7# 可能需要手动运行迁移8php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"9php artisan migrateconfig/filament-shield.php 不是必须,需要修改再生成
1php artisan vendor:publish --tag="filament-shield-config"1return [2 // ...3 'auth_provider_model' => 'App\\Models\\User',4 // ...5];安装过程中会引导你生成基础权限。安装完成后,你需要:
1.在 User 模型中引入 Trait:use HasRoles;。
1<?php2
3namespace App\Models;4
5// 1. 引入必要的类6use Spatie\Permission\Traits\HasRoles;7use Filament\Models\Contracts\FilamentUser;8use Filament\Panel;9use Illuminate\Foundation\Auth\User as Authenticatable;10// ... 其他引入11
12class User extends Authenticatable implements FilamentUser // 2. 实现接口(为了安全访问控制)13{14 // 3. 在类内部使用 Trait14 collapsed lines
15 use HasRoles;16
17 /**18 * 4. 必须实现这个方法来决定谁能进入 Filament 面板19 */20 public function canAccessPanel(Panel $panel): bool21 {22 // 在开发阶段,你可以简单地返回 true 让所有人都能进去23 // 之后你可以限制为只有拥有特定角色(如 super_admin)的人才能进24 return true;25 }26
27 // ... 其他模型代码28}2.在 AdminPanelProvider.php 中注册插件:
1->plugin(\BezhanSalleh\FilamentShield\FilamentShieldPlugin::make())3.初始化角色
引入 Trait 后,你的数据库里还没有任何角色。请执行以下命令来生成默认的“超级管理员”角色和权限:
1# 生成并同步所有权限2php artisan shield:generate --all3
4# 将自己设为超级管理员 (根据你之前创建用户的邮箱)5php artisan shield:super-admin --user=1若刷新后台没有 roles 菜单,则
1php artisan filament:cache-components2# 或者简单粗暴地清理所有缓存3php artisan view:clear4php artisan cache:clear5
6# 或者 确保权限生成完整7php artisan shield:generate --all第四步:创建“文章”核心逻辑
我们需要创建文章分类(Category)和文章(Article)模型。
1# 创建模型和迁移2php artisan make:model Category -m3php artisan make:model Article -m数据库迁移示例 (Article)
在 database/migrations/..._create_articles_table.php 中:
1Schema::create('articles', function (Blueprint $table) {2 $table->id();3 $table->foreignId('category_id')->constrained();4 $table->string('title');5 $table->text('content');6 $table->boolean('is_published')->default(false);7 $table->timestamps();8});运行迁移:php artisan migrate。
第五步:生成 Filament 管理界面
现在利用 Filament 的命令一键生成 CRUD 界面:
1php artisan make:filament-resource Category --generate2php artisan make:filament-resource Article --generate为 Resource 绑定权限
运行以下命令,Filament Shield 会自动为你的 Article 和 Category 生成对应的权限策略(Policies):
1php artisan shield:generate --all2php artisan filament:cache-components现在,你可以在后台的 Roles 界面里,勾选哪些角色可以“创建文章”或“删除分类”了。
修改菜单栏中的文字为中文
1protected static ?string $navigationLabel = '文章'; // 导航侧栏名称2protected static ?string $modelLabel = '文章';3protected static ?string $pluralModelLabel = '文章'; // 复数名称4
5protected static ?int $navigationSort = 3; // 导航栏中的排序6
7use UnitEnum;8protected static string | UnitEnum | null $navigationGroup = 'Articles'; // 分组导航项更多见 https://filamentphp.com/docs/4.x/navigation/overview
修改表单字段标签
在 form() 方法里,给每个组件加上 label():
1// app/Filament/Resources/Articles/Tables/ArticlesTable.php2TextInput::make('title')3 ->label('标题') // 👈 这样前台就会显示“标题”而不是“Title”内容在另外一个 一对一关联表 的情况
1use Filament\Forms\Components\RichEditor;2use Filament\Schemas\Components\Group;3# 与上面的TextInput平级 添加下面内容4Group::make()5 ->columnSpanFull()6 ->relationship('content')7 ->schema([8 RichEditor::make('content')9 ->required()10 ->label('内容')11 ])富文本编辑器图片上传目录,修改上面的RichEditor
1 RichEditor::make('content')2 ->required()3 ->label('内容')4 ->fileAttachmentsDisk('public') // 指定使用 public 磁盘5 ->fileAttachmentsDirectory('article_content') // 图片存放的子目录6 ->fileAttachmentsVisibility('public') // 确保权限是公开的这里需要软链接,因为实际的上传目录是 storage/app/public
1php artisan storage:link.env文件,确保上传后的图片可以访问
1APP_URL=http://127.0.0.1:8000 # 👈 必须与你浏览器访问的地址完全一致不使用软链接的方式,直接存到public目录中
1'disks' => [2 // ... 其他磁盘3
4 'admin_public' => [5 'driver' => 'local',6 'root' => public_path('uploads'), // 👈 文件将直接存在 public/uploads 目录下7 'url' => env('APP_URL').'/uploads', // 👈 浏览器访问的 URL 前缀8 'visibility' => 'public',9 'throw' => false,10 ],11],1use Filament\Forms\Components\RichEditor;2
3RichEditor::make('content')4 ->label('文章内容')5 ->fileAttachmentsDisk('admin_public') // 👈 使用自定义的磁盘6 ->fileAttachmentsDirectory('articles') // 图片会存在 public/uploads/articles7 ->fileAttachmentsVisibility('public')第六步:实现前台展示
虽然你可以给前台也开一个 Filament Panel,但对于知识库,通常建议用简单的 Blade + Tailwind 做一个清爽的首页。
- 创建控制器:
php artisan make:controller ArticleController - 在路由中定义:
Route::get('/', [ArticleController::class, 'index']); - 在 Blade 中展示: 使用简单的循环展示文章。由于是 Laravel 12,你可以直接利用内置的 Vite 编译 Tailwind 样式。