Laravel 5.8显示描述并更改图片配置文件

时间:2019-07-14 14:50:38

标签: php laravel laravel-5.8

我尝试创建/修改配置文件,但是当我想在配置文件中添加图像时,它不起作用并且不会加载到数据库中。

ProfileController

class ProfileController extends Controller
{
    public function show(User $user)
    {
        return view('profile.show', compact('user'));
    }

    public function edit(User $user)
    {
        $this->authorize('update', $user->profile);
        return view('profile.edit', compact('user'));
    }

    public function update(User $user)
    {
        $this->authorize('update', $user->profile);
        $data = request()->validate([
            'description' => 'required',
            'image' => 'sometimes|image|max:3000'
        ]);

        if (request('image')) {
            $imagePath = request('image')->store('avatars', 'public');

            $image = Image::make(public_path("/storage/{$imagePath}"))->fit(800, 800);
            $image->save();

            auth()->user()->profile->update(array_merge($data,
                ['image' => $imagePath]
            ));
        } else {
            auth()->user()->profile->update($data);
        }

        auth()->user()->profile->update($data);

        return redirect()->route('profile.show', ['user' => $user]);
    }
}

用户

class User extends Authenticatable implements MustVerifyEmail
{
    use Notifiable;

    protected $fillable = [
        'username', 'nom', 'prenom', 'adresse', 'ville',
        'codepostale', 'datedenaissance', 'email', 'password',
    ];


    protected $hidden = [
        'password', 'remember_token',
    ];

    protected $casts = [
        'email_verified_at' => 'datetime',
    ];

    protected static function boot()
    {
        parent::boot();
        static::created(function ($user) {
            $user->profile()->create([
                'description' => $user->username
            ]);
        });
    }

    public function getRouteKeyName()
    {
        return 'username';
    }

    public function profile()
    {
        return $this->hasOne('App\Profile');
    }

    public function posts()
    {
        return $this->hasMany('App\Post')->orderBy('created_at', 'DESC');
    }
}

show.blade.php

@extends('layouts.app')
@section('content')
    <div class="container">
        <div class="row">
            <div class="col-4">
                <img src="{{ $user->profile->getImage() }}" class="rounded-circle w-100" alt="" style="max-width: 240px;">
            </div>
            <div class="col-8">
                <div class="d-flex align-items-baseline">
                    <div class="h4 mr-3 pt-2">{{ $user->username }}</div>
                    <button class="btn btn-primary">S'abonner</button>
                </div>
                <div class="d-flex">
                    <div class="mr-3">{{ $user->posts->count() }} article(s) en vente
                    </div>
                    @can('update', $user->profile)
                        <a href=" {{ route('profile.edit', ['username' => $user->username]) }}">Modifier Profile</a>
                    @endcan
                    <div class="mt-3">
                        <div class="font-weight-bold">
                            {{ $user->profile->title }}
                        </div>
                    </div>
                </div>
            </div>
            <div class="row mt-5">
                @foreach ($user->posts as $post)
                    <div class="col-4">
                        <a href="{{ route('posts.show', ['post' => $post->id]) }}">
                            <img src="{{ asset('storage') . '/' . $post->image }}" alt="" class="w-100">
                        </a>
                    </div>
                @endforeach
            </div>
        </div>
    </div>
@endsection

edit.blade.php

@extends('layouts.app')

@section('content')
<div class="container">
    <div class="row justify-content-center">
        <div class="col-md-8">
            <div class="card">
                <div class="card-header">Modifier profile</div>

                <div class="card-body">
                    <form method="POST" action="{{ route('profile.update', ['user' => $user]) }}" enctype="multipart/form-data">
                        @csrf
                        @method('PATCH')

                        <div class="form-group">
                            <label for="description">Description</label>

                            <div class="col-md-6">
                                <textarea id="description" type="text" class="form-control @error('description') is-invalid @enderror" name="description" autocomplete="description" autofocus>{{ old('description') ?? $user->profile->description }}</textarea>

                                @error('description')
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                @enderror
                            </div>
                        </div>


                        <div class="form-group">    
                            <div class="custom-file">

                                <input type="file" name="image" class="custom-file-input @error('image') is-invalid @enderror" id="validatedCustomFile" >
                                <label class="custom-file-label" for="validatedCustomFile">Choisir une image</label>
                                @error('image')
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                @enderror
                            </div>
                        </div>

                            <div class="col-md-6 offset-md-4">
                                <button type="submit" class="btn btn-primary">
                                    Modifier profile
                                </button>
                            </div>
                        </div>
                    </form>
                </div>
            </div>
        </div>
    </div>
</div>
@endsection

Profile.php

class Profile extends Model
{
    protected $fillable = ['description']; 

    public function user()
    {
        return $this->belongsTo('App\User');
    }

    public function getImage()
    {
        $imagePath = $this->image ?? 'avatars/default.png';

        return "/storage/" . $imagePath;
    }
}

create_profiles_tables.php

class CreateProfilesTable extends Migration
{
    public function up()
    {
        Schema::create('profiles', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->text('description')->nullable();
            $table->string('image')->nullable();
            $table->unsignedBigInteger('user_id')->index();
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('profiles');
    }
}

我不知道在数据库中上传图片和更改个人资料图片有什么问题,有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

在这种情况下,您尝试更新用户相关的个人资料模型的图像字段。

auth()->user()->profile->update(array_merge($data,
    ['image' => $imagePath]
));

但是,在您的个人资料模型中,图片是不允许进行批量分配的字段。

protected $fillable = ['description']; 

您应将其更改为:

protected $fillable = ['description','image']; 

希望这会有所帮助,祝你好运!

编辑

  

关注空白图像问题。

基于我链接的其他解决方案,我可以从文档中确定使用干预图像包的方法有多种。

尝试更改此内容:

$image = Image::make(public_path("/storage/{$imagePath}"))->fit(800, 800);
$image->save();

对此:

$image = Image::make(Input::file('image'))->fit(800, 800);
$image->save(public_path("/storage/{$imagePath}"));

也许这种方法会带来更好的运气,就像用户在另一个线程中所做的那样。

干预图像(文档)

make() http://image.intervention.io/api/make

save() http://image.intervention.io/api/save

编辑

  

进一步的跟进

您是否已正确链接公共存储?如果没有,这可能是一个促成因素。

php artisan storage:link

对我来说,远程调试您的应用非常困难。但是我将从创建一些简单的控制器方法进行测试开始。

首先,创建一个控制器方法以返回已知的良好图像。这将是您直接放置在服务器上特定位置的一个。然后相应地引用该路径,并从路由中调用该方法。

public function untouchedImage()
{
    $path = public_path('images/known-good-image.png');
    return response()->file(public_path($path);
}

然后,如果上面的图像正确显示,请创建另一个控制器方法。引用完全相同的文件位置,但尝试输出调整大小的图像。

public function resizedImage()
{
    $path = public_path('images/known-good-image.png');
    $image = Image::make(path)->resize(40,40);

    return $image->response('png');
}

如果这可行,则问题可能出在图像路径上。保存图像时,您需要在应用程序中逐行转储路径,以查看发生了什么问题。

如果它不起作用,则可能是Laravel或PHP在某处配置错误。您的服务器上是否装有正确的PHP映像库?默认情况下,它使用GD或通过配置使用Imagick。