Неизвестная переменная в Laravel как исправить?

Есть два роута

Route::get('/', 'IndexController@index')->name("home");
Route::get('/article/{id}', 'ArticleController@index')->name('article');


И два контроллера
class ArticleController extends Controller
{
    public function index($id)
    {
        $article = Article::query()->select('*')->where('id', $id)->get();

        return view('default.articles.news', ['article' => $article]);
    }
}

class IndexController extends Controller
{
    private $perPage = 9;

    public function index()
    {
        $articles = Article::query()->select('*')->paginate($this->perPage);

        return view('index', ['articles' => $articles]);
    }
}


На главной (index.blade.php) вывожу статьи
@section('mainContent')
<div class="container">
        <div class="row mt-4 d-flex justify-content-between">


            @foreach($articles as $article)

                <div class="card-deck col-sm-12 col-md-6 col-lg-4 col-xl-4 mt-2 mb-4">
                    <div class="card">
                        <img class="card-img-top rounded-top" height="190" src="{{ $article->poster }}">
                        <div class="card-body">
                            <h5 class="card-title"><a href="{{ route('article', ['id' => $article->id]) }}">{{ $article->title }}</a></h5>
                            <p class="card-text" style="color: #000000">{{ $article->preview }}</p>
                        </div>
                        <div class="card-footer">
                            <small class="text-muted">Дата публикации: {{ $article->created_at }}</small>
                        </div>
                    </div>
                </div>

            @endforeach


            @if(count($articles) > $articles->perPage())

                <div class="container">
                    <div class="row d-flex justify-content-center mt-2 mb-2">
                        {{ $articles->links() }}
                    </div>
                </div>

            @endif

        </div>
    </div>
@endsection


news.blade.php
@extends('index')

@section('mainContent')
{{ $article }}
@endsection


Но когда перехожу на страницу /article/1 пишет
Undefined variable: articles
(View: C:\Web\MyHost\laravel\resources\views\index.blade.php) 
(View: C:\Web\MyHost\laravel\resources\views\index.blade.php)
  • Вопрос задан
  • 186 просмотров
Решения вопроса 1
erniesto77
@erniesto77
oop, rb, py, php, js
UPD: прежде чем отрисуется news.blade.php сначала грузится ваш шаблон index (@extends('index')), где $articles не существует
Решение: в news.blade.php не должно быть никаких @extends

---------------------------------------
нужно больше кода, поправьте вопрос и добавьте шаблон и эту вьюшку default.articles.news.blade.php

а пока вот этот недочет:
class ArticleController extends Controller
{
    public function index($id)
    {
        $article = Article::query()->select('*')->where('id', $id)->first();

        return view('default.articles.news', ['article' => $article]);
    }
}


вот еще улучшение для ArticleController:
use App\Article;

class ArticleController extends Controller
{
    public function index(Article $article)
    {
        return view('default.articles.news', ['article' => $article]);
    }
}


но в идеале ArticleController должен выдавать все статьи в методе index, а показывать отдельную статью в методе show,
а IndexController вообще не нужен, в данном случае
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы