Laravel запрашивает маршрут / контроллер / модель и т. Д.

Еще один из тех вопросов...

Попытка докопаться до сути, как правильно это сделать.

Так что в настоящее время у меня есть маршрут, например, так:

Route::get('/', function()
{
    return View::make('pages/home');
});

И на этой странице у меня есть:

$builds = DB::table('blogs')->where('frontpage', '1')->orderBy('id', 'desc')->paginate(20);

foreach ($builds as $build) {
  // do stuff
}

Это работает, но я знаю, что запросы не должны выполняться в самом представлении. Где они должны быть и как я могу получить данные в представлении лучше всего?

Пока что единственный способ заставить его работать - это поместить запрос в сам маршрут и сжать переменную:

Route::get('/', function()
{
  $builds = DB::table('blogs')->where('frontpage', '1')->orderBy('id', 'desc')->paginate(20);
  return View::make('pages/home', compact('builds'));
});

Но я считаю, что это тоже не правильно?

Я также попытался добавить функцию в мою модель:

public static function findBuilds(){
    DB::table('blogs')->where('frontpage', '1')->orderBy('id', 'desc')->paginate(20);
}

А потом по маршруту:

Route::get('/', function()
{
  $builds = Blog::findBuilds();
  return View::make('pages/home', compact('builds'));
});

Но это дает мне ошибку необъекта, когда я пытаюсь использовать функцию ->links для разбивки на страницы в представлении.

Что мне делать? Когда-то я знаю, однажды я буду в порядке:)

Спасибо!

2 ответа

Решение

Вы скучаете по return утверждение в вашем findBuilds метод:

public static function findBuilds()
{
    return DB::table('blogs')->where('frontpage', '1')->orderBy('id', 'desc')->paginate(20);
//  ^^^^^^ 
}

Тем не менее, поскольку вы в любом случае в модели, используйте модель вместо того, чтобы вернуться к DB учебный класс:

public static function findBuilds()
{
    return static::where('frontpage', '1')->latest('id')->paginate(20);
}

Традиционно вы можете поместить эту логику в свой Controller, а не в вашем rout.php, Model или View - для вашего случая это может быть контроллер с именем: PagesController:

/app/routes.php

// tell Laravel to route all requests to /pages/ to your PagesController
Route::controller('pages', 'PagesController');

/app/controllers/PagesController.php

// now create your routes in PagesController:
class PagesController extends BaseController {

    // handles: GET pages/home
    public function getHome()
    {
        $builds = DB::table('blogs')
                    ->where('frontpage', '1')
                    ->orderBy('id', 'desc')
                    ->paginate(20);
        // pass your $builds to your view
        return View::make('pages/home')->with('builds', $builds);
    }
}    

/app/views/pages/home.blade.php Используйте синтаксис blade- сервера для извлечения различных атрибутов и значений для каждого элемента в вашем $builds массив

@foreach($builds as $build)
// do something with the elements of your builds array
   <div class="build">
     <h2>{{ $build->name }}</h2>
     <!-- etc etc etc-->
   </div>
@endforeach

Если вы создаете небольшое приложение, это может быть излишним... так что вы действительно хотите сделать это в своем routes.php просто добавьте эту логику в маршрут и используйте тот же синтаксис блейда, чтобы пройти через $builds:

Route::get('/', function()
{
    $builds = DB::table('blogs')->where('frontpage', '1')
                                ->orderBy('id', 'desc')
                                ->paginate(20);
    return View::make('pages/home')->with('builds', $builds);
});

(обратите внимание - это не очень хорошая практика для больших приложений с большим количеством маршрутов. Ваш route.php заполнится и сделает вашу жизнь сложнее. Используйте Controllers, если можете!)

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