Laravelで入力値の整形・加工を行う方法(アクセサ・ミューテタ)
先生と生徒の会話形式で理解しよう
生徒
「Laravelでフォームに入力した文字を自動で加工したり整形したりすることはできますか?」
先生
「はい、できます。Laravelではアクセサとミューテタという仕組みを使うと、データを保存する前や取得するときに自動で加工できます。」
生徒
「アクセサやミューテタって何ですか?少し難しそうです。」
先生
「アクセサはデータを取り出すときに加工する機能で、ミューテタはデータを保存するときに加工する機能です。例えば、名前の最初の文字を大文字にしたり、不要なスペースを削除したりできます。」
1. ミューテタで入力値を保存時に整形する
ミューテタはモデル内でsetXXXAttributeというメソッドを定義します。例えば、名前を保存する際に自動で先頭大文字にする例です。
class User extends Model
{
public function setNameAttribute($value)
{
// 先頭を大文字に変換して保存
$this->attributes['name'] = ucfirst($value);
}
}
この例では、フォームで「taro」と入力しても、データベースには「Taro」と保存されます。
2. アクセサで取得時に加工する
アクセサはデータを取り出すときに加工できます。getXXXAttributeメソッドを使います。
class User extends Model
{
public function getNameAttribute($value)
{
// 常に大文字で表示
return strtoupper($value);
}
}
これにより、データベースには「Taro」と保存されていても、取り出すと「TARO」と表示されます。
3. 実際のフォームと組み合わせる例
Bladeテンプレートでフォームを作り、入力した名前をミューテタで整形して保存し、アクセサで表示するとこうなります。
<form method="POST" action="{{ route('user.store') }}">
@csrf
<input type="text" name="name" class="form-control" placeholder="名前を入力">
<button type="submit" class="btn btn-primary mt-2">送信</button>
</form>
public function store(Request $request)
{
$user = new User();
$user->name = $request->name; // ミューテタで自動整形される
$user->save();
return view('user.show', ['user' => $user]); // アクセサで表示加工
}
<p>入力された名前: {{ $user->name }}</p>
例えば「hanako」と入力すると、データベースには「Hanako」と保存され、画面には「HANAKO」と表示されます。
4. アクセサ・ミューテタのメリット
- フォーム入力値を自動で整形できるため、毎回同じ処理を書く必要がない
- データベースに保存される値と表示される値を分けて管理できる
- バリデーション後に安全に加工して保存できる
- 名前の整形やメールアドレスの小文字化など、日常的なフォーム処理に便利
- モデル単位で定義するのでコードがすっきりし、保守性も高い