简体   繁体   中英

Trying to get property 'title' of non-object Laravel 5.8 Error

I'm new to Laravel and trying to create my first project. In this project, I've made a page where users can Login to their account and upload a new image with a caption. Then I tried to store the image with the written caption into database but suddenly this error message appears:

Trying to get property 'title' of non-object (View: F:\xampp\htdocs\frameworks\laravel 5.8\resources\views\profiles\index.blade.php)

Here is my PostsController.php :

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class PostsController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth');
    }

    public function create()
    {
        return view('posts.create');
    }
    public function store()
    {
        $data = request()->validate([
            'caption' => 'required',
            'image' => ['required','image'],
        ]);

        $imagePath = request('image')->store('uploads','public');

        auth()->user()->posts()->create([
            'caption' => $data['caption'],
            'image' => $imagePath,
        ]);

        return redirect('/profile/' . auth()->user()->id);
    }
}

And this is the create.blade.php under the posts directory which I used as form:

    @extends('layouts.app')

@section('content')
<div class="container">
    <form action="/p" enctype="multipart/form-data" method="post">
        @csrf
        <div class="row">
            <div class="col-8 offset-2">
                <div class="row">
                    <h1>Add New Post</h1>
                </div>
                <div class="form-group row">
                    <label for="caption" class="col-md-4 col-form-label">Post Caption</label>

                  
                    <input id="caption" 
                    type="text" 
                    class="form-control @error('caption') is-invalid @enderror" 
                    name="caption" 
                    value="{{ old('caption') }}" 
                    autocomplete="caption" autofocus>

                    @error('caption')
                        <span class="invalid-feedback" role="alert">
                            <strong>{{ $message }}</strong>
                        </span>
                    @enderror
                 
                </div>
                <div class="row">
                    <label for="image" class="col-md-4 col-form-label">Post Image</label> 
                    <input type="file" class="form-control-file" id="image" name="image">
                    @error('image')
                        <strong>{{ $message }}</strong>
                    @enderror
                </div>
                <div class="row pt-4">
                    <button class="btn btn-primary">Add New Post</button>
                </div>
            </div>
        </div>
    </form>
</div>
@endsection

And this is also the index.blade.php which the error comes from:

@extends('layouts.app')

@section('content')
<div class="container">
    <div class="row">
        <div class="col-3 p-5">
            <img src="https://scontent-frx5-1.cdninstagram.com/v/t51.2885-19/s150x150/116422910_114925270146660_408650316921290541_n.jpg?_nc_ht=scontent-frx5-1.cdninstagram.com&_nc_ohc=dshpB2gOHkMAX-fg_cq&oh=f88bf9c6f5cb1d7ddf64bee889d70add&oe=5F60FB51" class="rounded-circle"></img>
        </div>
        <div class="col-9">
            <div class="d-flex justify-content-between align-items-baseline">
                <h1>{{ $user->username }}</h1>
                <a href="#">Add new post</a>
            </div>
            <div class="d-flex">
                <div class="pr-5"><strong>2</strong> posts</div>
                <div class="pr-5"><strong>77</strong> followers</div>
                <div class="pr-5"><strong>56</strong> followings</div>
            </div>
            <div class="pt-4 font-weight-bold">{{ $user->profile->title }}</div>
            <div>{{ $user->profile->description }}</div>
            <div><a href="#">{{ $user->profile->url ?? 'Not Available'}}</a></div>
        </div>
    </div>
    <div class="row">
        <div class="col-4">
            <img src="https://scontent-frx5-1.cdninstagram.com/v/t51.2885-15/e35/105520633_108718614121090_2184698351066702676_n.jpg?_nc_ht=scontent-frx5-1.cdninstagram.com&_nc_cat=110&_nc_ohc=U8VChpgH8FAAX_rx2ui&oh=c163882b70cfbe374cf2adfcaa593b6e&oe=5F5EF3DE" class="w-100"></img>
        </div>
        <div class="col-4">
            <img src="https://scontent-frx5-1.cdninstagram.com/v/t51.2885-15/e35/105520633_108718614121090_2184698351066702676_n.jpg?_nc_ht=scontent-frx5-1.cdninstagram.com&_nc_cat=110&_nc_ohc=U8VChpgH8FAAX_rx2ui&oh=c163882b70cfbe374cf2adfcaa593b6e&oe=5F5EF3DE" class="w-100"></img>
        </div>
        <div class="col-4">
            <img src="https://scontent-frx5-1.cdninstagram.com/v/t51.2885-15/e35/105520633_108718614121090_2184698351066702676_n.jpg?_nc_ht=scontent-frx5-1.cdninstagram.com&_nc_cat=110&_nc_ohc=U8VChpgH8FAAX_rx2ui&oh=c163882b70cfbe374cf2adfcaa593b6e&oe=5F5EF3DE" class="w-100"></img>
        </div>
    </div>
