라라벨 filament, User 리소스 생성 및 비밀번호 조건부 필수 설정

포스트 썸네일 이미지

라라벨 filament 관리자 패널을 구축할 때 웹사이트 회원 관리를 위해 User 리소스를 구성하는 것은 필수다.

이번 포스트에서는 User 리소스를 생성하고, 회원 정보 수정 시에는 비밀번호를 입력하지 않도록 조건부 필수 필드를 설정하는 방법을 다뤄보겠다.




이전 포스트




전체적인 코드 수정은 이 깃허브 링크를 통해서 확인할 수 있다.




filament User 리소스 생성


웹사이트 회원 관리를 위해 filament User 리소스를 만들어야 한다.

이다음에 회원에게 역할Role을 부여하는 기능을 구현하려고 하는데, 이것을 위해서도 User 리소스가 필요하다.




make bash #컨테이너 안으로 들어간다.
php artisan make:filament-resource User --generate

ubuntu 혹은 VSCode의 터미널에서 이 명령어들을 실행한다.




What is the title attribute for this model?

데이터를 대표하는 대표 컬럼(필드명)이 무엇인지 묻는 이 질문에는 userid를 입력한다.

나와 DB 테이블을 다르게 설계했다면, 물론 다른 컬럼이 될 수도 있다.




Would you like to generate a read-only view page for the resource?

여기서는 No를 선택하자.




filament 리소스를 생성할 때 뜨는 위의 질문들에 대해서는 이 포스트에서 자세하게 정리를 했었으니, 필요하다면 참고하자.





테이블에 ID 추가 및 폼 필드를 섹션으로 그룹화


app/Filament/Resources/Users/Tables/UsersTable.php

TextColumn::make('id'),

이 한 줄을 추가했다.

테이블에 ID가 표시되도록 한 것이다.




app/Filament/Resources/Users/Schemas/UserForm.php

public static function configure(Schema $schema): Schema
{
    return $schema
        ->components([
            Section::make('User')
                ->schema([
                    TextInput::make('userid')
                        ->required()
                        ->unique(),
                    TextInput::make('nickname')
                        ->required()
                        ->unique(),
                    TextInput::make('email')
                        ->label('Email address')
                        ->email()
                        ->required()
                        ->unique(),
                    DateTimePicker::make('email_verified_at'),
                    TextInput::make('photo_path')
                        ->default(null),
                    TextInput::make('password')
                        ->password()
                        ->required(),
                ])->columns(2)
                ->columnSpanFull()
        ]);
}

기존의 코드들을 Section::make('User')->schema([ ... ]) 안으로 넣었다.

그리고 중복된 데이터가 들어갈 수 없는 컬럼들에 ->unique()도 추가했다.




코드들에 대한 설명은 이미 이 포스트들에서 했었기 때문에 더 이상의 설명은 생략하겠다.





비밀번호 필드를 새 User를 생성할 때만 필수로 지정


비밀번호 필드를 비워두고 저장 버튼을 누르면 비밀번호를 입력하라고 뜬다

현재의 관리자 패널의 회원 정보 수정 페이지다.

현재는 딱히 관리자가 회원 정보를 수정할 것이 없다.

다시 말하지만, 다음에 회원에게 역할을 부여하는 기능을 구현할 예정이다.

지금 이미 그런 기능이 구현되어 있다고 가정해 보자.


이 캡처 이미지는 관리자가 특정 회원에게 어떤 특별한 역할을 부여한 다음에 저장을 하려고 하는데, 이렇게 비밀번호 입력 필드에서 강제로 비밀번호를 바꾸라고 뜨면서 저장을 할 수 없게 하고 있는 상황이다.

이 비밀번호 입력 필드를, 계정을 생성할 경우에는 반드시 입력해야 하지만 수정할 경우에는 입력하지 않아도 되도록 수정해 보려고 한다.




app/Filament/Resources/Users/Schemas/UserForm.php

TextInput::make('password')
    ->password()
    ->required(fn (string $operation): bool => $operation === 'create')
    ->dehydrated(fn (?string $state) => filled($state)),

password 컬럼에 있던 ->required()를 이렇게 수정했다.


  • ->required(fn (string $operation): bool => $operation === 'create'): 언제 이 입력 필드를 필수Required 값으로 할 것인지 결정한다. filament에서 현재 사용자가 폼에 들어왔을 때 $operation이라는 변수에 작업 상태를 자동으로 주입한다. 생성 페이지인 경우($operation = 'create')에는 true가 반환되어 비밀번호를 입력하지 않으면 유효성 검사(Validation)에서 에러를 띄우고 저장을 막고, 수정 페이지인 경우에는 false가 반환되어 비밀번호 폼을 빈칸으로 비워두어도 유효성 검사를 통과하게 된다.
  • ->dehydrated(fn (?string $state) => filled($state)): 현재 폼의 값을 데이터베이스 저장 대상(SQL UPDATE 쿼리)에 포함할 것인지 결정한다. 디하이드레이트Dehydrate는 폼에 입력된 값을 DB로 전송하기 위해 추출하는 과정이다. 기본값은 true(무조건 DB 저장 대상에 포함)이다. 사용자가 비밀번호 입력창에 텍스트 값을 입력하면 $state에 문자열이 들어 있으니 filled($state)는 true가 돼서 Dehydrate 프로세스가 실행되어 새로운 비밀번호가 DB에 업데이트된다.


뭔가 설명이 복잡하지만, 어쨌든 이제는 비밀번호 입력 필드를 비워둔 상태로 저장 버튼을 클릭해도 회원의 정보를 변경할 수 있다.




어차피 관리자가 함부로 회원의 정보를 이것저것 수정해서는 안되고, 기껏해야 회원에게 역할을 부여할 때만 이 수정 페이지를 사용하게 될 거다.




다음 포스트

이 글이 도움이 됐거나 유익했다면 스크롤을 조금만 더 내려서 댓글을 남겨주세요. (비로그인도 가능합니다!)
응원이나 피드백이 담긴 댓글은 제가 계속 블로그를 해나갈 수 있는 원동력이 됩니다. 😊

지인에게 보여주고 싶은 글이었다면 URL을 복사해서 메신저나 소셜 미디어에 공유해 주세요.
이전 포스트 다음 포스트

댓글 쓰기

0 Comments

문의하기 양식