«Неопределенная переменная: сообщения» в Laravel 5.8 после создания сообщения - PullRequest
0 голосов
/ 04 мая 2019

Когда я создаю новое сообщение и нажимаю кнопку Отправить, данные сообщения проверяются, сохраняются в базе данных, но в режиме просмотра я получаю ошибку Undefined variable: posts (View:/Users/charles/Desktop/Development/fiestas/resources/views/backend/posts/index.blade.php).

Итак, он говорит, что он не определен, но когда я очищаю страницу и захожу на свою индексную страницу, сообщения отображаются как должны без ошибок. Я перешел с Rails и все еще зеленый в Laravel. Любая помощь с благодарностью.

App / Модели / Post.php

<?php

namespace App\Models;
use Illuminate\Database\Eloquent\Model;

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

}

Приложение / Http / Контроллеры / Backend / PostController.php

<?php

namespace App\Http\Controllers\Backend;

use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use Illuminate\Http\Request;
use App\Models\Post;

class PostController extends Controller
{

    public function index(Post $post)
    {
        $posts = Post::all();
        return view('backend.posts.index', compact('posts'));
    }

    public function create()
    {
        return view('backend.posts.create');
    }

    ...

    public function store(Request $request)
    {
        $rules = [
            'title' => ['required', 'min:3'],
            'body' => ['required', 'min:5']
        ];
        $request->validate($rules);
        $user_id = Auth::id();
        $post = new Post();
        $post->user_id = $user_id;
        $post->title = request('title');
        $post->body = request('body');
        $post->save();

        return view('backend.posts.index');
    }
}

маршруты / бэкенд / posts.php

<?php

use App\Http\Controllers\Backend\PostController;

// All route names are prefixed with 'admin.'.
Route::redirect('/', '/admin/posts', 301);
Route::get('posts', [PostController::class, 'index'])->name('index');
Route::get('posts/create', [PostController::class, 'create'])->name('create');
Route::post('posts', [PostController::class, 'store'])->name('store');
Route::get('posts/{post}', [PostController::class, 'show'])->name('show');
Route::get('posts/{post}/edit', [PostController::class, 'edit'])->name('edit');
Route::patch('posts/{post}', [PostController::class, 'update'])->name('update');
Route::delete('posts/{post}', [PostController::class, 'destroy'])->name('destroy');

ресурсы / виды / бэкенд / сообщений / create.blade.php

...
<form method="Post" action="/admin/posts">
        @csrf
        <input type="text" name="title" placeholder="Post Title" value="{{ old('title') }}">
        <textarea name="body" placeholder="Body" id="" cols="30" rows="10">{{ old('body') }}</textarea>
        <button type="submit">Submit</button>
    </form>
...

ресурсы / виды / бэкенд / сообщений / index.blade.php

...
@section('content')
    @foreach ($posts as $post)
        <h5><a href="/posts/{{ $post->id }}">{{ $post->title }}</a></h5>
        <p>{{ Str::limit($post->body, 100) }}</p>
    @endforeach
@endsection
...

Ответы [ 2 ]

2 голосов
/ 04 мая 2019

Ваш метод индекса правильный - он захватывает переменную $posts и сжимает ее в обратном представлении.

Однако, когда вы сохраняете новое сообщение, вы только сохраняете его, но затем вызываете тот же самый просмотр страницы с помощью оператора return метода store() без коллекции:

return view('backend.posts.index');

Вы не отправили представление коллекционной переменной $posts из вашего метода store(), и ваше представление ожидает, что эта переменная будет, поэтому ошибка. Чтобы исправить это, используйте метод store(), возьмите сообщения и сожмите:

$posts = Post::all();
return view('backend.posts.index', compact('posts'));
1 голос
/ 04 мая 2019

Одним из способов является перенаправление после сохранения сообщения.Поскольку представлению требуется $posts. Если мы просто вернемся к представлению, оно отобразит ошибку. Поэтому мы можем перенаправить на функцию индекса, чтобы получить $posts и загрузить ее в представлении.

 public function store(Request $request)
{
    $rules = [
        'title' => ['required', 'min:3'],
        'body' => ['required', 'min:5']
    ];
    $request->validate($rules);
    $user_id = Auth::id();
    $post = new Post();
    $post->user_id = $user_id;
    $post->title = request('title');
    $post->body = request('body');
    $post->save();

    return redirect()->route('index');
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...