</div>
@endsection

I wonder what is going wrong here, so if you have any idea or suggestion, please let me know, I would really really appreciate that!

Note: If you want me to write any other file codes of Laravel for you to see, please comment, I would quickly put an update for you.

UPDATE #1

User.php:

<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'username', 'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];

    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];

    public function posts()
    {
        return $this->hasMany(Post::class);
    }

    public function profile()
    {
        return $this->hasOne(Profile::class);
    }
}

Post.php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    protected $guarded = [];

    Public function user()
    {
        return $this->belongsTo(User::class);
    }
}

create_posts_table.php:

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreatePostsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->unsignedBigInteger('user_id');
            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
            $table->text('caption');
            $table->string('image');
            $table->timestamps();
            // $table->index('user_id');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('posts');
    }
}

UPDATE #2

Profile.php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Profile extends Model
{
    public function user()
    {
        return $this->belongsTo(User::class);
    }
}

ProfilesController.php:

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\User;

class ProfilesController extends Controller
{
    public function index($user)
    {
        $user = User::findOrFail($user);

        return view('profiles.index' ,[
            'user' => $user,
            
        ]);
    }
}

#UPDATE 3

Here is how the profiles should look like:

在此处输入图片说明

I'm new to Laravel and trying to create my first project. In this project, I've made a page where users can Login to their account and upload a new image with a caption. Then I tried to store the image with the written caption into database but suddenly this error message appears:

Trying to get property 'title' of non-object (View: F:\xampp\htdocs\frameworks\laravel 5.8\resources\views\profiles\index.blade.php)

Here is my PostsController.php :

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class PostsController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth');
    }

    public function create()
    {
        return view('posts.create');
    }
    public function store()
    {
        $data = request()->validate([
            'caption' => 'required',
            'image' => ['required','image'],
        ]);

        $imagePath = request('image')->store('uploads','public');

        auth()->user()->posts()->create([
            'caption' => $data['caption'],
            'image' => $imagePath,
        ]);

        return redirect('/profile/' . auth()->user()->id);
    }
}

And this is the create.blade.php under the posts directory which I used as form:

    @extends('layouts.app')

@section('content')
<div class="container">
    <form action="/p" enctype="multipart/form-data" method="post">
        @csrf
        <div class="row">
            <div class="col-8 offset-2">
                <div class="row">
                    <h1>Add New Post</h1>
                </div>
                <div class="form-group row">
                    <label for="caption" class="col-md-4 col-form-label">Post Caption</label>

                  
                    <input id="caption" 
                    type="text" 
                    class="form-control @error('caption') is-invalid @enderror" 
                    name="caption" 
                    value="{{ old('caption') }}" 
                    autocomplete="caption" autofocus>

                    @error('caption')
                        <span class="invalid-feedback" role="alert">
                            <strong>{{ $message }}</strong>
                        </span>
                    @enderror
                 
                </div>
                <div class="row">
                    <label for="image" class="col-md-4 col-form-label">Post Image</label> 
                    <input type="file" class="form-control-file" id="image" name="image">
                    @error('image')
                        <strong>{{ $message }}</strong>
                    @enderror
                </div>
                <div class="row pt-4">
                    <button class="btn btn-primary">Add New Post</button>
                </div>
            </div>
        </div>
    </form>
