Значения объекта не передаются

Я использую Laravel 5.6, и у меня возникла проблема с передачей данных в файл моего блейда.

БлогКонтроллер:

namespace App\Http\Controllers;

use App\Mail\Practice;
use App\Mail\Mailable;
use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;
use App\Post;
use Session;

class BlogController extends Controller
{
  public function getSingle($slug){
    // Fetch from the DB based on Slug --first stops after one, get pulls everything
  $post = Post::where('slug', '=', $slug)->first();
  print_r($slug);

  // return the view and pass in the post object
  return view('blog.single')->withPost($post);

 }
}

одиночный.blade.php:

@extends('main')

@section('title', "| $post->title")

@section('content')


  <div class = "row">
   <div class = "col-md-8 col-md-offset-2">
    <h1>{{ $post->title}}</h1>
    <p>{{ $post->body }}</p>
</div>


@остановка

Я проверил имя и написание в БД (MySQL). Если я dd($slug) или print_r($slug), результаты верны.

Однако, если я сделаю то же самое, но использую $title или $body, он вернет ошибку

Trying to get property of non-object (View: /Users/jesseburger/myproject/resources/views/blog/single.blade.php)

Я смог проверить, что он извлекает пустой массив с помощью print_r($post), но не могу понять, почему.

print_r($post) получается:

Illuminate\Database\Eloquent\Collection Object ( [items:protected] => Array ( ) )

Текущий маршрут:

Route::get('blog/{slug}', [
    'as' => 'blog.single', 
    'uses' => 'BlogController@getSingle'
])->where('slug', '[\w\d\-\_]+');

Является ли withPost функцией в Laravel? Может попробовать return view('blog.single')->with('post', $post); или return view('blog.single', ['post' => $post]);.

Alex 01.03.2019 22:25

Вы действительно должны реализовать что-то, что обрабатывает, когда сообщение не найдено. Тогда вам даже не нужно было бы print_r, вы бы знали, что есть Post.

Devon 01.03.2019 22:33

Я попробовал оба предложения, но все еще тянет пустой массив

odenforce89 01.03.2019 22:50
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
2
3
39
2

Ответы 2

Ваш оператор возврата неверен, вам нужно изменить эту строку:

return view('blog.single')->withPost($post);

Для этого он должен решить вашу проблему.

return view('blog.single')->with('post', $post);

его ответ «Свойство [название] не существует в этом экземпляре коллекции». после реализации withPost в with('post', $post)

odenforce89 01.03.2019 22:48

Можете ли вы проверить содержимое $post в вашем представлении с помощью print_r($post);

rpm192 01.03.2019 22:50

это просто загрузка пустой страницы

odenforce89 01.03.2019 22:53

Illuminate\Database\Eloquent\Collection Object ( [items:protected] => Array ( ) ) Это то, что его отбрасывает

odenforce89 01.03.2019 22:54

Попробуйте: Post::where('slug', $slug)->first(); вместо Post::where('slug', '=', $slug)->first();

rpm192 01.03.2019 22:56

загружается совершенно пустая страница

odenforce89 01.03.2019 22:59

Как вы вызываете функцию?

rpm192 01.03.2019 23:00

Я могу print_r($slug), но если я попытаюсь вытащить $title или $body, это выдаст неопределенную ошибку

odenforce89 01.03.2019 23:00

А вы уверены, что есть запись, соответствующая запросу?

rpm192 01.03.2019 23:01

в лезвии я называю это в двух местах. первый в @section('title', "| $post->title") Второй в теле с использованием {{ $post->title }}

odenforce89 01.03.2019 23:03

Да, у меня есть две записи со слагами в моей БД, и я могу вызвать их в другом месте, только не с этого контроллера.

odenforce89 01.03.2019 23:03

Вы получаете слаг из URL-адреса?

rpm192 01.03.2019 23:05

Добавляйте свои маршруты в пост

rpm192 01.03.2019 23:07

Вот мой маршрут: Route::get('blog/{slug}', ['as' => 'blog.single', 'uses' => 'BlogController@getSingle'])->where('slug', '[\w\d\-_]+');

odenforce89 01.03.2019 23:07

Я следую руководству DevMarketer по созданию блога с помощью Laravel, и это видео 24 в этой серии. Просто чтобы вы знали, откуда я

odenforce89 01.03.2019 23:11

Не знаю как, но он решил начать работать! Я ненавижу, когда это происходит, потому что я не могу увидеть ошибку и, следовательно, не могу научиться ее предотвращать...

odenforce89 01.03.2019 23:18

Странно, ха-ха, добро пожаловать в мир программирования :). Рад, что у тебя получилось.

rpm192 01.03.2019 23:19

Сначала вы отлаживаете свой слаг, а не свой пост. Попробуйте отладить свой пост, чтобы увидеть, был ли он найден. Вы получаете эту ошибку, потому что сообщения вообще не существует. Прервать, если он не существует.

if (!$post){
    abort(404);
}

Другие вопросы по теме