[[oktatas:web:back-end_framework:leaf|< Leaf]] ====== Leaf minimális ====== * **Szerző:** Sallai András * Copyright (c) 2024, Sallai András * Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC BY-SA 4.0]] * Web: https://szit.hu ===== Projekt készítése ===== mkdir app01 cd app01 ===== A leaf telepítése ===== Telepítjük az aktuális könyvtárba a Leaf-t a vendor könyvtárba. composer require leafs/leaf A parancs után létrejön egy **vendor** nevű könyvtár. A leaf ebbe könyvtárba kerül függőségként. ===== Szoftver ===== Szükségünk van egy $app objektumra, amivel létrehozhatjuk az útválsztást: get('/msg', function() use($app) { $app->response()->json(['msg' => 'Hi!']); }); $app->run(); Az $app objektum helyett használhatjuk az app() függvényt: get('/msg', function() { response()->json(['msg' => 'Hi!']); }); app()->run(); ===== Fejlesztői szerver ===== php -S localhost:8000 -t . ===== Tesztelés ===== Tesztelés HTTPie kliens segítségével: http localhost:8000/msg ===== Controller ===== Hozzunk létre, például a projekt gyökérkönyvtárában egy EmplyoeeController.php fájlt: json('műkszik'); } } get('/employees', 'EmployeeController@index'); $app->run(); ===== Külön routing ===== run(); get('/employees', 'EmployeeController@index'); json('műkszik'); } } ===== Adatbázis ===== composer require leafs/db ==== SQLite ==== db()->connect([ 'dbtype' => 'sqlite', 'dbname' => 'db.sqlite', ]); ==== MariaDB ==== // syntax db()->connect('hostname', 'dbnev', 'user', 'titok', 'mysql'); Lekérdezés: $emps = db()->query('SELECT * FROM employees')->all(); drop table if exists employees; create table employees ( id int unsigned not null primary key auto_increment, name varchar(50), city varchar(50), salary double, created_at timestamp default current_timestamp, updated_at timestamp default current_timestamp on update current_timestamp ); ===== CRUD műveletek ===== ==== Kontroller ==== Célszer a kontrollerek számára készíteni egy app/controllers könyvtárat. A TodoController osztályban a konstruktorban állítsuk be az SQLite-t: connect([ 'dbtype' => 'sqlite', 'dbname' => 'db.sqlite' ]); } public function index() { $todos = db()->select('todos')->all(); response()->json($todos); } public function create() { $res = db() ->insert('todos') ->params([request()->body()]) ->execute(); $id = db()->lastInsertId(); $todo = db()->select('todos')->where('id', $id)->first(); response()->json($todo); } public function update($id) { $res = db() ->update('todos') ->params(request()->body()) ->where('id', $id) ->execute(); $todo = db()->select('todos')->where('id', $id)->first(); response()->json($todo); } public function delete($id) { $res = db() ->delete('todos') ->where('id', $id) ->execute(); response()->json($res); } } ==== Útválasztás ==== get('/api/todos', 'TodoController@index'); app()->post('/api/todos', 'TodoController@create'); app()->put('/api/todos/{id}', 'TodoController@update'); app()->delete('/api/todos/{id}', 'TodoController@delete'); ===== Azonosítás ===== ==== Függőség telepítése ==== composer require leafs/auth ==== AuthController ==== connect('', 'db.sqlite', '', '', 'sqlite'); } public function login() { $data = auth()->login([ 'username' => request()->get('username'), 'password' => request()->get('password') ]); response()->json(['auth' => $data]); } public function register() { $data = auth()->register([ 'username' => request()->get('username'), 'password' => request()->get('password') ], ['username']); if(!$data) { $data = auth()->errors(); } response()->json(['auth' => $data]); } } ==== Köztes szoftver ==== connect('', 'db.sqlite', '', '', 'sqlite'); app()->registerMiddleware('auth', function () { $id = auth()->id(); if (!$id) { response()->exit([ 'status' => 'error', 'message' => 'Not authorized' ], 401); } }); ==== Útvonalak védelme ==== get('/api/todos', 'TodoController@index'); app()->post('/api/login', 'AuthController@login'); app()->post('/api/register', 'AuthController@register'); app()->group('/', ['middleware' => 'auth', function () { app()->post('/api/todos', 'TodoController@create'); app()->put('/api/todos/{id}', 'TodoController@update'); app()->delete('/api/todos/{id}', 'TodoController@delete'); }]); ===== Cors ===== composer require leafs/cors vagy: leaf install cors cors(); app()->run(); Beállítás: app()->cors([ 'origin' => 'http://example.com', 'optionsSuccessStatus' => 200 ]);