</div>
@endsection

And this is also the index.blade.php which the error comes from:

@extends('layouts.app')

@section('content')
<div class="container">
    <div class="row">
        <div class="col-3 p-5">
            <img src="https://scontent-frx5-1.cdninstagram.com/v/t51.2885-19/s150x150/116422910_114925270146660_408650316921290541_n.jpg?_nc_ht=scontent-frx5-1.cdninstagram.com&_nc_ohc=dshpB2gOHkMAX-fg_cq&oh=f88bf9c6f5cb1d7ddf64bee889d70add&oe=5F60FB51" class="rounded-circle"></img>
        </div>
        <div class="col-9">
            <div class="d-flex justify-content-between align-items-baseline">
                <h1>{{ $user->username }}</h1>
                <a href="#">Add new post</a>
            </div>
            <div class="d-flex">
                <div class="pr-5"><strong>2</strong> posts</div>
                <div class="pr-5"><strong>77</strong> followers</div>
                <div class="pr-5"><strong>56</strong> followings</div>
            </div>
            <div class="pt-4 font-weight-bold">{{ $user->profile->title }}</div>
            <div>{{ $user->profile->description }}</div>
            <div><a href="#">{{ $user->profile->url ?? 'Not Available'}}</a></div>
        </div>
    </div>
    <div class="row">
        <div class="col-4">
            <img src="https://scontent-frx5-1.cdninstagram.com/v/t51.2885-15/e35/105520633_108718614121090_2184698351066702676_n.jpg?_nc_ht=scontent-frx5-1.cdninstagram.com&_nc_cat=110&_nc_ohc=U8VChpgH8FAAX_rx2ui&oh=c163882b70cfbe374cf2adfcaa593b6e&oe=5F5EF3DE" class="w-100"></img>
        </div>
        <div class="col-4">
            <img src="https://scontent-frx5-1.cdninstagram.com/v/t51.2885-15/e35/105520633_108718614121090_2184698351066702676_n.jpg?_nc_ht=scontent-frx5-1.cdninstagram.com&_nc_cat=110&_nc_ohc=U8VChpgH8FAAX_rx2ui&oh=c163882b70cfbe374cf2adfcaa593b6e&oe=5F5EF3DE" class="w-100"></img>
        </div>
        <div class="col-4">
            <img src="https://scontent-frx5-1.cdninstagram.com/v/t51.2885-15/e35/105520633_108718614121090_2184698351066702676_n.jpg?_nc_ht=scontent-frx5-1.cdninstagram.com&_nc_cat=110&_nc_ohc=U8VChpgH8FAAX_rx2ui&oh=c163882b70cfbe374cf2adfcaa593b6e&oe=5F5EF3DE" class="w-100"></img>
        </div>
    </div>
</div>
@endsection

I wonder what is going wrong here, so if you have any idea or suggestion, please let me know, I would really really appreciate that!

Note: If you want me to write any other file codes of Laravel for you to see, please comment, I would quickly put an update for you.

UPDATE #1

User.php:

<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'username', 'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];

    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];

    public function posts()
    {
        return $this->hasMany(Post::class);
    }

    public function profile()
    {
        return $this->hasOne(Profile::class);
    }
}

Post.php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    protected $guarded = [];

    Public function user()
    {
        return $this->belongsTo(User::class);
    }
}

create_posts_table.php:

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreatePostsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->unsignedBigInteger('user_id');
            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
            $table->text('caption');
            $table->string('image');
            $table->timestamps();
            // $table->index('user_id');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('posts');
    }
}

UPDATE #2

Profile.php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Profile extends Model
{
    public function user()
    {
        return $this->belongsTo(User::class);
    }
}

ProfilesController.php:

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\User;

class ProfilesController extends Controller
{
    public function index($user)
    {
        $user = User::findOrFail($user);

        return view('profiles.index' ,[
            'user' => $user,
            
        ]);
    }
}

#UPDATE 3

Here is how the profiles should look like:

在此处输入图片说明

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM