Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 17.09.2018 12:25:24

Ошибка -Trying to get property 'title' of non-object

Столкнулся с ошибкой:

Trying to get property 'title' of non-object
(View: home/vagrant/projects/Laravel/resources/views/admin/messages/partials/form.blade.php) (View: /home/vagrant/projects/Laravel/resources/views/admin/messages/partials/form.blade.php)

Вот содержимое файла в котором ошибка: Laravel/resources/views/admin/messages/partials/form.blade.php:

<label for="">Заголовок</label>
<input type="text" class="form-control" name="title" placeholder="Заголовок" value="{{$message->title or ""}}" required>

<label for="">Описание</label>
<input type="text" class="form-control" name="text" value="{{$message->slug or ""}}" required>

<input type="button" class="button" name="" value="Опубликовать">

Если убрать

{{$message->title or ""}}

, и заменить допустим на простое абвгд, то все работает, страница загружается.

Вот контроллер Laravel/app/Http/Controllers/Admin/MessageController.php :

namespace App\Http\Controllers\Admin;

use App\Message;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class MessageController extends Controller
{
    
    public function index()
    {
        return view('admin.messages.index', [
            'messages' => Message::paginate(16)
        ]);
    }

    
    public function create()
    {
        return view('admin.messages.create', [
            'message' => [],
            'delimiter' => ''
        ]);
    }

    
    public function store(Request $request)
    {
        Message::create($request->all());

        return redirect()->route('admin.message.index'); // ВАЖНО s
    }

    
    public function show(Message $message)
    {
        //
    }

    
    public function edit(Message $message)
    {
        return view('admin.messages.edit', [
            'message' => $message,
            'delimiter' => ''
        ]);
    }

    
    public function update(Request $request, Message $message)
    {
        $message->update($request->except('slug'));

        return redirect()->route('admin.message.index');
    }

    
    public function destroy(Message $message)
    {
        $message->delete();

        return redirect()->route('admin.message.index');
    }
}

Модель Laravel/app/Message.php:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Str;

class Message extends Model
{
    protected $fillable = ['title', 'slug', 'parent_id', 'published', 'created_by', 'modified_by'];

    // Mutators
    public function setSlugAttribute($value)
    {
        $this->attributes['slug'] = Str::slug(mb_substr($this->title, 0, 40) . "-" . \Carbon\Carbon::now()->format('dmyHi'), '-');
    }

}


}

Вопрос: как решить эту проблему в моем случае?

Не в сети

#2 17.09.2018 14:34:11

Re: Ошибка -Trying to get property 'title' of non-object

В приведенном коде нет указаний где подключается form.blade.php и откуда берется переменная $message в ней.
То есть из ошибки понятно, что ты эту переменную в этот шаблон не передал. Осталось найти место где ты это не сделал smile
Вангую что он подключается через @include в другом шаблоне. Вот там наверное и надо передать переменную через параметры.
https://laravel.com/docs/5.7/blade#including-sub-views


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Не в сети

#3 17.09.2018 14:41:44

Re: Ошибка -Trying to get property 'title' of non-object

Кстати, в новых версиях ларавель конструкция вида {{ $name or 'Default' }} уже не поддерживается!!! Было но прошло. Сломали обратную совместимость. Так что проверяй существование переменной как-то иначе. Через тернарный оператор {{ isset($name) ? $name : 'Default' }} или специальные команды
@isset($records)
    // $records is defined and is not null...
@endisset


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Не в сети

#4 17.09.2018 15:46:50

Re: Ошибка -Trying to get property 'title' of non-object

Про переменную да, затупил. Вот я указал путь. Ошибка типа "неизвестная переменная" уже не возникает. А

Trying to get property 'title' of non-object

так и осталась.

Еще раз мои исходники с исправлениями/дополнениями:

Модель Laravel/app/Message.php :

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Str;

class Message extends Model
{
    protected $fillable = [
        'title',
        'slug',
        'parent_id',
        'published',
        'created_by',
        'modified_by'
    ];

    // Mutators
    public function setSlugAttribute($value)
    {
        $this->attributes['slug'] = Str::slug(mb_substr($this->attributes['title'], 0, 40) . "-" . \Carbon\Carbon::now()->format('dmyHi'), '-');
    }
    public function children() {
        return $this->hasMany(self::class, 'parent_id');
    }
}

