Я пытаюсь выполнить регистрацию с загрузкой изображения профиля пользователя (я вынужден сделать это таким образом) Я создал миграцию так:
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
$table->string('nom');
$table->string('prenom');
$table->string('type')->default('visiteur');
$table->boolean('confirme')->default(false);
$table->string('email')->unique();
$table->string('password');
$table->string('photo_url')->default('default_photo_profile.jpg');
$table->rememberToken();
$table->timestamps();
});
функция создания:
$request = request();
if ($request->hasFile('photo')) {
$file = $request->file('photo');
$fullname=$data['nom'].'_'.date("Y-m-d",time()).'.'.$file->getClientOriginalExtension();
$path = $request->file('photo')->storeAs('images', $fullname);
}
return User::create([
'nom' => $data['nom'],
'prenom' => $data['prenom'],
'email' => $data['email'],
'photo_url' => $fullname,
'password' => Hash::make($data['password']),
]);
}
а форма для поля файла такая:
<div class = "form-group">
<label for = "photo_url">Photo profile</label>
<input type = "file" name = "photo" class = "form-control-file" id = "photo_url">
</div>
все работает нормально, кроме поля photo_url, оно всегда устанавливает значение по умолчанию при миграции, а не значение, которое я установил в функции создания. $ fullname инициировано и уже объявлено.
вся форма:
<form method = "POST" action = "{{ route('register') }}" aria-label = "{{ __('Register') }}" enctype = "multipart/form-data">
@csrf
<div class = "form-group row">
<label for = "nom" class = "col-md-4 col-form-label text-md-right">Nom</label>
<div class = "col-md-6">
<input id = "nom" type = "text" class = "form-control{{ $errors->has('nom') ? ' is-invalid' : '' }}" name = "nom" value = "{{ old('nom') }}" required autofocus>
@if ($errors->has('nom'))
<span class = "invalid-feedback" role = "alert">
<strong>{{ $errors->first('nom') }}</strong>
</span>
@endif
</div>
</div>
<div class = "form-group row">
<label for = "prenom" class = "col-md-4 col-form-label text-md-right">Prénom</label>
<div class = "col-md-6">
<input id = "prenom" type = "text" class = "form-control{{ $errors->has('prenom') ? ' is-invalid' : '' }}" name = "prenom" value = "{{ old('prenom') }}" required autofocus>
@if ($errors->has('prenom'))
<span class = "invalid-feedback" role = "alert">
<strong>{{ $errors->first('prenom') }}</strong>
</span>
@endif
</div>
</div>
<div class = "form-group row">
<label for = "email" class = "col-md-4 col-form-label text-md-right">Email</label>
<div class = "col-md-6">
<input id = "email" type = "email" class = "form-control{{ $errors->has('email') ? ' is-invalid' : '' }}" name = "email" value = "{{ old('email') }}" required>
@if ($errors->has('email'))
<span class = "invalid-feedback" role = "alert">
<strong>{{ $errors->first('email') }}</strong>
</span>
@endif
</div>
</div>
<div class = "form-group row">
<label for = "password" class = "col-md-4 col-form-label text-md-right">Mot de pass</label>
<div class = "col-md-6">
<input id = "password" type = "password" class = "form-control{{ $errors->has('password') ? ' is-invalid' : '' }}" name = "password" required>
@if ($errors->has('password'))
<span class = "invalid-feedback" role = "alert">
<strong>{{ $errors->first('password') }}</strong>
</span>
@endif
</div>
</div>
<div class = "form-group row">
<label for = "password-confirm" class = "col-md-4 col-form-label text-md-right">Mot de pass confirmation</label>
<div class = "col-md-6">
<input id = "password-confirm" type = "password" class = "form-control" name = "password_confirmation" required>
</div>
</div>
<div class = "form-group">
<label for = "photo_url">Photo profile</label>
<input type = "file" name = "photo" class = "form-control-file" id = "photo_url">
</div>
<div class = "form-group row mb-0">
<div class = "col-md-6 offset-md-4">
<button type = "submit" class = "btn btn-primary">
Envoyer
</button>
</div>
</div>
</form>
В чем проблема?






Предполагая, что у вас есть значение для $photo_url, убедитесь, что у вас есть 'photo_url' в вашем $fillables.
Когда у вас есть $ fillables, он вставляет (через User::create) только то, что есть в этом массиве, в противном случае он не отправляется для этой переменной.
Ваш $fillables должен выглядеть так:
$fillables = ['nom','prenom','type','confirme','email','password','photo_url'];
Добавьте 'photo' в массив $fillable в модели Пользователь:
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name', 'email', 'password', 'photo_url',
];
поэтому в соответствии с вашим кодом в вашей модели вы должны добавить photo_url in $fillable array, как показано ниже.
$fillables = ['nom','prenom','type','confirme','email','password','photo_url'];
Хорошо, теперь есть 3 способа сделать это с помощью $ fillable - первый способ, и вы делаете это прямо сейчас.
2-й способ:
if ($request->hasFile('photo')) {
$file = $request->file('photo');
$fullname=$data['nom'].'_'.date("Y-m-d",time()).'.'.$file->getClientOriginalExtension();
$path = $request->file('photo')->storeAs('images', $fullname);
}
else
{
$fullname = "default_photo_profile.jpg";
}
return User::create([
'nom' => $data['nom'],
'prenom' => $data['prenom'],
'email' => $data['email'],
'photo_url' => $fullname,
'password' => Hash::make($data['password']),
]);
и в вашей миграции измените этот $table->string('photo_url')->default('default_photo_profile.jpg'); на $table->string('photo_url');
3-й способ:
$fullname = "default_photo_profile.jpg";
if ($request->hasFile('photo')) {
$file = $request->file('photo');
$fullname=$data['nom'].'_'.date("Y-m-d",time()).'.'.$file->getClientOriginalExtension();
$path = $request->file('photo')->storeAs('images', $fullname);
return User::create([
'nom' => $data['nom'],
'prenom' => $data['prenom'],
'email' => $data['email'],
'photo_url' => $fullname,
'password' => Hash::make($data['password']),
]);
}
return User::create([
'nom' => $data['nom'],
'prenom' => $data['prenom'],
'email' => $data['email'],
'photo_url' => $fullname,
'password' => Hash::make($data['password']),
]);
}
хорошо, вот способы сделать это. Я бы предпочел первый и второй способ, третий - длинный.
Примечание: для 2-го и 3-го случая, вам необходимо изменить миграцию с этого $table->string('photo_url')->default('default_photo_profile.jpg'); на $table->string('photo_url');
Надеюсь, ты понял.