라라벨 filament, 회원가입 시 자동 역할 부여 및 랜덤 계정 생성 기능 구현

포스트 썸네일 이미지

이번 포스트에서는 다음의 세 가지 작업들을 해보려고 한다.


  1. 방문자가 회원 가입을 하면 자동으로 user 역할Role 부여하기
  2. filament 관리자 패널에서 '만들기'라고 쓰여있는 버튼의 텍스트 수정하기
  3. 버튼 하나만 클릭하면 랜덤으로 새 계정 만들기


뭔가 많은 것들을 하는 것 같지만, 수정하거나 추가되는 코드의 양은 그렇게 많지는 않다.




이전 포스트




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




회원 가입하면 자동으로 user 역할 부여하기


2달 전에 작성한 이 포스트에서 'admin', 'moderator', 'user', 'banned' 이렇게 네 가지 역할Role을 만들었었다.

여기서 새로 가입한 계정에 기본적으로 부여해야 할 역할은 'user'다.


아직은 새 계정이 생성되어도 역할이 비어있게 되어 있는데, 이제 회원 가입을 하면 자동으로 user 역할을 부여하도록 만들어보겠다.

작업을 하기 전에 데이터베이스의 roles 테이블에 미리 'user'라는 이름의 역할 데이터가 등록되어 있어야 한다. (링크한 포스트를 참고하자.)




resources/views/livewire/pages/auth/register.blade.php의 수정 전 코드

event(new Registered($user = User::create($validated)));

register.blade.php의 수정 전 코드다.

이 부분을 아래와 같이 수정할 거다.





resources/views/livewire/pages/auth/register.blade.php의 수정 후 코드

$user = User::create($validated);
$user->assignRole('user');
event(new Registered($user));

자세히 보면 첫 번째와 세 번째 줄의 코드는 위에서 보여준 수정하기 전의 원래 코드를 두 줄로 나눈 것이다.


그 사이에 $user->assignRole('user');를 추가했다.

이 코드는 라라벨 기본 기능이 아니라 SPATIE Laravel Permission 패키지가 제공하는 메서드인데, 사용자에게 'user'라는 역할을 부여하는 명령이다.


수정 전 코드는 유저 생성과 이벤트 발생이 한 줄로 묶여 있었다.

이 상태에서 바로 assignRole()을 호출할 수 없기 때문에,

  1. 유저 객체를 먼저 변수에 담고,
  2. 새로 추가한 코드로 역할을 부여한 뒤,
  3. 회원가입 완료 이벤트를 발생.

이런 순서로 분리한 것이다.




새로 가입한 회원에게 자동으로 user 역할이 부여됐다

실제 방문자가 회원 가입을 하는 것처럼 웹사이트 첫 화면의 '회원가입' 메뉴를 통해 계정을 만들었다.

캡처 이미지에 보이는 것처럼 이제는 새로 가입하는 계정에 처음부터 user 역할이 주어진다.





filament '만들기' 버튼 텍스트 수정


위에 올린 캡처 이미지를 보면 '만들기'라는 버튼이 보인다.

'만들기'로도 의미는 통하니 상관은 없지만, 직관적으로 만들고 싶다.

버튼의 텍스트를 '계정 생성'으로 바꿔보겠다.




app/Filament/Resources/Users/Pages/ListUsers.php

CreateAction::make()
    ->label('계정 생성'),

filament 관리자 패널의 User 메뉴에 있는 '만들기' 버튼은 여기서 생겨난 것이었다.

여기에 ->label('...')을 달아서 버튼의 텍스트(라벨)를 바꿀 수 있다.


이어서 만들 '랜덤으로 새 User 만들기 기능'을 구현하면 사실상 거의 안 쓸 것 같은 버튼이다.

여기서는 그냥 이런 방법으로 버튼의 텍스트를 바꿀 수 있다는 것을 보여주기 위해서 일단 놔둬보았다.




랜덤으로 새 User 만들기 기능 구현


app/Filament/Resources/Users/Pages/ListUsers.php

Action::make('create_random_user')
    ->label('랜덤 계정 생성')
    ->action(function () {
        User::factory()->create([
            'remember_token' => null,
        ])->assignRole('user');
    }),

이 코드로 '계정 생성' 버튼 옆에 '랜덤 계정 생성' 버튼이 만들어졌다.

코드에 대한 설명은 다음과 같다. (위에서 이미 설명했던 코드들은 생략하겠다.)


  • Action::make('create_random_user'): 버튼의 고유 식별자(ID)를 지정하며 커스텀 액션을 생성한다. 'create_random_user'는 액션의 식별자 역할을 하며, 반드시 유니크한 값이어야 한다. 이 메서드의 인자는 액션을 고유하게 식별하는 키(key) 역할을 하기 때문에 이 값이 없으면 filament가 액션을 구분할 수 없어 오류가 발생한다. 따라서, 액션의 이름 또는 식별자로 쓰일 문자열을 넣어주는 것이 필수다.
  • ->action(function () { ... }): 버튼을 클릭했을 때 실행되는 콜백 함수를 정의하는 부분이다. 이 함수는 사용자가 버튼을 클릭하면 실행된다.
  • User::factory()->create([ ... ]): Eloquent 모델의 팩토리 메서드를 사용하여 새로운 계정(User)을 생성한다. 이전에 UserFactory.php에 미리 정의해둔 무작위 이름, 이메일, 비밀번호 등의 패턴에 따라 랜덤으로 계정이 생성된다.
  • 'remember_token' => null: 생성된 유저 객체의 remember_token 필드를 null로 설정한다.





버튼이 텍스트가 변경됐고, 랜덤 계정 생성 버튼도 생겼다

이렇게 '만들기' 버튼이 '계정 생성' 버튼으로 텍스트가 변경되었고, 그 옆에 '랜덤 계정 생성' 버튼이 생겼다.




랜덤 계정 생성 버튼으로 만들어진 계정

'랜덤 계정 생성' 버튼을 클릭해 보았다.

단 한 번의 클릭으로 바로 계정이 생성됐다.




이제는 이렇게 버튼을 한 번만 클릭하면 라라벨 팩토리를 통해 무작위 유저를 DB에 만들고, 곧바로 user 역할까지 부여하게 된다.

테스트 환경에서 매번 폼 필드를 일일이 채워 회원가입을 테스트하기 번거로울 때, 이런 버튼을 추가해 두면 클릭할 때마다 더미 데이터가 빠르게 쌓여 매우 유용하다.




다음 포스트

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

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

댓글 쓰기

0 Comments

문의하기 양식