[[oktatas:web:back-end_framework|< Back-end framework]]
====== CakePHP ======
* **Szerző:** Sallai András
* Copyright (c) Sallai András, 2021, 2022, 2023
* Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC Attribution-Share Alike 4.0 International]]
* Web: https://szit.hu
===== A CakePHP =====
Gyors, letisztult, könnyen használható PHP keretrendszer.
Webhely:
* https://cakephp.org/
===== Kezdés =====
Szükségünk van a composer-re.
Projekt készítése:
composer create-project --prefer-dist cakephp/app:~4.3 projekt01
Projekt létrehozása az aktuális könyvtárba:
composer create-project --prefer-dist cakephp/app:~4.3 .
Egyszerűen:
composer create-project cakephp/app app01
===== Könyvtársturktúra =====
app01/
|-bin/
|-config/
|-logs/
|-plugins/
|-resources/
|-src/
| |-Console/
| |-Controller/
| |-Model/
| `-View/
|-templates/
|-tests/
|-tmp/
|-vendor/
|-webroot/
|-composer.json
|-index.php
|-phpcs.xml
|-phpstan.neon
|-phpunit.xml.dist
`-README.md
===== Fejlesztői szerver =====
bin/cake server
Van egy alap weblap:
* http://localhost:8765/
===== Adatbázis =====
Létre kell hozni az adatbázist, táblákkal együtt.
create database app01
character set utf8
collate utf8_hungarian_ci;
grant all privileges
on app01.*
to app01@localhost
identified by 'titok';
A CakePHP-ban az adatbázisban hozzuk létre a táblát, a ORM ebből készít
osztályt.
create table employees (
id int not null primary key auto_increment,
name varchar(50),
city varchar(50),
salary double
);
===== Adatbázis elérése =====
==== app_local.php ====
Másik lehetőség az app_local.php fájl szerkesztése.
Szerkesszük a **config/app_local.php** állományt.
'default' => [
'host' => 'localhost',
'username' => 'app01',
'password' => 'titok',
'database' => 'app01',
'url' => env('DATABASE_URL', null),
],
===== Generálás =====
Generáljunk modellt és kontrollert:
bin/cake bake model employees
A modell létrehozásához előbb létre kell hozni az adatbázist
a táblával együtt. A modell létrejön a tábla alapján.
Létrejön az src/Model/Entity/Employee.php fájl.
Hozzuk létre a kontrollert:
bin/cake bake controller employees
Létrejön az src/Controller/EmployeeController.php fájl.
===== Routing =====
Szerkesszük a routingot:
// config/routes.php
//...
$routes->scope('/api', function (RouteBuilder $builder) {
$builder->setExtensions(['json']);
$builder->resources('Employees');
});
A routingot most API számára állítottuk be.
===== Összes lekérdezése =====
Szerkesszük a kontrollert:
public function index()
{
$employees = $this->Employees->find('all')->all();
$this->set('employees', $employees);
$this->viewBuilder()->setOption('serialize', ['employees']);
}
Nézzük meg API kliensben:
* http://localhost:8765/api/employees.json
^ Végpont ^ Metódus ^
| api/employees.json | get |
===== CSRF token beállítása =====
A POST, PUT, PATCH, DELETE metódusoknak CSRF tokenhez vannak kötve.
Az eredeti CSRF beállítást finomítjuk:
public function middleware(MiddlewareQueue $middlewareQueue): MiddlewareQueue
{
$middlewareQueue
->add(new ErrorHandlerMiddleware(Configure::read('Error')))
->add(new AssetMiddleware([
'cacheTime' => Configure::read('Asset.cacheTime'),
]))
->add(new RoutingMiddleware($this))
->add(new BodyParserMiddleware()); //Hamarabb lezárjuk a láncot
//Az útvonal kizárása:
$csrf = new CsrfProtectionMiddleware();
$csrf->skipCheckCallback(function ($request) {
if ($request->getParam('_matchedRoute') == '/api/employees') {
return true;
}
});
$middlewareQueue->add($csrf);
return $middlewareQueue;
}
Az összes /api kezdetű végpontot is megadhatunk:
$csrf->skipCheckCallback(function ($request) {
$endpoint = $request->getParam('_matchedRoute');
if ( preg_match('/^\/api/', $endpoint)) {
return true;
}
});
* https://book.cakephp.org/4/en/security/csrf.html#skipping-csrf-checks-for-specific-actions (2023)
===== Hozzáadás =====
public function add()
{
$this->request->allowMethod(['post']);
$employee = $this->Employees->newEntity($this->request->getData());
if ($this->Employees->save($employee)) {
$message = 'Saved';
} else {
$message = 'Error';
}
$this->set([
'message' => $message,
'employee' => $employee,
]);
$this->viewBuilder()->setOption('serialize', ['employee', 'message']);
}
* http://localhost:8765/api/employees.json
^ Végpont ^ Metódus ^
| api/employees.json | post |
{
"name": "Tagadó Árpád",
"city": "Szolnok",
"salary": 384
}
===== Módosítás =====
public function edit($id = null)
{
$this->request->allowMethod(['put']);
$employee = $this->Employees->get($id);
$employee = $this->Employees->patchEntity($employee, $this->request->getData());
if ($this->Employees->save($employee)) {
$message = 'Saved';
} else {
$message = 'Error';
}
$this->set([
'message' => $message,
'employee' => $employee,
]);
$this->viewBuilder()->setOption('serialize', ['employee', 'message']);
}
Ha a 9-s dolgozó adatait frissítjük:
* http://localhost:8765/api/employees/9.json
^ Végpont ^ Metódus ^
| api/employees/9.json | put |
Amit küldeni kell:
{
"name": "Tagadó Árpád",
"city": "Szolnok",
"salary": 384
}
===== Törlés =====
public function delete($id)
{
$this->request->allowMethod(['delete']);
$employee = $this->Employees->get($id);
$message = 'Deleted';
if (!$this->Employees->delete($employee)) {
$messge = 'Error';
}
$this->set('message', $message);
$this->viewBuilder()->setOption('serialize', ['message']);
}
Delete metódussal küldünk kérést, például a 9 dolgozó törlése esetén a következő címre:
* http://localhost:8765/api/employees/9.json
^ Végpont ^ Metódus ^
| api/employees/9.json | delete |
===== A routing szétbontása =====
$routes->scope('/api', function (RouteBuilder $builder) {
$builder->setExtensions(['json', 'xml']);
$builder->get('/employees', ['controller' => 'Employees', 'action' => 'index']);
$builder->post('/employees', ['controller' => 'Employees', 'action' => 'add']);
});
===== Linkek =====
* https://book.cakephp.org/4/en/development/configuration.html (2023)
* https://book.cakephp.org/4/en/development/rest.html (2023)
* https://book.cakephp.org/4/en/development/routing.html (2023)