Рубрики
Uncategorized

Как создать Rest API с помощью Laravel

Laravel позволяет быстро запускать и запускать API-интерфейсы Rest, которые вы можете использовать для передачи данных на мобильные устройства… Помеченный laravel, php, rest, api.

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”