Filament
Use Filament to generate the admin panel.
sh
composer require filament/filament:"^3.0-stable" -W
php artisan filament:install --panels
User
php
<?php
namespace App\Models;
use Filament\Models\Contracts\FilamentUser;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable implements FilamentUser
{
public function canAccessPanel(\Filament\Panel $panel): bool
{
return str_ends_with($this->email, '@yourdomain.com') && $this->hasVerifiedEmail();
}
}
Default admin user
php
return [
'admin' => [
'email' => env('APP_ADMIN_EMAIL', 'superadmin@example.com'),
'password' => env('APP_ADMIN_PASSWORD', 'password'),
],
];
config/app.php
APP_ADMIN_EMAIL=superadmin@example.com
APP_ADMIN_PASSWORD=password
Add to seeders
sh
cat > database/seeders/EmptySeeder.php << EOF
<?php
namespace Database\Seeders;
use App\Models\User;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\Hash;
class EmptySeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run(): void
{
User::factory()->create([
'name' => 'Super Admin',
'email' => config('app.admin.email'),
'password' => Hash::make(config('app.admin.password')),
]);
}
}
EOF
php artisan db:seed --class=EmptySeeder
php
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
public function run(): void
{
$this->call([
EmptySeeder::class
]);
}
}
Update Admin panel
php
<?php
namespace App\Providers\Filament;
use Filament\Support\Colors\Color;
class AdminPanelProvider extends PanelProvider
{
public function panel(Panel $panel): Panel
{
return $panel
->default()
->id('admin')
->path('admin')
->favicon(config('app.url').'/favicon.svg')
->login()
->colors([
'primary' => Color::Purple,
])
->brandLogo(asset('favicon.svg'))
->brandName('Brand')
->brandLogoHeight('2.2rem')
->homeUrl('/')
->login(\App\Filament\Pages\Auth\LoginLogin::class) // to override default login page
->discoverResources(in: app_path('Filament/Resources'), for: 'App\\Filament\\Resources')
->discoverPages(in: app_path('Filament/Pages'), for: 'App\\Filament\\Pages')
->databaseNotifications()
->pages([
Pages\Dashboard::class,
])
->discoverWidgets(in: app_path('Filament/Widgets'), for: 'App\\Filament\\Widgets')
->widgets([
Widgets\AccountWidget::class,
Widgets\InfoWidget::class,
])
}
}
Create Login page
sh
```sh
mkdir -p app/Filament/Pages/Auth
cat > app/Filament/Pages/Auth/Login.php << EOF
<?php
namespace App\Filament\Pages\Auth;
use Filament\Pages\Auth\Login as BasePage;
class Login extends BasePage
{
public function mount(): void
{
parent::mount();
\$this->form->fill([
'email' => config('app.admin.email'),
'password' => config('app.admin.password'),
'remember' => true,
]);
}
}
EOF