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