Loading repository data…
Loading repository data…
joseeverton / repository
Exemplo de uso do Filament no Laravel para criação rápida de CRUDs
A transparent discovery signal based on current public GitHub metadata.
This score does not audit code, security, maintainers, documentation quality, or suitability. Verify the repository and its current documentation before adoption.
Exemplo de uso do Filament no Laravel para criação rápida de CRUDs, relacionamentos e permissões.
Este repositório foi criado para a palestra "Filament: o atalho para CRUDs poderosos no Laravel" apresentada por José Everton da Silva Fontenele no PHPeste 2025.
git clone https://github.com/joseeverton/phpest2025-filament-demo.git
cd filament-demo
composer install
cp .env.example .env
php artisan key:generate
Configure o banco de dados no .env e rode:
php artisan migrate
composer require filament/filament
php artisan filament:install --panels
php artisan make:filament-user
php artisan make:model Category -m
Schema::create('categories', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->timestamps();
});
php artisan make:model Post -m
Schema::create('posts', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->text('content');
$table->string('image')->nullable();
$table->foreignId('category_id')->constrained()->cascadeOnDelete();
$table->timestamps();
});
php artisan migrate
php artisan make:filament-resource Category
public static function form(Form $form): Form
{
return $form
->schema([
TextInput::make('name')->required()->maxLength(255),
]);
}
public static function table(Table $table): Table
{
return $table
->columns([
TextColumn::make('id')->sortable(),
TextColumn::make('name')->searchable()->sortable(),
TextColumn::make('created_at')->dateTime()->sortable(),
])
->filters([
//
])
->actions([
Tables\Actions\EditAction::make(),
])
->bulkActions([
Tables\Actions\DeleteBulkAction::make(),
]);
}
php artisan make:filament-resource Post
use Filament\Forms\Components\Select;
use Filament\Forms\Components\Textarea;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Components\FileUpload;
use Filament\Tables\Columns\ImageColumn;
public static function form(Form $form): Form
{
return $form
->schema([
TextInput::make('title')->required()->maxLength(255),
Textarea::make('content')->required(),
FileUpload::make('image')->image()->nullable(),
Select::make('category_id')
->relationship('category', 'name')
->required(),
]);
}
public static function table(Table $table): Table
{
return $table
->columns([
TextColumn::make('id')->sortable(),
TextColumn::make('title')->searchable()->sortable(),
ImageColumn::make('image')->rounded(),
TextColumn::make('category.name')->label('Category')->sortable()->searchable(),
TextColumn::make('created_at')->dateTime()->sortable(),
])
->filters([
//
])
->actions([
Tables\Actions\EditAction::make(),
])
->bulkActions([
Tables\Actions\DeleteBulkAction::make(),
]);
}
public function category()
{
return $this->belongsTo(Category::class);
}
public function posts()
{
return $this->hasMany(Post::class);
}
composer require spatie/laravel-permission
php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"
php artisan migrate
use Spatie\Permission\Traits\HasRoles;
class User extends Authenticatable
{
use HasRoles;
// ...
}
php artisan make:seeder RolesAndPermissionsSeeder
use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;
use Illuminate\Database\Seeder;
class RolesAndPermissionsSeeder extends Seeder
{
public function run()
{
// Reset cached roles and permissions
app()[\Spatie\Permission\PermissionRegistrar::class]->forgetCachedPermissions();
// create permissions
Permission::create(['name' => 'manage categories']);
Permission::create(['name' => 'manage posts']);
// create roles and assign existing permissions
$role = Role::create(['name' => 'admin']);
$role->givePermissionTo(Permission::all());
$role = Role::create(['name' => 'editor']);
$role->givePermissionTo('manage posts');
}
}
php artisan db:seed --class=RolesAndPermissionsSeeder
php artisan tinker
$user = \App\Models\User::find(1);
$user->assignRole('admin');
public static function canViewAny(): bool
{
return auth()->user()->can('manage categories');
}
public static function canViewAny(): bool
{
return auth()->user()->can('manage posts');
}
Acesse o painel administrativo em /admin e comece a gerenciar suas categorias e posts!