[[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
]);