laravel

Построение REST API с Laravel

REST (от англ. Representational State Transfer — «передача репрезентативного состояния») является архитектурным методом коммуникаций с использованием HTTP протокола обмена данными. Программный интерфейс приложения (API) – это способ соединения между компьютером или компьютерными программами. Это тип программного интерфейса, предлагающий сервисы другим программам. Если коротко, то api может делать мобильные приложения или другие сервисы, способными общаться с вашим приложением.

В этой заметке я хочу поделиться с вами очень простым путем создания API с использованием Laravel.

Создание проекта

Создайте новый проект или пропустите этот шаг если у вас он уже есть.

composer create-project laravel/laravel laravel-api --prefer-dist

Создание миграций

Установите соединение с базой данных в .env и затем создайте миграцию для таблицы. Здесь я буду использовать таблицу posts в качестве примера.

php artisan make:migration create_posts_table

В файле миграций укажем следующее:

<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreatePostsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
     public function up()
     {
         Schema::create('posts', function (Blueprint $table) {
             $table->id();
             $table->string('title');
             $table->string('slug');
             $table->string('body');
             $table->timestamps();
        });
     }
    /**
     * Reverse the migrations.
     *
     * @return void
     */
     public function down()
     {
         Schema::dropIfExists('posts');
     }
}

Запустим миграцию используя команду php artisan migrate.

Создание моделей и контроллеров

Создадим модель и контроллер следующей командой:

php artisan model Post -c

Запишем функций: all, show, store, update и destroy в контроллер. Все это будет выглядеть следующим образом в нашем PostController:

<?php

namespace App\Http\Controllers;

use App\Models\Post;
use Exception;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;

class PostController extends Controller
{
    public function index()
    {
        try {
            $posts = Post::all();
        } catch (Exception $e) {
            return response()->json([
                'data' => [],
                'message'=>$e->getMessage()
            ], JsonResponse::HTTP_INTERNAL_SERVER_ERROR);
        }

        return response()->json([
            'data' => $posts,
            'message' => 'Succeed'
        ], JsonResponse::HTTP_OK);
    }

    public function show($id)
    {
        try {
            $posts = Post::find($id);
        } catch (Exception $e) {
            return response()->json([
                'data' => [],
                'message'=>$e->getMessage()
            ], JsonResponse::HTTP_INTERNAL_SERVER_ERROR);
        }

        return response()->json([
            'data' => $posts,
            'message' => 'Succeed'
        ], JsonResponse::HTTP_OK);
    }

    public function store(Request $request)
    {
        try {
            $posts = Post::create($request->all());
        } catch (Exception $e) {
            return response()->json([
                'data' => [],
                'message'=>$e->getMessage()
            ], JsonResponse::HTTP_INTERNAL_SERVER_ERROR);
        }

        return response()->json([
            'data' => $posts,
            'message' => 'Succeed'
        ], JsonResponse::HTTP_OK);
    }

    public function update(Request $request, $id)
    {
        try {
            $posts = Post::find($id)
                        ->update($request->all());
        } catch (Exception $e) {
            return response()->json([
                'data' => [],
                'message'=>$e->getMessage()
            ], JsonResponse::HTTP_INTERNAL_SERVER_ERROR);
        }

        return response()->json([
            'data' => $posts,
            'message' => 'Succeed'
        ], JsonResponse::HTTP_OK);
    }

    public function destroy($id)
    {
        try {
            $posts = Post::destroy($id);
        } catch (Exception $e) {
            return response()->json([
                'data' => [],
                'message'=>$e->getMessage()
            ], JsonResponse::HTTP_INTERNAL_SERVER_ERROR);
        }

        return response()->json([
            'data' => $posts,
            'message' => 'Succeed'
        ], JsonResponse::HTTP_OK);
    }
}

Добавьте свойства guarded или fillable в модель Post, потому-что в контроллере мы используем массовое присвоение.

protected $guarded = ['id'];

Работа с маршрутами

Отредактируйте маршруты в файле api.php:

use App\Http\Controllers\PostController;
Route::group(['prefix'=>'post'], function () {
        Route::get('/', [PostController::class, 'index']);
        Route::get('/{id}', [PostController::class, 'show']);
        Route::post('/', [PostController::class, 'store']);
        Route::put('/{id}', [PostController::class, 'update']);
        Route::delete('/{id}', [PostController::class, 'destroy']);
});

Test

Нам нужно приложение для тестирования запросов к API. Для этого подойдет postman или что-либо похожее на него. Скачать postman можно по ссылке.

Get all posts data
Получить все данные поста
Получение данных поста
Получение данных поста
Создание нового поста
Обновление данных поста
Удаление данных поста

Спасибо за прочтение заметки.

To top