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, если можете!)