Как быстро запустить защищенный проект Rest API в Laravel 9?


Создание REST API в LARAVEL 9

Сегодня я расскажу, как можно сделать REST API в Laravel 9. В этом видео я расскажу о CRUD-операциях с использованием REST API.

Установка Laravel 9.

После установки Laravel 9 мы откроем код в редакторе.

Шаг — 1

Создайте модель Post с миграцией.

php artisan make:model Post -m
Войдите в полноэкранный режим Выйдите из полноэкранного режима

Далее обновите файл миграции в папке database/migrations.

<?php

use IlluminateDatabaseMigrationsMigration;
use IlluminateDatabaseSchemaBlueprint;
use IlluminateSupportFacadesSchema;

return new class extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->id();
            $table->string('title');
            $table->longText('description');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('posts');
    }
};

Войти в полноэкранный режим Выйдите из полноэкранного режима

Далее обновите свойство Model fillable в app/models/Post.php.

<?php

namespace AppModels;

use IlluminateDatabaseEloquentFactoriesHasFactory;
use IlluminateDatabaseEloquentModel;

class Post extends Model
{
    use HasFactory;

    protected $fillable = ['title', 'description'];
}

Войдите в полноэкранный режим Выйдите из полноэкранного режима

Шаг — 2

Теперь сгенерируйте контроллер, выполнив команду

php artisan make:controller Api\PostController --model=Post
Войти в полноэкранный режим Выйти из полноэкранного режима

эта команда сгенерирует файл в app/Http/Controllers/Api/PostController.php.

Откройте файл и обновите приведенный ниже код.

<?php

namespace AppHttpControllersApi;

use AppHttpControllersController;
use AppHttpRequestsStorePostRequest;
use AppModelsPost;
use IlluminateHttpRequest;

class PostController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return IlluminateHttpResponse
     */
    public function index()
    {
        $posts = Post::all();

        return response()->json([
            'status' => true,
            'posts' => $posts
        ]);
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return IlluminateHttpResponse
     */
    public function create()
    {
        //
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  IlluminateHttpRequest  $request
     * @return IlluminateHttpResponse
     */
    public function store(StorePostRequest $request)
    {
        $post = Post::create($request->all());

        return response()->json([
            'status' => true,
            'message' => "Post Created successfully!",
            'post' => $post
        ], 200);
    }

    /**
     * Display the specified resource.
     *
     * @param  AppModelsPost  $post
     * @return IlluminateHttpResponse
     */
    public function show(Post $post)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  AppModelsPost  $post
     * @return IlluminateHttpResponse
     */
    public function edit(Post $post)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  IlluminateHttpRequest  $request
     * @param  AppModelsPost  $post
     * @return IlluminateHttpResponse
     */
    public function update(StorePostRequest $request, Post $post)
    {
        $post->update($request->all());

        return response()->json([
            'status' => true,
            'message' => "Post Updated successfully!",
            'post' => $post
        ], 200);
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  AppModelsPost  $post
     * @return IlluminateHttpResponse
     */
    public function destroy(Post $post)
    {
        $post->delete();

        return response()->json([
            'status' => true,
            'message' => "Post Deleted successfully!",
        ], 200);
    }
}
Вход в полноэкранный режим Выйти из полноэкранного режима

Шаг — 3

Теперь давайте создадим запрос для проверки данных, выполнив команду ниже.

php artisan make:request StorePostRequest
Войти в полноэкранный режим Выйти из полноэкранного режима

Теперь откройте файл app/Http/Requests/StorePostRequest.php и обновите приведенный ниже код.

<?php

namespace AppHttpRequests;

use IlluminateFoundationHttpFormRequest;

class StorePostRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            "title" => "required|max:70",
            "description" => "required"
        ];
    }
}
Вход в полноэкранный режим Выйти из полноэкранного режима

Шаг — 4

Теперь создайте маршруты API в routes/api.php.

<?php

use AppHttpControllersApiPostController;
use IlluminateHttpRequest;
use IlluminateSupportFacadesRoute;


Route::apiResource('posts', PostController::class);

Войти в полноэкранный режим Выйдите из полноэкранного режима

Теперь запустите приложение и откройте URL в postman.
Результаты будут выглядеть следующим образом.

Сделайте аутентификацию REST API в LARAVEL 9 С ПОМОЩЬЮ LARAVEL SANCTUM

Laravel Sanctum предоставляет легкую систему аутентификации для SPA (одностраничных приложений), мобильных приложений и простых API на основе токенов.

Этапы установки

Если вы не используете LARAVEL 9, вам необходимо установить LARAVEL Sanctum. В противном случае вы можете пропустить шаг установки.

Шаг 1

Установка через composer

composer require laravel/sanctum
Войдите в полноэкранный режим Выйдите из полноэкранного режима

