场景需求:
Filament
官方默认账号是 email 邮箱,我想自定义 username 作为账号进行登录。
修改方法:
1、重写Login.php
输入命令,创建 login.php
文件:
php artisan make:filament-page Auth\Login
找到根目录下的 vendor\filament\filament\src\Pages\Auth\Login.php
文件,并且将里面的内容复制到上门创建的文件内。
2、举个例子
我这边是将 email
修改为了 username
,如果需要修改为其他字段名,根据如下代码自行修改即可:
php
<?php
namespace App\Filament\Pages\Auth;
use DanHarrin\LivewireRateLimiting\Exceptions\TooManyRequestsException;
use DanHarrin\LivewireRateLimiting\WithRateLimiting;
use Filament\Actions\Action;
use Filament\Actions\ActionGroup;
use Filament\Facades\Filament;
use Filament\Forms\Components\Checkbox;
use Filament\Forms\Components\Component;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Form;
use Filament\Http\Responses\Auth\Contracts\LoginResponse;
use Filament\Models\Contracts\FilamentUser;
use Filament\Notifications\Notification;
use Filament\Pages\Concerns\InteractsWithFormActions;
use Filament\Pages\SimplePage;
use Illuminate\Contracts\Support\Htmlable;
use Illuminate\Support\Facades\Blade;
use Illuminate\Support\HtmlString;
use Illuminate\Validation\ValidationException;
/**
* @property Form $form
*/
class Login extends SimplePage
{
use InteractsWithFormActions;
use WithRateLimiting;
/**
* @var view-string
*/
protected static string $view = 'filament-panels::pages.auth.login';
/**
* @var array<string, mixed> | null
*/
public ?array $data = [];
public function mount(): void
{
if (Filament::auth()->check()) {
redirect()->intended(Filament::getUrl());
}
$this->form->fill();
}
public function authenticate(): ?LoginResponse
{
try {
$this->rateLimit(5);
} catch (TooManyRequestsException $exception) {
Notification::make()
->title(__('filament-panels::pages/auth/login.notifications.throttled.title', [
'seconds' => $exception->secondsUntilAvailable,
'minutes' => ceil($exception->secondsUntilAvailable / 60),
]))
->body(array_key_exists('body', __('filament-panels::pages/auth/login.notifications.throttled') ?: []) ? __('filament-panels::pages/auth/login.notifications.throttled.body', [
'seconds' => $exception->secondsUntilAvailable,
'minutes' => ceil($exception->secondsUntilAvailable / 60),
]) : null)
->danger()
->send();
return null;
}
$data = $this->form->getState();
if (! Filament::auth()->attempt($this->getCredentialsFromFormData($data), $data['remember'] ?? false)) {
$this->throwFailureValidationException();
}
$user = Filament::auth()->user();
if (
($user instanceof FilamentUser) &&
(! $user->canAccessPanel(Filament::getCurrentPanel()))
) {
Filament::auth()->logout();
$this->throwFailureValidationException();
}
session()->regenerate();
return app(LoginResponse::class);
}
protected function throwFailureValidationException(): never
{
throw ValidationException::withMessages([
'data.username' => __('filament-panels::pages/auth/login.messages.failed'),
]);
}
public function form(Form $form): Form
{
return $form
->schema([
TextInput::make('username')
->label('用户名')
->required()
->maxLength(255),
$this->getPasswordFormComponent(),
$this->getRememberFormComponent(),
])
->statePath('data');
}
/**
* @return array<int | string, string | Form>
*/
protected function getForms(): array
{
return [
'form' => $this->form(
$this->makeForm()
->schema([
$this->getPasswordFormComponent(),
$this->getRememberFormComponent(),
])
->statePath('data'),
),
];
}
protected function getPasswordFormComponent(): Component
{
return TextInput::make('password')
->label(__('filament-panels::pages/auth/login.form.password.label'))
->hint(filament()->hasPasswordReset() ? new HtmlString(Blade::render('<x-filament::link :href="filament()->getRequestPasswordResetUrl()"> {{ __(\'filament-panels::pages/auth/login.actions.request_password_reset.label\') }}</x-filament::link>')) : null)
->password()
->revealable(filament()->arePasswordsRevealable())
->autocomplete('current-password')
->required()
->extraInputAttributes(['tabindex' => 2]);
}
protected function getRememberFormComponent(): Component
{
return Checkbox::make('remember')
->label(__('filament-panels::pages/auth/login.form.remember.label'));
}
public function registerAction(): Action
{
return Action::make('register')
->link()
->label(__('filament-panels::pages/auth/login.actions.register.label'))
->url(filament()->getRegistrationUrl());
}
public function getTitle(): string | Htmlable
{
return __('filament-panels::pages/auth/login.title');
}
public function getHeading(): string | Htmlable
{
return __('filament-panels::pages/auth/login.heading');
}
/**
* @return array<Action | ActionGroup>
*/
protected function getFormActions(): array
{
return [
$this->getAuthenticateFormAction(),
];
}
protected function getAuthenticateFormAction(): Action
{
return Action::make('authenticate')
->label(__('filament-panels::pages/auth/login.form.actions.authenticate.label'))
->submit('authenticate');
}
protected function hasFullWidthFormActions(): bool
{
return true;
}
/**
* @param array<string, mixed> $data
* @return array<string, mixed>
*/
protected function getCredentialsFromFormData(array $data): array
{
return [
'username' => $data['username'],
'password' => $data['password'],
];
}
}
效果如下图: