Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Столкнулся с ошибкой:
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'), '-');
}
}
}
Вопрос: как решить эту проблему в моем случае?
Не в сети
В приведенном коде нет указаний где подключается form.blade.php и откуда берется переменная $message в ней.
То есть из ошибки понятно, что ты эту переменную в этот шаблон не передал. Осталось найти место где ты это не сделал
Вангую что он подключается через @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.
Не в сети
Кстати, в новых версиях ларавель конструкция вида {{ $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.
Не в сети
Про переменную да, затупил. Вот я указал путь. Ошибка типа "неизвестная переменная" уже не возникает. А
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)
Не в сети
В последнем куске кода ты в инклюд не передаёшь переменные. Вангую что из-за этого
Не в сети
Проблема: {{$message->title or ""}}
Решение: {{$message->title ?? ""}}
Не в сети
Спасибо. Помогло. Это связано с новой версией Laravel. На более старых версиях работает старая конструкция.
Не в сети
Страницы 1