Model
やること###
$fillableを記述する。
User.php
protected $fillable = [
'name',
'email',
'password',
'avatar_file_name',// ⬅追加(画像のパス名カラム)
];
前知識として
Eloquentモデルにおけるfillable属性
ホワイトリストのこと。
指定したカラムのみが、Modelに持たせることができる。
見れば分かる$fillableの機能⬇
.php
protected $fillable = ['title', 'body'];
$book = new Book([
'name' => 'Soseki Natsume',
'title' => '猫',
'body' => '吾輩は猫である',
'published' => '1990'
]);
$book->getAttributes();
['name' => 'Soseki Natsume', 'title' => '猫',]
$bookには$fillableで指定したカラム以外は入っていないことが分かる。
使い所
.php
//この一文でfillabeに指定しているカラムは全て格納される。
//idなどは、書かなくてよいはず
Book::create($request->all());
参考
属性 | 機能 | 説明 |
---|---|---|
$guard | ブラックリスト | 禁止したもの以外は入れる。 |
$fillable | ホワイトリスト | 許可したもの以外は入れない。 |
View
やること###
formタグに、enctype="multipart/form-data"を追加する。
(form要素で enctype属性の値を"multipart/form-data"にする。)
ただのURLエンコード➡マルチパート(メディア送信に対応)
register_blade.php
<form method="POST" action="{{ route('register') }}" enctype="multipart/form-data">
@csrf
前知識として
form要素は、enctype属性を指定できる。
enctype属性で、送信時のMIMEタイプを指定できる。
MIMEタイプ=メディアタイプ
Multipurpose Internet Mail Extensions
文書、ファイル、またはバイト列の性質や形式を示す標準
値 | 概要 |
---|---|
application/x-www-form-urlencoded | URLエンコード (デフォルト) |
multipart/form-data | マルチパート |
URLエンコード:(あ → %E3%81%82)
Controller
やること###
使用するクラスを増やす。
RegisterController.php
:
:
use Illuminate\Http\File;
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\Storage;
use Intervention\Image\Facades\Image;
:
:
画像保存用のメソッドを追加する。
RegisterController.php
private function saveAvatar(UploadedFile $file): string
{
$tempPath = $this->makeTempPath();
Image::make($file)->fit(200, 200)->save($tempPath);
$filePath = Storage::disk('public')
->putFile('avatars', new File($tempPath));
return basename($filePath);
}
private function makeTempPath(): string
{
$tmp_fp = tmpfile();
$meta = stream_get_meta_data($tmp_fp);
return $meta["uri"];
}
バリデーターを追記する。
RegisterController.php
return Validator::make($data, [
'name' => ['required', 'string', 'max:255'],
'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
'password' => ['required', 'string', 'min:8', 'confirmed'],
'introduction' =>['required', 'string', 'max:255'],
'avatar' => ['required', 'image'],
]);
createアクション内に画像保存の処理を追加する。
RegisterController.php
protected function create(array $data)
{
$fileName = $this->saveAvatar($data['avatar']); //⬅privateで定義したメソッド呼び出し
return User::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => Hash::make($data['password']),
'avatar_file_name' => $fileName, //⬅カラムに画像名追加
]);
}