Шаг 2

Публикация поставщика услуг Sanctum

php artisan vendor:publish --provider="LaravelSanctumSanctumServiceProvider"
Войти в полноэкранный режим Выйти из полноэкранного режима

Шаг 3

Перенести базу данных

php artisan migrate
Войдите в полноэкранный режим Выйти из полноэкранного режима

ИСПОЛЬЗОВАНИЕ SANCTUM В LARAVEL

Пользовательский HasApiTokens трейт в AppModelsUser

Для того чтобы использовать Sanctum, нам необходимо использовать класс трейта HasApiTokens в модели пользователя.
Модель пользователя должна выглядеть следующим образом.

<?php

namespace AppModels;

use IlluminateContractsAuthMustVerifyEmail;
use IlluminateDatabaseEloquentFactoriesHasFactory;
use IlluminateFoundationAuthUser as Authenticatable;
use IlluminateNotificationsNotifiable;
use LaravelSanctumHasApiTokens;

class User extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array<int, string>
     */
    protected $fillable = [
        'name',
        'email',
        'password',
    ];

    /**
     * The attributes that should be hidden for serialization.
     *
     * @var array<int, string>
     */
    protected $hidden = [
        'password',
        'remember_token',
    ];

    /**
     * The attributes that should be cast.
     *
     * @var array<string, string>
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];
}
Вход в полноэкранный режим Выход из полноэкранного режима

Маршруты аутентификации API

Создайте AuthController для обработки всех маршрутов аутентификации, связанных с API

php artisan make:controller Api\AuthController
Вход в полноэкранный режим Выйти из полноэкранного режима

В файле routesapi.php обновите API

Route::post('/auth/register', [AuthController::class, 'createUser']);
Route::post('/auth/login', [AuthController::class, 'loginUser']);
Войти в полноэкранный режим Выйдите из полноэкранного режима

Теперь обновите AuthContoller с

<?php

namespace AppHttpControllersApi;

use AppModelsUser;
use IlluminateHttpRequest;
use AppHttpControllersController;
use IlluminateSupportFacadesAuth;
use IlluminateSupportFacadesHash;
use IlluminateSupportFacadesValidator;

class AuthController extends Controller
{
    /**
     * Create User
     * @param Request $request
     * @return User 
     */
    public function createUser(Request $request)
    {
        try {
            //Validated
            $validateUser = Validator::make($request->all(), 
            [
                'name' => 'required',
                'email' => 'required|email|unique:users,email',
                'password' => 'required'
            ]);

            if($validateUser->fails()){
                return response()->json([
                    'status' => false,
                    'message' => 'validation error',
                    'errors' => $validateUser->errors()
                ], 401);
            }

            $user = User::create([
                'name' => $request->name,
                'email' => $request->email,
                'password' => Hash::make($request->password)
            ]);

            return response()->json([
                'status' => true,
                'message' => 'User Created Successfully',
                'token' => $user->createToken("API TOKEN")->plainTextToken
            ], 200);

        } catch (Throwable $th) {
            return response()->json([
                'status' => false,
                'message' => $th->getMessage()
            ], 500);
        }
    }

    /**
     * Login The User
     * @param Request $request
     * @return User
     */
    public function loginUser(Request $request)
    {
        try {
            $validateUser = Validator::make($request->all(), 
            [
                'email' => 'required|email',
                'password' => 'required'
            ]);

            if($validateUser->fails()){
                return response()->json([
                    'status' => false,
                    'message' => 'validation error',
                    'errors' => $validateUser->errors()
                ], 401);
            }

            if(!Auth::attempt($request->only(['email', 'password']))){
                return response()->json([
                    'status' => false,
                    'message' => 'Email & Password does not match with our record.',
                ], 401);
            }

            $user = User::where('email', $request->email)->first();

            return response()->json([
                'status' => true,
                'message' => 'User Logged In Successfully',
                'token' => $user->createToken("API TOKEN")->plainTextToken
            ], 200);

        } catch (Throwable $th) {
            return response()->json([
                'status' => false,
                'message' => $th->getMessage()
            ], 500);
        }
    }
}
Войти в полноэкранный режим Выйти из полноэкранного режима

Для защиты API с помощью аутентификации нам необходимо использовать промежуточное ПО auth:sanctum.

Route::apiResource('posts', PostController::class)->middleware('auth:sanctum');
Войти в полноэкранный режим Выйти из полноэкранного режима

Вот результаты.

Полное руководство приведено ниже на видео.

Если вы столкнулись с какой-либо проблемой при создании REST API, пожалуйста, прокомментируйте ваш запрос.

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

Свяжитесь со мной.
Twitter
Instagram
Канал YouTube TechToolIndia

Оцените статью
Procodings.ru
Добавить комментарий