Tartalomjegyzék
CakePHP
- Szerző: Sallai András
- Copyright © Sallai András, 2021, 2022, 2023
- Web: https://szit.hu
A CakePHP
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
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:
- src/Controller/EmployeesController.php
public function index() { $employees = $this->Employees->find('all')->all(); $this->set('employees', $employees); $this->viewBuilder()->setOption('serialize', ['employees']); }
Nézzük meg API kliensben:
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:
- src/Application.php
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; } });
Hozzáadás
- src/Controller/EmployeesController.php
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']); }
Végpont | Metódus |
---|---|
api/employees.json | post |
{ "name": "Tagadó Árpád", "city": "Szolnok", "salary": 384 }
Módosítás
- src/Controller/EmployeesController.php
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:
Végpont | Metódus |
---|---|
api/employees/9.json | put |
Amit küldeni kell:
{ "name": "Tagadó Árpád", "city": "Szolnok", "salary": 384 }
Törlés
- src/Controller/EmployeeController.php
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:
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']); });