🦔
laravel12 starter kit(react)のavatar画像の扱い
要するにこのTU
これはどうなっているのかってことで。
当該
resources/js/components/user-menu-content.tsxとかの中の
<UserInfo user={user} showEmail={true} />
この部分に仕掛けがある。つまり resources/js/components/user-info.tsx を見る
import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar'
ここから理解可能できるのはまたしてもshadcn/ui
であるということである。
で
<Avatar className="h-8 w-8 overflow-hidden rounded-full">
<AvatarImage src={user.avatar} alt={user.name} />
<AvatarFallback className="rounded-lg bg-neutral-200 text-black dark:bg-neutral-700 dark:text-white">{getInitials(user.name)}</AvatarFallback>
</Avatar>
このように仕掛けられている
つまり、user.avatar
が無いと基本的にAvatarFallback
に落下すると思えばよい。
ではavatarをlaravel12で管理するにはどうすればよいだろうか
一番ベタなのはavatarカラムを作り挿入することだ
database/migrations/0001_01_01_000000_create_users_table.php
@@ -17,6 +17,7 @@ public function up(): void
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
+ $table->string('avatar')->nullable();
$table->rememberToken();
$table->timestamps();
});
たとえば外部サービスを使うとして
https://i.pravatar.cc/300?u=test@example.com
的なのをseedしてみよう
database/seeders/DatabaseSeeder.php
@@ -18,6 +18,7 @@ public function run(): void
User::factory()->create([
'name' => 'Test User',
'email' => 'test@example.com',
+ 'avatar' => 'https://i.pravatar.cc/300?u=test@example.com',
]);
}
}
これでseedするとavatarに適当な画像のurlが入る
= App\Models\User {#6228
id: 1,
name: "Test User",
email: "test@example.com",
email_verified_at: "2025-05-08 04:45:47",
#password: "$2y$12$hwDVE4Xg/6CNJ5B98wOzT.tUnQ9RAulXLfnYQY6MeBO4laLvrwnnC",
avatar: "https://i.pravatar.cc/300?u=test@example.com",
#remember_token: "vQcba4ROwn",
created_at: "2025-05-08 04:45:48",
updated_at: "2025-05-08 04:45:48",
}
アクセスすると
shadcn/ui
がそれっぽくモダンな表示にしてくれるってわけ
これは非常に便利なのだが
avatarのuploadをしようと思うといきなりurlをつっこむという構造は地味に厄介かも。routeが変わったりするとurlあるいはpathを再生成しないといけないしメンテナンス性が非常に微妙だ。従って基本的にはユーザー情報を組み立て直してavatarにurlを生成してつっこんで上げるという手法になるのではなかろうか。
このあたりのavatar生成の組み立てに関して次回からシリーズでちょっと書いていく、つもり、多分。
avatar構造の話は長くなると読み辛いからここまで。ではまた。
Discussion