Laravel пагинация
Доброго времени суток. В данной статье мы поговорим о пагинации в Laravel. Пагинация в Laravel работает прямо из коробки и настраивается очень легко. В статье мы настроим подключение к базе данных, создадим миграцию, создадим модель, затем с помощью Seeding добавим данных в таблицу, создадим контроллер для вывода этих данных и вьюшку для отображения данных. А затем добавим пагинацию. И в завершении рассмотрим, кастомизировать вид постраничной навигации (создадим шаблон для отображения пагинации в Laravel). Что такое пагинация или постраничное отображение данных я не буду описывать. Надеюсь заинтриговал? Тогда приступим…
У нас есть установленный Laravel версии 5.4
Есть настроенный виртуальный хост, по адресу pagination.loc
Есть сервер MySQL с базой данных «pagination» без таблиц
Мы готовы приступить к созданию сайта.
Настройка Laravel
Нам необходимо настроить Laravel. Открываем файл .env, который находится в корне нашего проекта. И меняем:
- DB_DATABASE – вместо homestead пишем название нашей базы, в моем случае pagination
- DB_USERNAME – вместо homestead пишем логин для подключения к нашей базе, в моем случае root
- DB_PASSWORD – вместо secret пишем пароль для подключения к базе данных, в моем случае я оставляю пустым (нет пароля)
Сохраняем.
Создание и запуск миграции в Laravel
Открываем консоль и выполняем команду:
php artisan make:migration creates_articles_table
Миграцию создали. Теперь давайте отредактируем ее. Открываем файл <дата>_<номер>_creates_articles_table.php, которая находится в database\migrations\
И добавим в него следующий код:
<?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreatesArticlesTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('articles', function (Blueprint $table) { $table->increments('id'); $table->string('title', 100) ->unique(); $table->string('text'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('articles'); } }
Кратко поясню. Есть два метода up и down. Первый выполняется, когда мы запускаем миграцию, а второй, когда откатываем миграцию.
При выполнении метода будет создана таблица articles с полями:
- id – автоувеличение
- title – тип varchar длинной 100
- text – тип text
- created_at – тип timestamp
- updated_at – тип timestamp
При откате миграции, таблица articles будет удалена (если она существует)
Теперь мы можем запустить миграцию. Но перед запуском давайте переименуем две миграции, они нам не нужны:
- php в 2014_10_12_000000_create_users_table.txt
- php в 2014_10_12_100000_create_password_resets_table.txt
Теперь выполним команду:
php artisan migrate
Миграция выполнена. Давайте проверим базу данных. Да, видим, что у нас появилось две таблицы наша articles и migrations (служебная таблица для учета миграций)
Отлично, мы с вами создали миграцию и запустили ее. В результате в нашей базе создалась таблица с заданными полями.
Создание Seeder
В Laravel есть метод seeding, который позволяет заполнить нашу базу данных тестовыми данными.
Создадим Seeder.
php artisan make:seeder ArticlesTableSeeder
Перейдем к редактированию нашего seeder.
<?php use Illuminate\Database\Seeder; use Illuminate\Database\Eloquent\Model; class ArticlesTableSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { $i=1; while ($i<26){ DB::table('articles')->insert([ 'title' => 'Заголовок для статьи ' .$i, 'text' => str_random(100), ]); $i++; } } }
При запуске данного seeder в нашей таблице будет создано 25 записей.
Теперь откроем файл DatabaseSeeder.php, который находится database\seeds\ и в метод run, добавим наш класс, вот код DatabaseSeeder.php
<?php use Illuminate\Database\Seeder; class DatabaseSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { $this->call(ArticlesTableSeeder::class); } }
Теперь можно запустить добавление данных, выполнив команду в консоли:
php artisan db:seed
Команда выполнена. Давайте перейдем к базе данных и посмотрим таблицу articles.
Отлично, в таблице articles у нас появилось 25 записей.
Создание модели в Laravel
Основная задача модели – это чтение или запись данных таблицы.
Для того, чтобы создать модель в Laravel достаточно в консоли выполнить следующую команду:
php artisan make:model Article
Модель создана.
Создание контроллера в Laravel
Давайте создадим контроллер, который будет получать из модели Article все данные в таблице и передавать их во вьюшку.
Для того, чтобы создать контроллер в консоли необходимо выполнить следующую команду:
php artisan make:controller ArticleController
Контроллер создан
Теперь перейдем к его редактированию. Напомню, контроллеры нашего приложения находятся в app\Http\Controllers\ (это по умолчанию)
И добавим в него следующий код:
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Article; class ArticleController extends Controller { public function index() { $articles = Article::all(); return view('index',['articles' => $articles]); } }
В данном контроллере всего один метод index().
Теперь нам надо создать view, которая будет отображать все наши данные.
Все вьюшки лежат в resources\views\ . В этой папке и создадим нашу вьюшку index.blade.php Со следующим кодом:
<!DOCTYPE html> <html lang="{{ config('app.locale') }}"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Laravel</title> <!-- Fonts --> <link href="https://fonts.googleapis.com/css?family=Raleway:100,600" rel="stylesheet" type="text/css"> <!-- Styles --> <style> html, body { background-color: #fff; color: #636b6f; font-family: 'Raleway', sans-serif; font-weight: 100; height: 100vh; margin: 0; } .full-height { height: 100vh; } .flex-center { align-items: center; display: flex; justify-content: center; } .position-ref { position: relative; } .top-right { position: absolute; right: 10px; top: 18px; } .content { text-align: center; } .title { font-size: 84px; } .links > a { color: #636b6f; padding: 0 25px; font-size: 12px; font-weight: 600; letter-spacing: .1rem; text-decoration: none; text-transform: uppercase; } .m-b-md { margin-bottom: 30px; } </style> </head> <body> <div class="flex-center position-ref full-height"> @if (Route::has('login')) <div class="top-right links"> @if (Auth::check()) <a href="{{ url('/home') }}">Home</a> @else <a href="{{ url('/login') }}">Login</a> <a href="{{ url('/register') }}">Register</a> @endif </div> @endif <div class="content"> <div class="title m-b-md"> Данные </div> <div> <table> @foreach ($articles as $article): <tr> <td>{{ $article->id }}</td> <td>{{ $article->title }}</td> <td>{{ $article->text }}</td> </tr> @endforeach </table> </div> </div> </div> </body> </html>
Теперь надо создать роут. Роуты находятся в папке routes\. Открываем файл web.php и добавляем в него следующий код:
Route::get('/articles', ['uses' => 'ArticleController@index']);
Теперь переходя по ссылке articles будет вызван метод index контроллера ArticleController.
Давайте проверим, что у нас получилось, переходим по адресу <наш сайт>/articles, в моем случае адрес http://pagination.loc/articles
Мы видим все 25 записей. Вот мы и подошли к самому важному в этой статье – пагинации в Laravel.
Пагинация в Laravel
Как видим, что выводить все записи не очень удобно (это у нас их 25, а если будут сотни). Для того, чтобы данные выводить постранично в ядре Laravel встроена пагинация. Давайте сделаем так, чтобы у нас на странице выводились по 5 элементов.
Переходим в наш контроллер ArticleControler и строку
$articles = Article::all();
Заменяем на
$articles = Article::paginate(5);
Осталось во вьюшке добавить навигацию по страницам. Для этого в нашу вьюшку добавим следующий код после таблицы с данными:
{{ $articles->links() }}
Проверим. Переходим на страницу вывода данных:
Да, некрасиво, нет стилей, но задача выполнена. У нас отображается на странице 5 элементов и работает постраничная навигация.
Кастомизация пагинации в Laravel
Мы можем задать свой шаблон для отображения постраничной навигации, для этого используем следующую структуру:
{{ $articles->links('<название шаблона>') }}
Давайте создадим в папке resources/views шаблон paginate.blade.php и поместим, пока, в него следующий код:
test
Теперь в наш шаблон (в котором выводится список статей) добавим:
{{ $articles->links('paginate') }}
И проверим, что получилось.
Отлично. Теперь давайте в файл paginate.blade.php поместим следующий код:
@if ($paginator->hasPages()) <ul class="pagination"> @if ($paginator->onFirstPage()) <li class="disabled"><span>«</span></li> @else <li><a href="{{ $paginator->previousPageUrl() }}" rel="prev">«</a></li> @endif @foreach ($elements as $element) @if (is_string($element)) <li class="disabled"><span>{{ $element }}</span></li> @endif @if (is_array($element)) @foreach ($element as $page => $url) @if ($page == $paginator->currentPage()) <li class="active"><span>{{ $page }}</span></li> @else <li><a href="{{ $url }}">{{ $page }}</a></li> @endif @endforeach @endif @endforeach @if ($paginator->hasMorePages()) <li><a href="{{ $paginator->nextPageUrl() }}" rel="next">»</a></li> @else <li class="disabled"><span>»</span></li> @endif </ul> @endif
И внесем изменения в стили, откроем файл index.blade.php добавим стили:
… .pagination li{ list-style-type: none; float: left; margin-left: 10px; } .pagination li span { color: #000; } .pagination li a { color: #000; text-decoration: none; } …
Посмотрим, что получилось:
Вот теперь красиво. Давайте подробнее рассмотрим код, который мы добавили в шаблон постраничной навигации.
- $paginator->hasPages() – возвращает true если есть страницы
- $paginator->onFirstPage() – true, если мы на первой странице
- $paginator->previousPageUrl() – получает ссылку на предыдущую страницу, если нет, то возвращает null
- $paginator->currentPage() – получает текущую страницу
- $paginator->hasMorePages() – возвращает true, если есть следующие страницы
- $paginator->nextPageUrl() – получает ссылку на следующую страницу, если нет то возвращает null
Есть множество и других методов, о которых вы можете прочитать в официальной документации по API Laravel
А по самой пагинации в Laravel можете прочитать тут.
Заключение
В этой статье мы с вами настроили пагинацию в Laravel и кастомизировали ее. Но перед этим настроили подключение к базе данных, создали и запустили миграцию, заполнили таблицу тестовыми данными с помощью seeder в Laravel, создали модель, создали контроллер, написали маршрут.
Чтобы не пропустить выхода новых статей подписываемя: VK, twitter, facebook. И канал на youtube