Контроллер Laravel/app/Http/Controllers/Admin/MessageController.php :

<?php

namespace App\Http\Controllers\Admin;

use App\Message;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class MessageController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        return view('admin.messages.index', [
            'messages' => Message::paginate(16)
        ]);
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        return view('admin.messages.create', [
            'message' => [],
            'messages' => Message::with('children')->where('parent_id', '0')->get(),
            'delimiter' => ''
        ]);
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        Message::create($request->all());
        return redirect()->route('admin.messages.index'); // ВАЖНО s
    }

    /**
     * Display the specified resource.
     *
     * @param  \App\Message $message
     * @return \Illuminate\Http\Response
     */
    public function show(Message $message)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  \App\Message $message
     * @return \Illuminate\Http\Response
     */
    public function edit(Message $message)
    {
        return view('admin.messages.edit', [
            'message' => $message,
            'delimiter' => ''
        ]);
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request $request
     * @param  \App\Message $message
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, Message $message)
    {
        $message->update($request->except('slug'));

        return redirect()->route('admin.message.index');
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  \App\Message $message
     * @return \Illuminate\Http\Response
     */
    public function destroy(Message $message)
    {
        $message->delete();

        return redirect()->route('admin.message.index');
    }
}

Установление переменной Laravel/resources/views/admin/messages/partials/messages.blade.php :

@foreach ($messages as $message_list)

    <option value="{{$message_list->id or ""}}"

            @isset($message->id)

            @if ($message->parent_id == $message_list->id)
            selected=""
            @endif

            @if ($message->id == $message_list->id)
            hidden=""
        @endif

        @endisset

    >
        {!! $delimiter or "" !!}{{$message_list->title or ""}}
    </option>

    @if (count($message_list->children) > 0)

        @include('admin.messages.partials.messages', [
          'messages' => $message_list->children,
          'delimiter'  => ' - ' . $delimiter
        ])

    @endif
@endforeach

В этом файле @include из файла messeges и в нем же ошибка возникает Laravel/resources/views/admin/messages/partials/form.blade.php :

@include('admin.messages.partials.messages', ['messages' => $messages])

<label for="">Статус</label>
<select class="form-control" name="published">
    @if (isset($message->id))
        <option value="0" @if ($message->published == 0) selected="" @endif>Не опубликовано</option>
        <option value="1" @if ($message->published == 1) selected="" @endif>Опубликовано</option>
    @else
        <option value="0">Не опубликовано</option>
        <option value="1">Опубликовано</option>
    @endif
</select>

<label for="">Наименование</label>
<input type="text" class="form-control" name="title" placeholder="Заголовок категории" value="{{$message->title or ""}}" required>

<label for="">Slug</label>
<input class="form-control" type="text" name="slug" placeholder="Автоматическая генерация" value="{{$message->slug or ""}}" readonly="">

<label for="">Родительская категория</label>
<select class="form-control" name="parent_id">
    <option value="0">-- без родительской категории --</option>
</select>

<hr />

<input class="btn btn-dark" type="submit" value="Сохранить">

@include из файла form, в котором возникает ошибка Laravel/resources/views/admin/messages/create.blade.php :

@extends('admin.layouts.layout_adm')

@section('content')



        <form action="{{route('admin.message.store')}}" class="form-horizontal" method="post">
            {{ csrf_field() }}

            {{-- Form iclude --}}
            @include('admin.messages.partials.form')
        </form>
@endsection

Сори, что в элементарное не вникаю. Опыт в MVC и Laravel еще маловат.

Изменено Sepol (17.09.2018 15:47:54)

Не в сети

#5 18.09.2018 13:25:05

Re: Ошибка -Trying to get property 'title' of non-object

В последнем куске кода ты в инклюд не передаёшь переменные. Вангую что из-за этого

Не в сети

#6 18.09.2018 14:24:44

Re: Ошибка -Trying to get property 'title' of non-object

Проблема:  {{$message->title or ""}}
Решение:    {{$message->title ?? ""}}

Не в сети

#7 30.09.2018 17:15:38

Re: Ошибка -Trying to get property 'title' of non-object

Спасибо. Помогло. Это связано с новой версией Laravel. На более старых версиях работает старая конструкция.

Не в сети

Подвал раздела