[[oktatas:web:back-end_framework:laravel:laravel_rest_api|< Laravel REST API]] ====== Laravel REST API kezdés ====== * **Szerző:** Sallai András * Copyright (c) 2023, Sallai András * Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC Attribution-Share Alike 4.0 International]] * Web: https://szit.hu ===== Projekt létrehozása ===== Hozzuk létre a projektet: composer create-project laravel/laravel app01 ===== Projekt indítása ===== Lépjünk be könyvtárba, majd indítsuk el a szervert: cd app01 php artisan serve ===== Adatbázis ===== ==== MariaDB/MySQL ==== Hozzuk létre az adatbázis: create database emp character set utf8 collate utf8_hungarian_ci; grant all privileges on emp.* to emp@localost identified by 'titok'; Szerkesszük a .env fájlt. Állítsuk be az adatbázishoz tartozó adatokat: DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=laravel DB_USERNAME=root DB_PASSWORD= ==== SQLite ==== Vegyük fel az sqlite beállítást, tegyük megjegyzésbe a mysql adatbázis bejegyzést: DB_CONNECTION=sqlite # DB_CONNECTION=mysql # DB_HOST=127.0.0.1 # DB_PORT=3306 # DB_DATABASE=laravel # DB_USERNAME=root # DB_PASSWORD= Hozzunk létre a database könyvtárban egy database.sqltie üres állományt. * database/database.sqlite ===== Model, migráció és kontroller ===== Model, migrációs fájl és a kontroller létrehozása: php artisan make:model Employee --migration --controller --api A --api hatására létrehozza a következő metódusokat: * index() * store(Request $request) * show(Employee $employee) * update(Request $request, Employee \$employee) * destroy(Employee $employee) Model, migrációs fájl és kontroller létrehozása rövid kapcsolókkal. php artisan make:model Employee -mc --api ===== Migrációs fájl ===== Függvénnyel megadható mezők rövid listája: * binary() * id() * char() * year() * double() * float() * integer() * date() * string() * text() * time() * timestamp() * tinyText() * boolean() * dateTime() * tinyInteger() $table->increments('id'); $table->string('name', 50); $table->string('city', 50)->nullable(); $table->double('salary')->nullable(); $table->date('birth')->nullable(); $table->integer('rank_id')->unsigned()->nullable(); $table->binary('image')->nullable(); Az összes mezőtípus elérhető [[https://laravel.com/docs/9.x/migrations#available-column-types|itt]] ==== Migrációs fájl kiegészítése ==== Tegyük fel, hogy egy ilyen fájl jön létre: * database/migrations/2022_04_16_152020_create_employees_table.php Szerkesszük a fájlt. public function up() { Schema::create('employees', function (Blueprint $table) { $table->id(); $table->timestamps(); }); } Az up() függvény: public function up() { Schema::create('employees', function (Blueprint $table) { $table->increments('id'); $table->string('name', 50); $table->string('city', 50); $table->decimal('salary', 5, 2); $table->timestamps(); }); } Készítsük el az adatbázist: php artisan migrate ==== Kész táblák frissítése ==== php artisan migrate:refresh A parancs törli a meglévő adatokat. Ha szeretnénk megőrizni az adatokat, akkor külön migrációs fájlba írjuk le a változásokat és csak azt hajtsuk végre. ==== Migráció visszavonása ==== Utolsó migráció visszavonás php artisan migrate:rollback Összes migráció visszavonása: php artisan migrate:reset ===== Fillable ===== Biztonsági okokból alapértelmezetten minden mező kitöltése tiltott. Engedélyezzük a kitöltendő mezőket a modellben. Nélküle nem lehetséges műveletek: create, update. Szerkesszük: * app/Http/Models/Employee.php Szúrjuk be a következő sort: protected $fillable = ['name', 'city', 'salary']; A teljes Employee.php: ===== A kontroller fejlesztése ===== A következő fájlt kell szerkeszteni: * app/Http/Controllers/EmployeeController.php ==== Eredeti ==== public function index() { } public function store(Request $request) { } public function show(Employee $employee) { } public function update(Request $request, Employee $employee) { } public function destroy(Employee $employee) { } ==== Fejlesztés ==== Vegyük használatba az Employee modellt. Az Employee model segítségével elvégezhetők a CRUD műveletek. Ügyeljünk arra, hogy az Employee modellben a $fillable tömb legyen kitöltve. //... use App\Models\Employee; //... public function index() { return Employee::all(); } public function store(Request $request) { return Employee::create($request->all()); } public function show($id) { return Employee::find($id); } public function update(Request $request, $id) { $employee = Employee::find($id); $employee->update($request->all()); return $employee; } public function destroy($id) { return Employee::destroy($id); } ==== A response() függvény ==== Ajánlott a visszaadott értéket a **response()** függvénybe zárni: public function index() { return response(Employee::all()); } Így visszaadhatunk **visszatérési kódot**, beállíthatjuk a visszatérés típusát. public function index() { return response(Employee::all(), 200) ->header('Content-Type', 'application/json'); } Használhatjuk a setStatusCode() függvényt is: public function index() { $employees = Employee::all(); return response()->json([ 'success' => true, 'employees' => $employees ])->setStatusCode(200); } Külön változó: public function index() { $employees = Employee::all(); $response = [ 'success' => true, 'employees' => $employees ]; return response() ->json($response) ->setStatusCode(200); } Link: * https://laravel.com/docs/10.x/responses (2023) ===== JSON ===== public function index() { $employees = Employee::all(); return response()->json($employees); } public function index() { $employees = Employee::all(); return response()->json($employees, 200); } public function index() { $employees = Employee::all(); return response()->json([ 'success' => true, 'employees' => $employees ], 200); } ===== Router ===== use App\Http\Controllers\EmployeeController; //... Route::get('employees', [EmployeeController::class, 'index']); Route::post('employees', [EmployeeController::class, 'store']); Route::get('employees/{id}', [EmployeeController::class, 'show']); Route::put('employees/{id}', [EmployeeController::class, 'update']); Route::delete('employees/{id}', [EmployeeController::class, 'destroy']); ===== Validation ===== public function store(Request $request) { $request->validate([ 'name' => 'required', 'city' => 'required', 'salary' => 'required' ]); $employee = new Employee; $employee->name = $request->name; $employee->city = $request->city; $employee->salary = $request->salary; $employee->save(); return response($employee, 201); } Validációs lehetőségek [[https://laravel.com/docs/9.x/validation#available-validation-rules|itt]] ===== Cors ===== A Cors következő helyen állítható: * config/cors.php Alapértelmezetten minden engedélyezve van. ===== Admin felhasználó ===== ==== Seeder használata ==== php artisan make:seeder AdminSeeder A database/seeders/AdminSeeder.php fájlban: use App\Models\User; //... public function run() { User::create([ 'name' => 'admin', 'email' => 'admin@zold.lan', 'email_verified_at' => now(), 'password' => bcrypt('titok') ]); } //... A Seeder futtatása: php artisan db:seed --class=AdminSeeder ==== is_admin mező esetén ==== use App\Models\User; //... public function run() { User::create([ 'name' => 'admin', 'email' => 'admin@zold.lan', 'email_verified_at' => now(), 'is_admin' => 1, 'password' => bcrypt('titok') ]); } //... ==== Tinker használata ==== Indítsuk el a tinkert: php artisan tinker Másoljuk be: User::create(['name' => 'admin', 'email' => 'admin@zold.lan', 'email_verified_at' => now(), 'password' => bcrypt('titok')]); Felhasználó keresése: App\Models\User::find(1); Az összes lekérdezése: App\Models\User::all(); Felhasználó törlése: App\Models\User::find(2)->delete(); ===== Függelék ===== ==== Segítség ==== A kontrollerben információk kiíratása: echo "
";
print_r($request->file());




dd($request);