Ez a dokumentum egy előző változata!
Tartalomjegyzék
Laravel API kezdés
- Szerző: Sallai András
- Copyright © Sallai András, 2021, 2023
- Web: https://szit.hu
Laravel
A Laravel egy PHP alapú keretrendszer.
A jelenlegi 9.x verziónak PHP 8-s verzió szükséges.
Az objektumok tartalmát, ideiglenesen megnézhetjük a dd() függvénnyel. Például:
dd($myclass);
Projekt
Hozzuk létre a projektet:
composer create-project laravel/laravel app01
Lépjünk be könyvtárba, majd indítsuk el a szervert:
php artisan serve
Adatbázis
A database könyvtárban hozzuk létre az SQLite adatbázist, database.sqlite néven, egy üres fájl formájában:
- database/database.sqlite
Szerkesszük a .env fájlt, írjuk bele milyen adatbázist használunk.
- .env
DB_CONNECTION=sqlite
Használható MySQL alapú vagy más adatbázis is.
Routing
Szerkesszük a routes/api.php fájlt:
- routes/api.php
Route::get('/employees', function(){ return 'employees'; }); Route::middleware('auth:sanctum')->get('/user', function (Request $request) { return $request->user(); });
Írjunk egy GET kérést employees végponttal.
Ellenőrzés
Használjuk egy API klienst, például Insomnia, a teszteléshez. Készítsünk egy GET kérést a következő címre:
http://localhost:8000/api/employees
Dolgozók tábla
Hozzuk létre a dolgozók táblát gyártó PHP osztályt:
php artisan make:model Employee --migration
A --migration kapcsoló, létrehozza a migrációs fájlokat.
Szerkesszük a database/migrations/*create_employees_table.php fájlt. A * helyén az aktuális dátum szerepel.
- database/migrations/*create_employees_table.php
//... public function up() { Schema::create('employees', function (Blueprint $table) { $table->id(); $table->string('name'); $table->string('city'); $table->decimal('salary', 5, 2); $table->timestamps(); }); } //...
Hozzuk létre a táblákat:
php artisan migrate
További lehetőségek:
$table->increments('id'); $table->boolean('done'); $table->tinyInteger('status')->default('1');
Tábla frissítése
Ez a művelet törli a tábla tartalmát.
php artisan migrate:refresh
Útválasztás javítása
Vegyük használatba az útválasztóban az Employee osztályt:
- routes/api.php
use App\Models\Employee; //... Route::get('/employees', function(){ return Employee::all(); });
Ellenőrizzük Insomnia-ban:
- Metódus: GET
A tábla üres, de 200-s kódot kell kapjunk.
A post metódus
Szeretnénk új dolgozót felvenni. Ehhez engedélyezzük a name, city és salary mezők megadását:
- app/Models/Employee.php
//... class Employee extends Model { use HasFactory; protected $fillable = [ 'name', 'city', 'salary' ]; }
A routingban beállítunk egy dolgozót:
- routes/api.php
//... Route::post('/employees', function(){ return Employee::create([ 'name' => 'Rágó Ferenc', 'city' => 'Szolnok', 'salary' => 2873000 ]); });
Ellenőrizzük egy POST kéréssel az Insomnia-ban. Nézzük meg az adatbázisban az új dolgozót.
Így most, mindig ezt a felhasználót fogja felvenni. A következő fejezetben megoldjuk, hogy a bejövő HTTP kérésből vegyük a dolgozó adatait.
A dolgozó kontroller
Hozzunk létre egy Employee nevű kontrollert:
php artisan make:controller EmployeeController --resource --api
Kapcsolók:
- A --resource hatására létrejönnek az alapértelmezett metódusok.
- A --api hatására nem jön létre create és edit metódus.
Szükség van az Employee modellre:
- app/Http/Controller/EmployeeController.php
//... use App\Models\Employee;
Az index függvény:
public function index() { return Employee::all(); }
- routes/api.php
use App\Http\Controllers\EmployeeController; //... Route::get('/products', [EmployeeController::class, 'index']);
Ellenőrizzük API klienssel.
Írjuk meg a store függvényt:
- app/Http/Controller/EmployeeController.php
//... public function store(Request $request) { return Employee::create($request->all()); }
Írjunk hozzá útválasztást:
- routes/api.php
use App\Http\Controllers\EmployeeController; //... Route::get('/products', [EmployeeController::class, 'index']); Route::post('/employees', [EmployeeController::class, 'store']);
Teszteljük API klienssel. JSON tartalmat küldünk. Insomnia esetén figyeljük meg a „Header” fülön, hogy beállításra kerül a „Content-Type” „application/json” fejléc adat.
Validáció beállítása
- app/Http/Controller/EmployeeController.php
//... public function store(Request $request) { $request->validate([ 'name' => 'required', 'salary' => 'required' ]); return Employee::create($request->all()); }
Egyetlen dolgozó lekérdezése
- app/Http/Controller/EmployeeController.php
//... public function show($id) { return Employee::find($id); }
Összes erőforrás
Kezelhetjük az összes végpontot együtt:
- routes/api.php
use App\Http\Controllers\EmployeeController; //... Route::resource('/employees', EmployeeController::class); /* Route::get('/products', [EmployeeController::class, 'index']); Route::post('/employees', [EmployeeController::class, 'store']); */
Ellenőrizzük, milyen router információk vannak:
php artisan route:list
Ellenőrizzük API klienssel. Cím:
http://localhost:8000/api/employees/2
Dolgozó módosítása
- app/Http/Controller/EmployeeController.php
//... public function update(Request $request, $id) { $employee = Employee::find($id); $employee->update($request->all()); return $employee; }
Ellenőrizzük API klienssel.
Dolgozó törlése
- app/Http/Controller/EmployeeController.php
//... public function destroy($id) { return Employee::destroy($id); }
Ellenőrizzük API klienssel.
Siker esetén 1-el tér vissza.
Keresés
- app/Http/Controller/EmployeeController.php
//... public function search($name) { return Employee::where('name', 'like', '%'.$name.'%')->get(); }
Routing szerkesztése:
- routes/api.php
use App\Http\Controllers\EmployeeController; //... Route::get('/employees/search/{name}', [EmployeeController::class, 'search']);
Ellenőrizzük API klienssel.
Például:
http://localhost:8000/api/employees/search/László
Sanctum
A csomagok (package) között található a Sanctum:
- routes/api.php
use App\Http\Controllers\EmployeeController; //... Route::resource('/employees', EmployeeController::class); // Route::get('/employees/search/{name}', [EmployeeController::class, 'search']); // Route::get('/employees', [EmployeeController::class, 'index']); // Route::post('/employees', [EmployeeController::class, 'store']); Route::group(['middleware' => ['auth:sanctum']], function () { Route::get('/employees/search/{name}', [EmployeeController::class, 'search']); }); Route::middleware('auth:sanctum')->get('/user', function (Request $request) { return $request->user(); });
Ellenőrizzük:
http://localhost:8000/api/employees/search/László
A következő hibát kapjuk:
Route [login] not defined.
Állítsuk be fejlécben → „Header” fülön:
Accept application/json
A következő választ kapjuk:
{ "message": "Unauthenticated." }
Auth kontroller
php artisan make:controller AuthController
- app/Http/Controllers/AuthController.php
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Models\User; use Illuminate\Http\Response; use Illuminate\Support\Facades\Hash; use Illuminate\Support\facades\Auth; class AuthController extends Controller { public function register(Request $request) { $fields = $request->validate([ 'name' => 'required|string', 'email' => 'required|string|unique:users,email', 'password' => 'required|string|confirmed' ]); $user = User::create([ 'name' => $fields['name'], 'email' => $fields['email'], 'password' => bcrypt($fields['password']) ]); $token = $user->createToken('sajatToken')->plainTextToken; $response = [ 'user' => $user, 'token' => $token ]; return response($response, 201); } public function login(Request $request) { if( Auth::attempt([ "name" => $request->name, "password" => $request->password ])) { $authUser = Auth::user(); $success[ "token" ] = $authUser->createToken( "myapptoken" )->plainTextToken; $success[ "name" ] = $authUser->name; return response( $success); }else { return response( "Hiba! A bejelentkezés sikertelen", [ "error" => "Hibás adatok" ]); } } public function logout( Request $request ) { auth( "sanctum" )->user()->currentAccessToken()->delete(); return response()->json('Kijelentkezve'); } }
Az AuthController tartalmát, akár be is másolhatjuk, de van egy hivatkozás User osztályra, ezért ne felejtsük el használatba vennei:
use App\Models\User; use Illuminate\Http\Response; use Illuminate\Support\Facades\Hash; use Illuminate\Support\facades\Auth; //...
Regisztrációnál a jelszó elkérhető kétszer:
$validator = Validator::make( $request->all() , [ "name" => "required", "email" => "required", "password" => "required", "confirm_password" => "required|same:password", ]);
Regisztráció
Az api számára is fel kell vennünk felhasználókat az azonosításhoz. Használhatunk hozzá egy REST API klienst, például Insomnia.
Fejléc:
Accept application/json
Ezt küldjük:
{ "name": "mari", "email": "mair@zold.lan", "password": "titok", "password_confirmation": "titok" }
Eredmény:
{ "user": { "name": "mari", "email": "mari@zold.lan", "updated_at": "2021-11-24T19:57:43.000000Z", "created_at": "2021-11-24T19:57:43.000000Z", "id": 3 }, "token": "3|7eBr5iAUPgqQz3lxIFgC72Yh3ERO76g1MyuHNOGD" }
Keresés azonosítással
Insomnia-ban:
- Auth fül
- Kiválasztjuk: Bearer
- Token: 3|7eBr5iAUPgqQz3lxIFgC72Yh3ERO76g1MyuHNOGD
- [Send]
Útválasztás
Route::post('/register', [AuthController::class, 'register']); Route::post('/login', [AuthController::class, 'login']);
Kilépés
- app/Http/Controllers/AuthController.php
//... public function logout(Request $request) { auth()->user()->tokens()->delete(); return [ 'message' => 'Logged out' ]; }
Útválasztás:
- routes/api.php
Route::group(['middleware' => ['auth:sanctum']], function () { Route::get('/employees/search/{name}', [EmployeeController::class, 'search']); Route::post('/logout', [AuthController::class, 'logout']); });
Teszteléshez:
http://localhost:8000/api/logout