Laravel позволяет быстро запускать и запускать API-интерфейсы Rest, которые вы можете использовать для передачи данных в мобильные приложения, приложения javascript или другие приложения. В этом посте я покажу вам, как легко это сделать.
Чтобы упростить задачу, давайте создадим API, который предоставляет контент только о книгах и их авторах. На данный момент мы не собираемся добавлять функции “создать” и “обновить”.
Установка
Мы можем начать с создания нового приложения Laravel. В вашем терминале выполните команду: laravel new books-api . Если у вас не установлен Laravel глобально, вы можете использовать Composer:
composer create-project --prefer-dist laravel/laravel books-api
Имейте в виду, что на момент написания этой статьи я использую Laravel версии 7.10.3
Это создаст новую папку books-api , вы можете зайти внутрь и отредактировать файл .env . Нам нужно настроить доступ к базе данных для приложения:
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=DB_USERNAME= DB_PASSWORD=
Чтобы убедиться, что он подключается правильно, вы можете запустить php artisan migrate . Приложение уже поставляется с миграцией базы данных для пользовательской модели. Если ошибок не возникло, все в порядке.
Модели, Миграции и Контроллеры
Нам понадобится, по крайней мере, модель для книг и одна для авторов, поэтому давайте создадим их с помощью команды Artisan: php artisan make:model Author -mcr .
Эта команда должна создать три файла:
app/Author.php: Это наша модельapp/Http/Controllers/AuthorController.php: Контроллер ресурсов (созданный с помощью флагаcr)- и
database/migrations/XXXX_create_authors_table.php:: Это миграция базы данных, созданная с помощью флагаmostв команде.
Давайте начнем с миграции. Перейдите во вновь созданный файл и добавьте следующий код:
public function up()
{
Schema::create('authors', function (Blueprint $table) {
$table->id();
$table->string('name'); // we add this line here
$table->timestamps();
});
}
Любые поля, которые вы добавите здесь, будут добавлены в таблицу авторов в базе данных. Чтобы узнать, какие существуют доступные методы, ознакомьтесь с |/Документация Laravel .
Теперь давайте сделаем то же самое для книг: php artisan make:модель книги -mcr .
Затем перейдите в database/migrations/XXXXX_create_books_table.php и добавьте следующие поля внутри функции вверх :
public function up()
{
Schema::create('books', function (Blueprint $table) {
$table->id();
$table->foreignId('author_id');
$table->string('title');
$table->decimal('price', 6, 2)->nullable();
$table->timestamps();
$table->foreign('author_id')
->references('id')
->on('authors')
->onDelete('cascade');
});
}
Здесь мы также добавляем ссылку на автора, который написал книгу с использованием внешнего ключа. После добавления любых других полей, которые вы хотите, вы запускаете миграцию с помощью: php artisan migrate . Если у вас нет ошибок в консоли, хорошая работа! А теперь давайте продолжим.
Нам также необходимо создать связь между авторами и книгами в моделях:
приложение/Автор:
class Author extends Model
{
public function books()
{
return $this->hasMany('App\Book');
}
}
приложение/Книга:
class Book extends Model
{
public function author()
{
return $this->belongsTo('App\Author');
}
}
С их помощью мы можем называть отношения свойствами каждой модели:
$book = Book::first(); // Book instance $book->author; // Author instance $author = Author::first(); // Author instance $author->books; // Collection of Books
Если вы вызовете их с помощью формы “метод”, она вернет вам экземпляр QueryBuilder, и вы сможете использовать его для цепочки других методов, таких как:
$author = Author::first(); // Author instance
$author->books()
->where('published', true)
->get(); // Collection of Books
Заводы и сеялки
Теперь, когда у нас есть настройка базы данных, нам нужны некоторые данные для тестирования API. В реальном мире либо у вас уже будут данные, либо, возможно, вы сможете создать их вручную. Мне нравится использовать фабрики и сеялки, потому что это меньше работы и полезно для автоматизированного тестирования. Давайте создадим фабрику для авторов и для книг:
php artisan make:factory AuthorFactory -m Author Factory created successfully. php artisan make:factory BookFactory -m Book Factory created successfully.
Теперь, если вы зайдете в папку база данных/фабрики , вы увидите оба созданных файла.
В AuthorFactory давайте использовать библиотеку faker для создания случайных данных автора:
$factory->define(Author::class, function (Faker $faker) {
return [
'name' => $faker->name,
];
});
И мы делаем то же самое для книг, с той оговоркой, что они получат идентификатор автора в качестве параметра:
$factory->define(Book::class, function (Faker $faker, $author_id) {
return [
'author_id' => $author_id,
'title' => $faker->sentence,
'price' => $faker->randomFloat(2, 5, 100)
];
});
Теперь мы создаем сеялку для авторов:
php artisan make:seeder AuthorTableSeeder Seeder created successfully.
В этом сеялке (которая находится в база данных/сеялки/Таблица авторов Сеялки ) мы создаем 5 авторов и 5 книг для каждого автора, используя следующий код:
public function run()
{
factory(App\Author::class, 5)->create()
->each(function ($author) {
factory(App\Book::class, 5)->create([
'author_id' => $author->id
]);
});
}
Он вызывает фабрику для модели автора и для каждой созданной создает 5 книг, используя в основном один и тот же синтаксис. Теперь, чтобы закончить, мы назовем эту сеялку в классе DatabaseSeeder:
public function run()
{
$this->call(AuthorTableSeeder::class);
}
Со всеми миграциями, фабриками и сеялками на месте мы запускаем php artisan migrate --seed . Вы должны увидеть список всех выполненных миграций и сеялок.
Маршруты
Нам нужны маршруты для доступа к данным, поэтому мы можем перейти в маршруты/api.php и добавьте их туда. Маршруты, добавленные в этот файл, уже будут иметь /api добавляется к маршруту, так что имейте это в виду. Я хочу увидеть список авторов, список книг и некоторые подробности о конкретной книге. Итак, я могу начать с добавления этих трех маршрутов в конце файла:
Route::resource('authors', 'AuthorController')->only('index');
Route::resource('books', 'BookController')->only(['index', 'show']);
Теперь, поскольку мы создали контроллер ресурсов в начале этого урока, теперь мы можем использовать статический метод маршрута ресурс . Вы передаете в качестве аргументов название маршрута и контроллер для сопоставления каждого из этих семи маршрутов:
- Индекс
- Создавать
- Магазин
- Покажите
- Редактировать
- Обновление
- Удалить
Если вы перейдете к контроллерам, вы увидите, что все эти методы находятся там. Поскольку мы разрабатываем Rest API, нам даже не понадобится маршрут для создания и редактирования, потому что они предназначены для возврата представления с формами для создания и редактирования ресурса соответственно. Как указывалось ранее, нам нужен только список авторов, список книг и подробная информация о конкретной книге, поэтому мы используем метод only() для ограничения маршрутов ресурсов.
Конечно, нам не нужен был весь этот код котельной, поэтому мы могли бы создать каждый из этих маршрутов и методов с нуля, но я хотел показать вам эти методы, потому что они экономят ваше время в повседневной жизни.
Теперь давайте реализуем index() в AuthorController, поэтому перейдите к app/Http/Controllers/AuthorController.php и добавьте этот код:
public function index()
{
$authors = Author::all();
return response()->json($authors);
}
Поскольку у нас всего 5 авторов (созданных сеялкой, помните?), нам даже не понадобится разбивка на страницы, поэтому давайте запросим всех авторов.
В BookController нам нужно реализовать index() для списка книг и show() для подробной информации о конкретной книге:
public function index()
{
$books = Book::with('author')->paginate(10);
return response()->json($books);
}
public function show(Book $book)
{
return response()->json($book);
}
Функция with() запрашивает связь и уже возвращает книгу с ее автором.
Строка, которую вы передаете этому методу, должна быть равна имени метода, который вы дали связи в модели Книги.
Поскольку у нас есть по крайней мере 25 книг, давайте каждый раз будем создавать запрос на разбиение на страницы по 10 книг.
В случае show() Laravel уже разрешает идентификатор книги, переданный маршруту, и предоставляет нам экземпляр книги в качестве аргумента.
Теперь, если вы запустите сервер Laravel с помощью php artisan serve , вы можете получить доступ http://localhost:8000/api/authors или http://localhost:8000/api/books в вашем браузере или в приложении, например Почтальон или Бессонница и вы получите ответ JSON, подобный этому:
{
"current_page": 1,
"data": [
{
"id": 1,
"author_id": 6,
"title": "Inventore voluptatem iure veniam quis nesciunt aut.",
"price": "42.19",
"created_at": "2020-05-16T17:39:22.000000Z",
"updated_at": "2020-05-16T17:39:22.000000Z",
"author": {
"id": 6,
"name": "Brandyn Gorczany",
"created_at": "2020-05-16T17:39:22.000000Z",
"updated_at": "2020-05-16T17:39:22.000000Z"
}
},
...
],
"first_page_url": "http:\/\/localhost:8000\/api\/books?page=1",
"from": 1,
"last_page": 3,
"last_page_url": "http:\/\/localhost:8000\/api\/books?page=3",
"next_page_url": "http:\/\/localhost:8000\/api\/books?page=2",
"path": "http:\/\/localhost:8000\/api\/books",
"per_page": 10,
"prev_page_url": null,
"to": 10,
"total": 25
}
Если вы хотите получить доступ к подробной информации о книге, просто перейдите по ссылке http://localhost:8000/api/книги/1 где “1” – идентификатор книги, к которой вы хотите получить доступ. Это вернет этот ответ:
{
"id": 1,
"author_id": 6,
"title": "Inventore voluptatem iure veniam quis nesciunt aut.",
"price": "42.19",
"created_at": "2020-05-16T17:39:22.000000Z",
"updated_at": "2020-05-16T17:39:22.000000Z"
}
Итак, вот оно у вас. Создание Rest API с Laravel не займет слишком много времени, в качестве бонуса у вас уже есть фабрики и сеялки, настроенные для использования в автоматизированных тестах.
Оригинал: “https://dev.to/dberri/how-to-create-a-rest-api-with-laravel-4ch”